两周前我把 OpenAI 的 Agent SDK 移植成了 Go,两周后我让它"叛变"了

发布于

如果你还记得,我在两周前发布了 OpenAI Agents SDK 的 Go 移植版本 v0.1.0 ([链接](https://www.v2ex.com/t/1223216)),当时的介绍是"OpenAI Agents SDK 的忠实 Go 移植"。今天我可以报告一些进展:根据 3 楼的建议,我在 4 楼承诺的"把野路子裸 JSX 换成正经构建",现在已经实现——现在使用的是 Vite + React + TypeScript,最后的产物依旧能嵌入到单个二进制文件中,部署依然只需一个文件。

这两周我做了哪些变化呢?一句话总结:我停止了对 Python 上游的忠实,经过 151 次提交后,v0.2.0 已经不再是移植产品了。

**“忠实”是怎么变成陷阱的**

随着移植工作的深入,我发现越来越多的地方是在用 Go 试图模拟 Python 的形态:比如 Python 有生命周期钩子,我就得造一套钩子接口;Python 的 run 靠异步任务,我就开后台协程加 channel。虽然能够运行,但这样的处理显得非常别扭——我们必须时刻记得取消 context,同时要担心协程泄漏,还得在文档中解释“这里为什么看起来和 Go 不一样”。

让我感到崩溃的最后一根稻草是流式接口。Go 1.23 引入了 range-over-func 这一特性,我尝试将整个 run 循环封装到迭代器中:range 代表运行,break 代表停止,这样就无需后台协程,也不需要记得取消。改动后我意识到,这种形状是 Python 永远无法提供的——它是 Go 语言的本质特征。

因此,我做了一个决定:不再跟随上游。确立了一份 [spec.md](http://spec.md/) 作为"宪法",现在已经有了 1600 行和 61 节,每个行为决定和理由都记录在案,唯一的规则是:修改行为时必须在同一提交中更新 spec。虽然上游依然可以查看,但只需记录"采纳/不采纳+理由",而不再有跟随的义务。

**顺着这个思路重想了几件事**

会话现在不再是消息列表,而是一棵树。最初的原因是我想实现一个"重新生成"的功能,但发现在列表模型下只能删除历史。改为 append-only 的树结构后,重试变成了放弃一根分支,而非抹去过去,"看看另一个答案"变成了自然而然的功能,Web UI 中现在有个 2/3 ‹ › 切换器。

上下文管理也随之改变:压缩操作不再是改写历史,而是追加一个"检查点"条目——被折叠的内容依然存在,随时可以展开查看。结合"上下文溢出就压缩重试这一轮"的策略,长会话基本不会因为过长而直接失败。

还有一个小功能:当 run 在运行时可以"半路插话"——例如转向当前回合、排队下一轮、或者追加下一个话题,输入的内容不会因为时机不对而丢失。

**两个丢人的故事**

第一个,在 CI 中执行 `go build ./...` 会在源码旁边生成可执行文件,结果 `git add -A` 一下子把一个 18MB 的二进制文件也加进提交历史了。虽然重写历史清理掉了,加了 .gitignore 后自信万无一失——可是几周后又有一个 8.6MB 的文件从仓库根目录溜入,因为 ignore 规则只阻止了子目录中的文件。现在 .git 目录从 73MB 降到了 3.3MB,教训是防呆规则也要防止自己。

第二个,包的门面文档(doc.go)一直标记为"tracking Python SDK v0.17.4",并链接了两个早已删除的符号——尽管已经喊了半个月独立演化,但门牌上仍挂着旧户口。这暴露了一个盲点:代码有编译器,而文档没有。因此我写了一个 verifydocs 工具,嵌入到 CI 中:文档中的代码片段、godoc 链接、Markdown 锚点,都需要"过编译"。上线第一天就抓到了一个真断链。

**关于 AI 协作,说点实话**

在上个帖子中提到,这个项目是我和 Claude Code 共同开发的。这两周的开发方式更为激进:通过大规模重构让它先进行机械化校验(逐个函数对比新旧代码,以确保"纯移动"的承诺是可信的),再分派独立审查任务找茬——更劲爆的一轮审查居然发现了一个上下文泄漏,这是它自己重构时引入的,又被自己的审查抓了出来。我的角色愈发像是"定宪法的人":spec 明确写出行为和理由,人和 AI 都照着做。这样流程是否有效,欢迎批评,我个人觉得比"AI 一把梭然后人肉整理"要体面多了。

其他在这两周落地的功能包括:后台任务(子代理执行任务,完成后自动通知主会话)、沙箱支持的 apply_patch 编辑/持久 shell/命令策略、双向的 MCP(既能接收别人的代理,也能把自己的 Agent 暴露出去)、OpenTelemetry 导出,以及 Web 端的交互式沙箱终端。

repo:[查看 GitHub](https://github.com/zzir/agents-go)

欢迎大家试用,也欢迎批评!

![snapshot](http://pic.zhso.org/2026/07/28/046bc9feb2fb.png)

---

原文链接:[点击查看](https://www.v2ex.com/t/1230538)

评论

暂无评论。

0.053782s