设计原则: 零 HTTP 框架依赖,纯业务逻辑 最后更新: 2024年11月17日
pkg/
├── agent/ # Agent 核心逻辑
│ ├── agent.go
│ ├── dependencies.go
│ └── workflow/
├── memory/ # 记忆系统
│ ├── semantic.go
│ └── working.go
├── session/ # Session 管理
├── store/ # 持久化
│ ├── interface.go
│ └── json.go
├── backends/ # Backend 抽象层
├── middleware/ # Middleware 系统
├── tools/ # 工具系统
├── provider/ # LLM Provider
├── router/ # 模型路由
├── sandbox/ # 沙箱
└── types/ # 类型定义
aster 提供三种 Agent 类型,灵感来自 DeepAgents 项目:
标准的单 Agent 模式,用于执行独立任务。
config := &types.AgentConfig{
TemplateID: "assistant",
LLMProvider: "openai",
LLMModel: "gpt-4",
}
ag, _ := agent.Create(ctx, config, deps)
result, _ := ag.Chat(ctx, "Hello!")
编排多个子 Agent 的工作流模式:
| Agent 类型 | 执行模式 | 使用场景 |
|---|---|---|
| ParallelAgent | 并行执行所有子 Agent | 多方案比较、并行数据收集 |
| SequentialAgent | 顺序执行子 Agent | 流水线处理、多阶段任务 |
| LoopAgent | 循环执行直到条件满足 | 迭代优化、多轮对话 |
特点:
stream.Reader 的流式接口主从协作模式,用于任务委托和上下文隔离。
洋葱模型的可组合中间件架构:
Request → M1 → M2 → M3 → Handler → M3 → M2 → M1 → Response
↓ ↓ ↓ ↑ ↑ ↑
Before Before Before After After After
type Middleware interface {
Name() string
Priority() int // 0-100: 系统, 100-500: 功能, 500+: 用户
Tools() []tools.Tool
// 双向拦截
WrapModelCall(ctx, req, handler) (*ModelResponse, error)
WrapToolCall(ctx, req, handler) (*ToolCallResponse, error)
// 生命周期钩子
OnAgentStart(ctx, agentID) error
OnAgentStop(ctx, agentID) error
}
统一的存储接口,支持多种后端实现:
type BackendProtocol interface {
ListInfo(ctx, path) ([]FileInfo, error)
Read(ctx, path, offset, limit) (string, error)
Write(ctx, path, content) (*WriteResult, error)
Edit(ctx, path, old, new, replaceAll) (*EditResult, error)
GrepRaw(ctx, pattern, path, glob) ([]GrepMatch, error)
GlobInfo(ctx, pattern, path) ([]FileInfo, error)
}
| Backend | 用途 | 生命周期 | 使用场景 |
|---|---|---|---|
| StateBackend | 内存临时存储 | 会话级 | 临时文件、中间结果 |
| StoreBackend | 持久化存储 | 跨会话 | 知识库、记忆 |
| FilesystemBackend | 真实文件系统 | 永久 | 工作空间文件 |
| CompositeBackend | 路由组合 | - | 混合存储策略 |
// 单一后端
backend := backends.NewStateBackend()
// 组合后端(路由)
composite := backends.NewCompositeBackend(
backends.NewStateBackend(), // 默认
[]backends.RouteConfig{
{Prefix: "/memories/", Backend: storeBackend},
{Prefix: "/workspace/", Backend: fsBackend},
},
)
持久化 Agent 会话和事件历史:
| 存储类型 | 用途 | 特点 |
|---|---|---|
| Memory | 开发/测试 | 无持久化、快速 |
| PostgreSQL | 生产推荐 | JSONB、复杂查询、全文搜索 |
| MySQL 8.0+ | 生产可选 | JSON 类型、InnoDB、高可用 |
功能:
数据模型:
sessions (1) ──<─ (N) session_events
- id, app_name, user_id, agent_id
- status, metadata, timestamps
└─> - id, session_id, invocation_id
- content, actions, metadata
| 工具 | 描述 | 主要用途 |
|---|---|---|
| Read | 读取文件内容 | 支持分页读取 |
| Write | 写入文件 | 覆盖写入 |
| Ls | 列出目录 | 显示大小、时间 |
| Edit | 精确编辑 | 字符串替换 |
| Glob | Glob 匹配 | **/*.go |
| Grep | 正则搜索 | 显示行号、上下文 |
| 工具 | 描述 | 主要用途 |
|---|---|---|
| HttpRequest | HTTP/HTTPS 请求 | GET/POST/PUT/DELETE/PATCH/HEAD |
| WebSearch | Web 搜索 | Tavily API (general/news/finance) |
| 工具 | 描述 | 主要用途 |
|---|---|---|
| task | 任务委托 | 启动子代理执行隔离任务 |
基于 Apple M1, Go 1.21:
| 操作 | 性能 | 内存 | 吞吐量 |
|---|---|---|---|
| Middleware Stack | 36.21 ns/op | 96 B/op | ~27M ops/s |
| Backend Write | 257.9 ns/op | 480 B/op | ~3.8M ops/s |
// 定义协议
type BackendProtocol interface { ... }
// 工厂函数
type BackendFactory func(ctx) (BackendProtocol, error)
// 延迟初始化
backend := factory(ctx)
type Middleware interface {
WrapModelCall(ctx, req, next) (*Response, error)
WrapToolCall(ctx, req, next) (*Response, error)
}
// 自动链式调用
stack := NewStack(middlewares) // 按 Priority 排序
type Middleware interface {
Priority() int // 数值越小优先级越高
}
// 0-100: 系统核心功能
// 100-500: 通用功能(文件、子代理等)
// 500-1000: 业务逻辑
type MyBackend struct {
// 你的存储逻辑
}
func (b *MyBackend) Read(ctx, path, offset, limit) (string, error) {
// 实现读取
}
// ... 实现其他方法
type MyMiddleware struct {
*middleware.BaseMiddleware
}
func NewMyMiddleware() *MyMiddleware {
return &MyMiddleware{
BaseMiddleware: middleware.NewBaseMiddleware("my-middleware", 300),
}
}
func (m *MyMiddleware) Tools() []tools.Tool {
return []tools.Tool{&MyTool{}}
}
func (m *MyMiddleware) WrapToolCall(ctx, req, handler) (*ToolCallResponse, error) {
// 前置处理
log.Printf("Before: %s", req.ToolName)
// 调用下一层
resp, err := handler(ctx, req)
// 后置处理
log.Printf("After: %v", resp.Result)
return resp, err
}
Read, Writefs_*, git_*, api_*// 工具返回结构化错误
return map[string]interface{}{
"ok": false,
"error": "详细错误信息",
"recommendations": []string{
"建议1",
"建议2",
},
}, nil // 不要返回 error,让 LLM 看到错误信息
| 特性 | DeepAgents (Python) | aster (Go) |
|---|---|---|
| Backend Protocol | ✅ 4种 | ✅ 4种 |
| Middleware 栈 | ✅ 洋葱模型 | ✅ 洋葱模型 |
| 文件工具 | ✅ 6个 | ✅ 6个 |
| 自动驱逐 | ✅ | ✅ |
| 子代理 | ✅ | ✅ |
| 性能 | 中等 | 极高 (Go) |
| 内存 | 高 | 低 (Go) |
| 并发 | GIL限制 | 真正并发 (Goroutine) |
版本: v2.0 最后更新: 2024年11月17日