纯 Go 打造的 CLI 版通用型 AI Agent,聊聊 covo-agent 的诞生
相信写代码的人都懂一种冲动:工具用着不顺手,就想着自己造一个。这是开发 covo-agent 的很重要的原因,其实还有另一个原因,为了验证我写的 Agent 框架 covonaut 的功能。
起因是我想写一个 Go Agent 框架
2026 年了,AI Agent 早就不是 PPT 里的概念,而是实打实的可实现的工程了。可在 Go 社区转了一圈后发现一个扎心的事实,Python 那边 agent 框架百花齐放,而 Go 这边能打的屈指可数。勉强有那么几个能看的,要么是从 Python 框架生硬移植过来的,要么还停留在“调 API + for 循环”的玩具阶段,没有上下文压缩、没有像样的工具体系、没有状态管理,更别提生产环境要的容错和可观测性了。
于是我想为什么自己不写一个?
这个念头一旦起来就压不住了。我给自己定了几个硬规矩:
- 零外部依赖:作为 Agent 框架,应该尽可能减少对外部库的依赖,依赖越少,风险越低;
- 纯 Go 实现:要吃尽 Go 的并发和部署红利,一个二进制搞定;
- 生产可用:要能稳定应用在真实场景。
从核心的 agent 循环、工具注册、上下文压缩、重试熔断,到 DAG/Pregel 图引擎、JSONL 会话存储、工作流编排、MCP 桥接,再到 A2A/ACP/AGUI/A2UI 这些 agent 通信协议,以及一个零依赖的终端 UI 引擎……陆陆续续,终于完成了 covonaut 的开发。
写库的过程痛并快乐着,快乐的是每一层都按自己的想法来,痛的是心里根本没底,不知道到底好不好用。
写完框架之后,最大的问题来了
单元测试全绿,覆盖率也很好看,但我清楚这证明不了什么。
一个 agent 框架好不好,不是看 API 设计得多优雅,也不是看测试跑得多快,而是要看它在真实环境里连续跑上几十个来回不会崩溃。工具调用失败要怎么恢复?上下文撑爆了要怎么压缩?流式输出中断了怎么续上?不同模型对不同工具 schema 的兼容性怎么处理?这些问题只有真正的"负载"才能给出答案。
我有两个选择:
一是写几个 demo,跑通 hello world,发篇"我的框架支持 xxx"的帖子。体面,但没营养。
二是吃自己的狗粮(dogfooding),用 covonaut 去打造一个真正的产品,看看体验如何。
我选了后者,于是就有了 covo-agent。
covo-agent 是 covonaut 的头号测试员
covo-agent 是一款跑在终端里的通用型 AI Agent。听起来很简单,但一个真正可用的 Agent 要补齐的东西还有很多:
- 交互体验要好:实现了美观大气的 TUI,流式回复、工具调用状态、会话历史、模型选择器、主题切换……全基于 covonaut 自带的终端 UI 引擎;
- 场景要分开:面向开发的 code 模式和面向日常工作的 general 模式,各有各的工具箱和提示词策略;
- 工具得趁手:文件读写、Shell 执行、代码搜索、补丁应用、Review、测试生成、Git Worktree……你在 covo-agent 里用的 analyze、review、testgen 这些命令,背后全是框架层的工具扩展在做支撑;
- 记忆要持久:会话、记忆、技能、目标、承诺事项、项目级配置……让 Agent 跨会话也能记得住事;
- 安全是底线:审批门、允许/拒绝策略、敏感信息脱敏、沙箱、审计日志、死循环恢复……自动化越强,边界越要清楚,不然就是给自己埋雷;
- 接入要开放:适配了市场上几乎所有大模型协议,不管哪家的大模型,通通可以使用;还能通过 MCP、ACP、LSP、插件和网关跟外部系统协作。
说白了,covo-agent 是 covonaut 的头号用户,也是最全面、最挑剔的测试用例。
闭环之后,covonaut 和 covo-agen 都在成长
框架和产品完成闭环后,就会相互促进成长。
在 covo-agent 中每踩一个坑,几乎都能回馈到 covonaut 上。比如最近打磨 TUI 模型选择器时,我发现输入框的光标编辑体验很差——没有方向键移动、退格只能删末尾、光标还会挤占一个字符位置。追根溯源,是终端 UI 引擎的渲染层不够细。修完产品层的体验,再把光标渲染、差分重绘这些能力补回框架层,两个仓库一起受益。
反过来也一样。covonaut 每升级一版,covo-agent 都能第一时间尝鲜。
这就是狗粮的价值:你不亲自在产品来使用,就永远不知道自己写的框架哪里有问题。
写在最后
有人可能会问:你这不是重复造轮子吗?
我的回答是:如果轮子都是圆的,那确实不必造;但如果我想研究的是"轮子为什么是圆的、圆到什么程度才不颠",那这一步就必须自己走。covonaut 让我把 agent 的每一层都拆开看过、重新装过,covo-agent 则让这一切有了真实的用武之地。
两件事合在一起,就是一句话:先写库,是为了弄明白 agent 该怎么写;再造产品,是为了证明我真的写明白了。
现在,我日常的工作和开发已经离不开 covo-agent 了。如果你也在 Go 生态里找 agent 框架或或者趁手的 agent,欢迎来体验下这两个抗敏,一起把它们打磨得更好。
covo-agent: https://github.com/covoyage/covo-agent
covonaut: https://github.com/covoyage/covonaut
更多推荐


所有评论(0)