边境口岸:一个 AI App 如何雇隔壁的 AI App 干活
英文版:The Border Crossing: How One AI App Puts Another to Work
这个系列的上一篇,讲的是我自己名下几家公司之间怎么协作。好几个 Agent 自运营的项目,每一个都主权独立、各有各的宪法——再加一个”客座 CEO”,能从一家空降进另一家,先读当地法律,把一桩界定清楚的差事办了,再回家复命。
但那个故事里的每一家公司,说的都是同一种语言。它们全都建在同一个 AI 应用里。客座 CEO 之所以能空降进另一个项目,是因为它们是同一个物种:它能打开那个项目的文件、加载它的文档、读它的宪法、以本地人的身份行事——因为它骨子里跑在同一套 runtime 上。
这一篇讲的是更硬的那道边境。两个根本不是同一物种的 Agent 应用之间的那道边境。
两个互相看不见的工人
我这台机器上,有两个自主的编程 Agent 并排跑着。一个是 Claude Code,另一个是 Codex。不同的厂商,不同的订阅,不同的强项,不同的账单。我的大多数流水线里,Claude Code 是常驻 CEO——它编排工作、派发子 Agent、审核产出、向我汇报;Codex 是隔壁邻居。
而这里有一堵墙。这两个应用彼此看不见。Claude Code 看不到 Codex 的屏幕,读不到 Codex 正在运行的记忆,看不见它的线程,也没法像调库那样调用它。它们之间唯一共享的,只有同一台笔记本、以及底下同一个文件系统。就它们各自”活着的注意力”而言,它们是两个不同国家里的两家公司,两栋楼之间连一根电话线都没有。
有很长一段时间,这意味着的正是上一篇开头那件事:我就是那根线。当 Claude Code 需要一件只有 Codex 能做的事,我把请求从一个应用里复制出来,打开另一个,粘进去,等着,再把结果搬回来。又一次当人肉消息总线——只不过这回不是在我自己几家公司之间,而是在两个我恰好都付了钱的、互为对手的产品之间。
这一篇要问的,就是怎么把这根线拆掉。怎么让经营你这家公司的 AI,去雇隔壁那个 AI——而不用你杵在门口逐句传话。
到底为什么要跨境
先说动机,再说机制。我这边的一个 Agent 会伸手越过边境去找另一个,诚实讲只有三个理由,没有一个是图新鲜。它们全都是单位经济账。
其一:那份能力在隔壁是打包送的。 Codex 的订阅自带图片生成。在更高一档的套餐里它基本是不限量的——我已经付了一笔每月固定费,它每画一张图,都不再多花我一分钱。Claude Code 也能出图,但只能去够一个按张计费、真金白银扣美金的外部 API。所以这笔算术一点都不微妙。当我的内容流水线需要一张封面、一张插画、一张示意图——任何由像素构成的东西——整个系统里最便宜的出图地点,就是那个图片生成早已付过费的应用。街对面那家管饱的固定价自助餐,你没道理再去单点。
其二:产能与额度的套利。 Claude Code 有每周的额度上限,也有同时能跑多少任务的并发天花板。某些周,一次长的生产跑批会把这两条逼近墙角。这时候,那些不非得跑在 Claude 这条工资单上的活——批处理、机械转换、任何可外包的——就被推过边境去消耗 Codex 的额度,把 Claude 的额度省给只有它该干的判断密集型工作。两条工资单,一家公司。一个老板在一份预算上见了底、另一份还有余粮,做的当然是显而易见的事:把负载挪过去。
其三:有时候角色会对调。 大多数时候是 Claude Code 当 CEO、Codex 当承包商。但并不总是。有些工作流是反着搭的——Codex 才是那个常驻主 Agent,反过来伸手越过边境把 Claude 用起来。这道口岸不是一条从主人通向仆人的单行道。它是一条贸易线,货往哪个方向走,取决于那天订单在谁手里。
你没有的能力、你短缺的产能、一个可以反转的角色。三个理由,一个形状:一家一人公司能做的最聪明的事,就是把每一件活,路由给那个早已把它 cover 掉的劳动力。
为什么一个共享函数不够
工程师的第一反应,是干脆把这一切都绕过去,用代码把两个应用接起来。给它们一个共享库,让一个像调函数一样调另一个。
这在这里行不通,而原因不是我犯拧——是这两个应用当真看不见彼此运行时的状态。Claude Code 里没有任何一个活对象,握着通向 Codex 的句柄;默认它们之间也没有一个开着的 socket。它们是两个各自独立的进程,归属两个不同的厂商,各自守着一份对方毫无窗口可窥的私有上下文。
所以你没法像在一个程序里传参那样,在它们之间传一个值。你能做的,是用它们俩都碰得到的那一样东西:磁盘。文件系统就是那片中立地带——两个国家共同接壤的那条边境带。Claude Code 写进文件的任何东西,Codex 稍后都能读到;Codex 写回的任何东西,Claude Code 都能捡起来。这场协作必须由文件搭成,因为文件是两个应用唯一共通的语言。
而这个约束,不是一件需要道歉的局限。它恰恰是让整件事可审计的原因。每一次请求、每一次回复,都是磁盘上一个你能打开、能读的文件。没有任何要紧的事,发生在一条你无法检视的暗渠里。
口岸本身
这套机制,是一个刻意造得很无趣的小协议,我管它叫”桥”。它只有三个动作。
第一,投一份请求。 Claude Code 往一个共享收件箱里写一个请求文件:谁发的、发给谁、一个清楚的问题或任务,以及——这是要紧的地方——指向 Codex 需要读的那些文件的指针。不是那些文件的内容,是它们的路径。
第二,按门铃。 往文件夹里写一个文件,并不会让邻居抬头。所以桥会发一记明确的唤醒:它派出一个 detached 的 Codex worker,把它指向那份请求。这就是门铃。Codex 现在知道有信来了。
第三,等回复,然后读它。 Codex 捡起请求,在它自己私有的上下文里读那些被指到的文件,把活干了,再把答复写回成一个回复文件。Claude Code 等那个文件出现,然后读它。那个回复文件——不是门铃,也不是某个聊天里”我搞定了”的自报——才是判词。
最后这条分界,分量比它看上去重得多。它正是这个系列反复落回的那条铁律:产物才是真相,自报不算数。 按响门铃,告诉你的是请求被派发了;它并没告诉你活被干完了。派发和完成是两件不同的事,而只有磁盘上那个回复文件,才有资格给第二件事盖章。一个说着”我发过去了,所以这事就妥了”的 Agent,是把敲门错当成了门被打开。
过境的四条纪律
一道由文件搭成的边境很简单,这意味着纪律必须活在你怎么用它、而不是活在管道里。四条规矩,划开一条干净的贸易线和一摊又慢又漏的烂账。
传指针,不传货物。 请求文件里带的是一份合同的路径,绝不是把合同正文原样贴进去。这是整个系列里最老的那个母题——传句柄,不传载荷——如今搬到了两个应用之间的边境上。把一长段任务描述贴进门铃留言,你就是把货物夹带进了信封;把信封压缩成一个指针,那份合同文件就仍是唯一的真相源,能被单独读、被单独改。
每回都派一个全新的信使。 桥理论上可以一直复用同一条跟 Codex 的长对话。它绝不能这么干。这一条我是量出来的。重新打开一条臃肿的线程——几百兆累积的历史——回答一个问题花了十分钟出头,而同一条日渐衰老的线程上,单单一个出图任务就烧掉了超过一百五十万 token。同样的活换一条全新线程,不到一分钟就干完,花费只是零头。历史在这里不会攒成智慧,只会攒成重量。所以每一桩差事都开一条干净的线,把活干完,让这条线关掉。
绝不伪造凭据。 一条线程的身份,是邻居在创建它时返回给你的——你记录 Codex 真正给出的那个 id,你绝不为了显得井井有条就自己编一个。而且没有任何 secret 过境。请求带的是任务和指针,它不带钥匙、不带 token、不带任何搁在共享文件夹的明文文件里会出事的东西。
凭邻居的活验收,不凭邻居的话验收。 当差事是一张图,”完成”不等于 Codex 说完成了。它等于那张图确实躺在合同指定的路径上、是合同要求的尺寸。常驻 CEO 在相信活干完之前,先去磁盘上核那份产物——跟整条流水线一样,那记”落在产物上”的本能反射。
出图这桩,说透
这道口岸最清楚的用途,也是每一次都能自己回本的那一桩:像素。
当我的博客需要一张封面,Claude Code 不去生成它。它写一份正式的图像合同——一个文件,把确切的 prompt、调色板、宽高比、输出路径、文件命名、以及往哪儿回执,全都写明。然后桥做它唯一的活:把一个指向那份合同的指针递给 Codex,按门铃。Codex 读合同,跑它内置的图片生成,把文件存到合同说的那个位置,写它的报告。
这里有个值得点名的坑,因为我自己踩过。你不能图省事、把图片 prompt 直接贴进门铃留言来抄近道。桥的”咨询”通道,会把一大段图片 prompt 细节以裸请求的形式撞进来这件事,当作它应当拒绝的东西——而且拒得对,因为那恰恰长得就像一个会漏、不可追溯的出图请求。这份纪律不是为了官僚而官僚。合同文件才是求一张图的那条唯一正当路径,而指向它的那个指针,才是唯一该上路的东西。
回报,正是这道边境存在的全部理由。你此刻正在读的这篇文章,它的封面就是这么画出来的——投一份合同、按一记门铃、收一张图——跑在一份每月固定的套餐上,多花零美金,而与此同时这同一个会话还在继续码着这些字。发布里看上去最贵的那部分,结果是免费的那部分,因为它是在那栋早已把它付过账的楼里造出来的。
管理邻居的常备班次
委派处理的是一次性的差事。但这道边境还有第二道、更安静的门,它管的是邻居的排期工作,而不是它的按需工作。
Codex 跟我别的公司一样,也跑着常备的 automation——一些卡着点、不用谁开口就自己触发的定时任务。而从 Claude Code 这一侧,我能直接管这些任务:改一个定时任务被指示去做什么、改它几点跑、把它暂停、或者再把它唤醒。这就是那种能力:走进隔壁那家公司的后台办公室,去调它的排班表,不必等着谁在另一个应用的界面里手动操作。
让这件事安全的那一条规矩,跟让任何一个定时 Agent 安全的规矩是同一条,而且是我在另一个项目里吃过亏才学会的:一条定时指令必须指向一份文档,而不是把流程内嵌进去。 诱惑在于把整套流程写进任务的常备 prompt 里,好让它”自包含”。这么干,它就会烂掉。一份被内嵌的流程拷贝,曾经漂移到发明了一个根本不存在的字段名、悄悄丢掉一个必需的步骤、还把一个错的死线写进了三个不同的地方——全都因为真正的流程往前走了,而那份粘贴的拷贝没跟上。修法是:把常备 prompt 写短,让它的第一个动作就是去读仓库里那份真正的流程文件,并让它压过任何更旧的记忆。 文件才是真相;排期只负责准点出现,照着文件此刻所说的去做。
而那间后台办公室里,有些门你根本不去开。邻居的凭据文件、它的全局配置,一律禁区,没有例外——你能调排班表,你不碰保险柜、不碰线路。一份你改过的配置,在任务的下一次启动时才生效,而不是已经在飞的那一次;改排期,从不意味着把一个工人从活干到一半的地板上硬拽下来。克制,又一次,是这套设计的大半。
知道什么时候该待在自己这边
一道这么好用的边境,很容易被用过头,所以它自带一个”不”。
别为了一个事实就跨境。如果你要的只是对面某个文件在不在、其中某一行说了什么,为了搞清这个就把整座桥启动起来,是场表演;直接看一眼更快。这道口岸是用来把真正的活交给邻居的,不是用来趴在它窗口往里瞄的。
别为了省几秒钟的启动,就去重开一条臃肿的历史线。那个全新的信使,几乎每一次都比那个熟脸的更便宜,而例外都会自己吱声。
别把货物夹带进信封,也别拿邻居的话去压邻居的活。这几个诱惑,其实是同一个诱惑——就因为这一次抄近道看起来没事,就把纪律跳过去。这一次确实没事。是第十次会漏。
是市场,不只是公司
这个系列最早几篇,讲的是把一家自运营的公司好好建起来。上一篇讲的是我名下一群公司组成的联邦,靠一个大使彼此协作。而这一篇,整个走出了那个联邦。
因为到头来,干一件活最便宜、最能干的地方,往往不在任何你亲手建起来的东西里。它是另一个 AI 应用,带着另一个厂商的账单和另一个厂商的强项,坐在同一台机器上,却看不见你这一侧的墙。跨过那堵墙去协作,已经不再是组织设计了。那是贸易——用双方唯一都读得懂的货币来做,那货币就是共享磁盘上的文件,由一套严谨到值得信任的协议来搬运。
一家能自运营的公司,是一项成就。一群不靠人肉路由就能彼此协作的公司,是一个组织。而一个懂得怎么去雇隔壁那个应用的 Agent——把每一件活路由给那个早已 cover 掉它的劳动力,而且不用你拎着信件来回跑——就是某种更接近”一门在市场里经营的生意”的东西。而说到底,那才是唯一能长久的生意。
本文延伸自 Workflow Design Bible。这部 Bible 为”一家能自运营的公司”搭脚手架;而本文讲的是:当把活干成的最便宜路径,压根活在另一个 AI 应用里、你的 Agent 不得不跨境雇工时,会发生什么。项目以 MIT 协议开源:github.com/preangelleo/workflow-design-bible。