本计划基于 DESIGN.md,将设计拆解为可执行、可勾选的任务。 原则:严格按里程碑顺序推进,每个里程碑结束需通过「验收标准」才进入下一阶段。
目标:命令行读 stdin → eino ReactAgent → 流式打印输出,跑通 Agent 循环与工具调用。
- 初始化
go.mod,引入 eino、eino-ext 依赖 - 搭建项目骨架目录(
cmd/、internal/agent/、internal/tools/、internal/llm/) - 接入一个 ChatModel(OpenAI 兼容,读环境变量配 API key/base_url)
- 用
utils.NewTool实现一个假工具get_time - 用
react.NewAgent组装 Agent,挂上假工具 - 实现 stdin 读取 →
agent.Stream()→StreamReader.Recv()循环打印 - 验收:输入「现在几点」,模型能调用
get_time并基于结果回答
目标:实现四个核心工具,Agent 能真实操作文件与系统(隔离目录测试)。
-
read_file:读取文件内容 -
write_file/edit_file:创建与编辑文件 -
run_shell:执行 shell 命令并捕获 stdout/stderr/exit code -
http_request:发起 HTTP 请求(用于联网/API) - 统一工具的入参 schema(JSON Schema)与错误返回格式
- 验收:在隔离临时目录,让 Agent 完成「创建文件→写内容→shell 验证」的连续任务
目标:危险工具(shell、写文件)执行前需授权,先用命令行 y/n 验证。
- 设计权限三态:自动允许 / 单次确认 / 拒绝
- 在工具执行前插入「权限网关」拦截层
- 区分工具风险等级(只读工具默认放行,写/执行类需确认)
- 命令行实现 y/n 交互确认
- 拒绝时把「用户拒绝」结果回传给 Agent,使其能调整策略
- 验收:run_shell 触发确认弹窗;拒绝后 Agent 不执行且能继续对话
目标:bubbletea 替换命令行交互,实现流式渲染与工具确认弹窗。
- 搭建 bubbletea Model(输入框 + 消息流视图)
- 设计 Agent→TUI 的事件 channel(文本片段/工具调用/工具结果)
- 用
tea.Cmd从 channel 读事件并转tea.Msg - 实现流式打字机渲染效果
- 实现工具确认弹窗,替换 M2 的命令行 y/n
- 解决工具确认阻塞:工具持「请求授权 channel」+「接收结果 channel」,排查死锁
- 验收:完整对话在 TUI 中流式呈现;工具确认通过弹窗交互,无卡死
目标:配置文件驱动,支持运行时切换模型 provider。
- 设计配置文件(provider、API key、base_url、工具开关)
- 抽象 provider 工厂:openai / ark(豆包)/ claude / ollama
- 按模型差异配置
StreamToolCallChecker(Claude 先吐文本) - 运行时切换模型的命令/快捷键
- 引入
MessageRewriter做长对话上下文压缩 - 验收:同一会话切换两个不同 provider 均能正常工具调用与流式输出
目标:接入 MCP 客户端,支持挂载外部工具。
- 引入 eino-ext 的 MCP 工具适配
- 实现 MCP server 连接配置(stdio / SSE)
- 把 MCP server 暴露的工具桥接为 eino tool 并注册进 Agent
- MCP 工具同样纳入 M2 权限网关
- 验收:配置一个外部 MCP server,其工具能被 Agent 正常发现并调用
| 风险 | 触发阶段 | 缓解 |
|---|---|---|
| TUI 与流式异步桥接复杂 | M3 | M0/M1 完全不碰 TUI,孤立到 M3 处理 |
| 工具确认阻塞导致死锁 | M3 | 双 channel 模式,严格测试拒绝/超时路径 |
| 多模型 tool call 流式差异 | M4 | 逐 provider 配置 StreamToolCallChecker |
| 长对话上下文超限 | M4+ | MessageRewriter 压缩 |