基于 Eino 框架和 Claude API 构建的 AI Coding Agent,参考 learn-claude-code 项目架构,使用 Go 语言从零实现。
模型即 agent,代码是 harness。 Agent 的能力来自模型训练,代码提供工具、知识、上下文管理和权限控制。
| 类别 | 工具 | 说明 |
|---|---|---|
| 基础文件操作 | bash, read_file, write_file, edit_file |
Shell 命令执行、文件读写编辑 |
| 任务清单 | TodoWrite |
多步骤任务跟踪,支持 pending/in_progress/completed 状态 |
| 子 agent | task |
生成子 agent 处理子任务,独立上下文,共享文件系统 |
| 技能加载 | load_skill |
两层知识注入:系统提示描述 + 按需加载完整内容 |
| 上下文压缩 | compress |
三层压缩管线:micro_compact + auto_compact + 手动压缩 |
| 后台执行 | background_run, check_background |
异步命令执行,通知队列驱动 |
| 任务管理 | task_create, task_get, task_update, task_list |
文件持久化任务系统,支持依赖图和自动解锁 |
| 团队协作 | spawn_teammate, list_teammates, send_message, read_inbox, broadcast |
持久化队友 + JSONL 消息总线 |
| 协议 | shutdown_request, plan_approval |
请求-响应关联模式,支持关闭和计划审批 |
| 自治 | idle, claim_task |
工作/空闲两阶段生命周期,自动认领任务 |
| 工作树隔离 | task_bind_worktree, worktree_create, worktree_list, worktree_status, worktree_run, worktree_remove, worktree_keep, worktree_events |
Git worktree 隔离执行,控制平面 + 执行平面 |
| 命令 | 说明 |
|---|---|
/compact |
手动触发对话压缩 |
/tasks |
列出所有任务 |
/team |
列出所有队友 |
/inbox |
查看收件箱 |
q / exit |
退出 |
- Go 1.22+
- Anthropic API Key
# 克隆仓库
git clone https://github.com/YOUR_USERNAME/eino_code.git
cd eino_code
# 设置环境变量
export ANTHROPIC_API_KEY="sk-ant-..."
export MODEL_ID="claude-sonnet-4-20250514" # 可选,默认值如左
# 可选:自定义 API 端点(代理/转发)
export ANTHROPIC_BASE_URL="https://your-proxy.com"
# 运行
go run .set ANTHROPIC_API_KEY=sk-ant-...
set MODEL_ID=claude-sonnet-4-20250514
go run .eino_code/
├── main.go # 入口:REPL + agent 循环 + 全部 29 个工具定义
├── go.mod / go.sum
├── internal/
│ ├── agent/loop.go # 共享工具函数(TruncateStr, EstimateTokens, CompactMessages)
│ ├── background/bg.go # 后台任务管理器(goroutine + channel)
│ ├── messagebus/bus.go # JSONL 消息总线(文件收件箱)
│ ├── skill/skill.go # 技能加载器(YAML frontmatter 解析)
│ ├── task/task.go # 任务管理器(文件持久化 + 依赖图)
│ ├── team/team.go # 队友管理器(goroutine 生命周期)
│ ├── todo/todo.go # 待办管理器(验证 + 渲染)
│ ├── tools/tools.go # GenericTool 封装 + 4 个基础工具
│ └── worktree/worktree.go # Git worktree 管理 + 事件总线
├── .gitignore
├── LICENSE # MIT
└── README.md
本项目以 Eino ADK(Agent Development Kit)为核心框架:
- 主 agent:
adk.NewChatModelAgent+adk.NewRunner管理 agent 循环 - 工具调度:所有工具通过 Eino 的
InvokableTool接口调度(InvokableRun()) - 钩子注入:通过
ChatModelAgentMiddleware接口实现:BeforeModelRewriteState→ 上下文压缩、后台通知注入、收件箱注入AfterModelRewriteState→ 待办提醒注入WrapInvokableToolCall→ 工具调用日志
- 子 agent:同样使用
adk.NewChatModelAgent+adk.NewRunner - 队友 agent:工具通过
DispatchTool()走 EinoInvokableTool标准路径
用户输入 → ADK Runner 接管
→ [BeforeModelRewriteState: micro_compact + auto_compact + 注入通知/收件箱]
→ 调用 LLM (Generate/Stream)
→ [AfterModelRewriteState: 注入待办提醒]
→ ADK 自动执行工具 (InvokableRun)
→ [WrapInvokableToolCall: 日志]
→ 循环直到模型不再请求工具
所有工具实现 Eino 的 InvokableTool 接口,通过 GenericTool 封装:
tools.NewGenericTool("tool_name", "描述",
map[string]*schema.ParameterInfo{...},
func(ctx context.Context, args map[string]any) (string, error) {
// 工具逻辑
return "结果", nil
})| 依赖 | 版本 | 用途 |
|---|---|---|
github.com/cloudwego/eino |
v0.8.13 | Eino 核心框架(schema、组件接口) |
github.com/cloudwego/eino-ext |
v0.1.18 | Claude 模型适配器 |
github.com/anthropics/anthropic-sdk-go |
v1.26.0 | Anthropic Go SDK |
github.com/google/uuid |
latest | UUID 生成 |
- learn-claude-code by shareAI-lab — 原版 Python 实现
- Eino by CloudWeGo (ByteDance) — Go AI 应用框架