相信写代码的人都懂一种冲动:工具用着不顺手,就想着自己造一个。这是开发 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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐