什么是 Codemode

查看原文 HN 讨论

文章摘要

作者是 Flask 的创造者 Armin Ronacher。一年多前他曾写文章劝大家别往上下文里塞自定义工具或 MCP 服务器,而是「多用脚本」,提出过「代码就是你需要的一切」。如今他参与开发的编码代理 Pi 发布 1.0,却通过一种叫 Codemode 的机制加入了 MCP 支持。这篇文章就是解释两者为何并不矛盾,以及 Codemode 到底是什么。

为什么 bash 不够用。 Pi 一直偏爱 CLI 和 bash:命令容易组合,模型在训练中也学会了文件系统的规律(写了 /tmp/test.txt,之后那里就有这个文件)。但 bash 只能组合「能运行的程序」,而有些东西本质上是模型的原生工具,不是程序。比如读取图片:多模态模型不能用 cat 看图,必须由 harness(代理外壳)把图片数据按协议注入给模型;再比如生成和编排子代理,也很难绕开 harness 提供的工具。

「大脑」与「手」。 Ronacher 把系统分成两半:harness 是「大脑」,运行在一台受信任的机器上;工具真正执行的地方(Pi 现在称为「执行环境」)是「手」,两者往往在同一台机器上,但文件系统和信任级别都不同。用 Gondolin 之类的沙箱,可以把 bash 隔离起来,但 harness 本身不在沙箱里。

Codemode 是什么。 它让模型在 harness 这一侧(而不是执行环境那一侧),用一门编程语言来表达和编排复杂操作——本质上就是「在 JavaScript 里发起工具调用」,这样多个调用的组合不必每一步都经过模型的上下文。名字来自 Cloudflare。Pi 的实现运行在 WASM 里的 QuickJS 中,刻意做了限制:没有网络、没有文件系统、没有定时器、内存有限,唯一能做的事就是调用更多工具。它带来几项好处:

文中展示了几段真实会话中由代理生成的代码:调用图像模型生成小狗图片;用 gh 拉取 100 个 GitHub issue,并发交给分类模型 Jev 判断情绪、沮丧程度和类型;甚至让 Jev 驱动一个坦克游戏跑 30 步循环来协助调试;以及直接调用 Sentry MCP 列出各组织的项目。Pi 不把 MCP 工具直接暴露给模型,而是让代理在 Codemode 里先做工具搜索,渐进式地发现能力。

MCP 的现状与诉求。 问题在于很多 MCP 服务器面向的是还不支持 Codemode 的 harness。Cloudflare 的权宜之计是在 MCP 服务器内部再做一层 Codemode,结果变成「Codemode 套 Codemode」:JSON 被双重转义,小模型容易犯迷糊,内层代码也调不到外层工具。Ronacher 对 MCP 生态提出四点期望:返回结构化内容(善用 outputSchema);结果格式保持一致,别因为条数多少而改变输出(否则 5 条探查成功、满批量时却失败);支持大体积二进制数据;以及支持可在多个服务器间组合的工具搜索。

结论。 他认为这并没有推翻一年前的观点——MCP 生态恰恰接受了「代码才是有效的方式」。但仍有未解决的问题:Codemode 的持久性(也许要借鉴持久化工作流引擎做快照,或者改用确定性更强的 Starlark)、图片和二进制数据的处理,以及它在小模型上效果不佳。

HN 评论精华

讨论有相当一部分偏向「这篇文章没把 Codemode 讲清楚」,其余则围绕「为什么是 JavaScript 而不是 bash」以及小模型上的实际效果。

文章到底讲清楚了没有

为什么用 JavaScript 而不是 bash

实际体验