妙用子代理增强 Codex 命令行界面 — Brian John,BetterUp




内容概要

BetterUp 的首席全栈工程师 Brian John 介绍了一种将子智能体(Subagents)集成到 Codex CLI 中的方法,以增强上下文管理和工作流效率。他对比了 Codex CLI 与 Claude Code,概述了在工具中通过“黑客”手段实现子智能体功能所涉及的架构设计和权限挑战。视频包含了概念验证包装脚本(wrapper script)的技术演示、基于“智能体双人法则(Agents Rule of Two)”的安全含义讨论,以及子智能体实际运行的现场演示。


目录

  • 简介与自我介绍

  • 为何要将子智能体“黑”进 Codex CLI?

  • 上下文管理的力量

  • 架构设计

  • 克服沙盒与权限错误

  • 安全考量:智能体双人法则

  • 为子智能体配置 Codex

  • 代码演练:概念验证

  • 演示:运行子智能体

  • 结语


简介与自我介绍

大家好,我是 Brian John,很高兴今天能和大家分享如何在 Codex CLI 中以“黑客”方式集成子智能体。

我是谁?我是一名首席全栈工程师。我目前在工作中的重点是研发(R&D)团队的 AI 赋能,也就是帮助我们的研发团队成员利用 AI 更快、更高质量地完成工作。

我所在的公司是 BetterUp,这是一个非常棒的工作场所。我们从一开始就在使用 AI。我已经在那工作了八年多,比我在任何其他地方工作的时间都长。我们的使命是帮助世界各地的人们以更清晰的目标、更透彻的认知和更饱满的热情去生活。如果这听起来让你感兴趣,或者你想利用大语言模型(LLM)做一些很酷的事情,请联系我,我会在最后一页附上联系方式。


为何要将子智能体“黑”进 Codex CLI?

那么,为什么我们要把子智能体强行植入 Codex CLI 呢?我从一开始就将 Claude Code 作为我的日常主力工具。它是一个很棒的工具,拥有丰富的功能和优秀的模型,我经常使用它的子智能体功能。但我不想被锁定在一个工具中,更不希望被锁定在一个模型系列里。

我希望能够使用其他工具,特别是 Codex CLI,因为它的模型看起来真的很棒,而且我希望能在使用它们的同时依然保留子智能体功能,这样我就能将我的工作流应用到其他工具上。


上下文管理的力量

关于上下文管理(Context Management)。大家都知道,子智能体在上下文管理方面表现出色。主智能体可以将一个问题交给子智能体,子智能体去执行工作、消耗 Token,然后仅将答案返回给主智能体。子智能体消耗掉的所有那些上下文信息都不会出现在你的主上下文窗口中,这非常令人惊叹。

这一点无需我多言。我们都见过太多上下文溢出的情况,那真的很烦人。我要把功劳归功于 Dex Horthy,他的演讲改变了我使用 AI 的方式。他提出的工作流我发现非常有效,尤其是在处理大型代码库时。我推荐大家去看看那个演讲。他今年也会在 AI Engineer Code 大会上发言,我推荐大家也去看看,我相信一定会很精彩。


架构设计

好了,让我们来谈谈设计。说到底,子智能体其实很简单,它只是主智能体的另一个实例。所以我们的设计也可以很简单。

在这个案例中,我们有一个父级 Codex 会话。我们将让它运行一个脚本——这只是一个包装脚本(wrapper script),负责确定要运行哪个智能体、构建提示词(prompt)等等。它会启动 Codex Exec,因此子 Codex 将作为子智能体运行。它会响应提示词,完成工作,并将答案写入一个文件。然后,我们的包装脚本会读取该文件,将结果打印到标准输出(standard out),并将其交还给父级 Codex 会话。非常直观。


克服沙盒与权限错误

这听起来很简单,做起来应该很容易,对吧?我当初也是这么想的,但当我尝试时,开始从 Codex 那里收到各种错误。Codex 的沙盒(sandbox)机制似乎非常抗拒这种操作。当然,你可以使用 dangerously skip permissions(危险地跳过权限)之类的命令来运行——但我通常不这样做——要在正常的权限设置下使其工作实际上非常困难,为了搞定这个问题我碰壁了很久。

找出所需的最小权限组合可能是这件事中最难的部分。在父进程上,你至少需要沙盒工作区写入权限(sandbox workspace write),以便能够运行 Codex 命令。如果你愿意,你可以随时运行那个危险命令。再说一次,我不怎么那样做。

子进程稍微棘手一些。沙盒会阻止其访问主目录中的 OpenAI 凭证,因为它位于工作区之外。你再次需要至少沙盒工作区写入权限,以便它可以写入包装脚本将要读取的文件。而且你需要禁用一个叫作“部署记录器(rollout recorder)”的东西,这是一个类似日志记录的功能,因为父级沙盒同样会阻止对工作区之外的任何子命令的文件系统访问。


安全考量:智能体双人法则

在继续之前,我必须简要说明一下安全问题。Meta 最近发表了一篇名为《智能体双人法则》(Agents Rule of Two)的优秀论文,我认为它解释得非常透彻。它指出,在安全方面你需要关注智能体的三件事:它是否在处理不可信的输入、它是否拥有访问敏感系统或私有数据的权限、以及它是否能改变状态或向外部通信。

在我们的案例中,我们不处理不可信的输入。我们确实拥有访问敏感系统或私有数据的权限,因为我们可能正在处理专有的代码库。它可以改变状态,也可以向外部通信。在这个系统中它能改变的状态实际上取决于你的系统配置。就我而言,风险不是很高。它进行的外部通信仅限于 OpenAI 的 API 端点,所以我认为这不算重大风险。

这使我们处于较低风险的类别,但重要的是,低风险并不意味着零风险。所以具体情况因人而异。你需要自行判断这是否是你感到舒适的操作方式。说完这些,我们继续。


为子智能体配置 Codex

好了,为了让 Codex 能够通过这个包装脚本使用子智能体,我们必须告诉它如何运行它们。所以在我们的 agents.md 文件中,我们会加入一些信息告诉 Codex:“嘿,当我说使用某个子智能体时,去实际运行这个脚本,并带上这些命令或参数。”这就是操作方法。

此外,我们还必须告诉它何时运行子智能体,比如当用户要求时,或者当它认为有帮助时。然后我们要告诉它有哪些子智能体可用以及它们是做什么的。


代码演练:概念验证

好了,有了这些铺垫,让我们做一个快速演示。

我整理了一个非常快速且小型的概念验证(Proof of Concept)代码仓库。它是开源的,大家可以自己去看看。我也在演讲的最后附上了 URL。让我们看看这里面有什么。

首先,看看我们的智能体。我创建了几个玩具智能体。让我们看看它们是如何定义的。你可以看到每个智能体都有一个名称,还有一个推理强度(reasoning effort)。根据它所做工作的类型,你可以给它设定低、中或高推理强度,视情况而定。

然后你只需要给它智能体的提示词。这与 Claude Code 子智能体的工作方式非常相似。在这个例子中,它只是用来统计字数。另一个是文件写入智能体,只是获取一些文本并将其放入文件中。这不需要太多的推理能力。

好的,现在看看我们的包装脚本。它真的很小,只有 72 行。基本上就是接收输入,调用 AgentExecutor 这个 Python 类(稍后展示,也很小),并将智能体的输出返回到标准输出,以便主智能体可以看到。

让我们看看那个 AgentExecutor 类。我不打算通读整个文件;同样,它很小。基本上就是用适当的权限和正确的推理强度启动子智能体,并禁用部署记录器等功能。它为你处理了所有这些杂事,非常方便。

有一件事我想我在看 agents.md 时没有提到,但在这里很重要,就是这一部分。当我们告诉 Codex 如何调用子智能体时,我们会让它把智能体名称写入一个文件,把用户的查询写入一个文件,然后再运行这个命令。

这还有一个替代方案,就是实际将智能体名称和查询作为命令参数传递。我们不这样做的原因是因为 Codex 的权限系统。只要命令看起来完全一样,你只需要批准一次权限。但如果你有不同的命令参数,你每次都必须批准。如果你每次 Codex 想要调用子智能体时都要批准,那会非常烦人。所以在这种情况下,我们让命令看起来完全一样;Codex 只是去运行它。当然,如果你使用跳过权限的方式运行,就不需要担心这个。

最后,我们还有一个围绕 Codex 的包装脚本。让我们快速看一下。超级简单。它的作用是从你的主目录获取 Codex 主文件,将它们同步到一个子目录中以便访问,将 Codex home 设置为该目录,然后启动 Codex。在这个例子中,我以“全自动模式(full auto mode)”启动,这基本上是工作区写入权限加上对请求的自动批准之类的简写。我记不清具体是哪一个了,但这很直观。这里没什么特别的代码。


演示:运行子智能体

好了,让我们启动它。

现在给它一个简单的查询。我要告诉它使用它的字数统计子智能体,让它去执行。

你会看到它判断出需要运行 agent exec。它会将智能体的名称放入文件,将查询放入文件。然后它会请求我批准运行权限。这里很重要的一点是,我要选择“是,且针对此命令不再询问”。这样它就不会在每次运行子智能体时都问我了。

你会注意到这里的一切都是串行运行的。Codex 不具备像 Claude 那样异步运行任务的能力,所以速度会慢一些。总的来说,如果你用过 Codex,你会发现它整体上比 Claude Code 慢,但我认为这是设计使然。Codex 似乎更倾向于作为一种“无人值守”类型的工具,而 Claude Code 则更偏向于迭代式交互。所以我觉得这没问题。以我使用 Codex 的方式来看,这是可以接受的。

好的,我们可以看到结果被打印到了标准输出,然后 Codex 把答案返回给了我们。让我们再试一次文件写入子智能体。

同样,它会做相同的事情:将智能体名称写入文件,将查询写入文件,然后调用相同的命令。这次它不会再请求权限了。

哦,这里我们使用了 600 秒的超时设置,因为有些智能体实际上可能需要很长时间才能运行完毕。如果你让它执行一个需要查看整个代码库的大任务,且你的代码库很大,可能需要长达 10 分钟。我实际上见过它们花费更长的时间,有时长达 20 分钟,所以你可能甚至需要更长的超时时间。这是我在示例中设置的值。在这个简单的例子中,它只用了大约 40 秒。

好了,文件已经写入。去验证一下。没问题。


结语

好了,这就是我要分享的全部内容。你可以在那个 URL 找到代码。你可以在 betterup.com 找到 BetterUp 公司。如果你有任何问题,可以通过我的电子邮件地址联系我,或者在 X(Twitter)上给我发私信。虽然我不发推文,所以没必要关注我,但如果你想发私信也可以。希望这对你们有帮助。再次强调,如果 BetterUp 听起来是你感兴趣的地方,请联系我。祝大家有美好的一天。


AI 前线

如何设计不诱惑人的 AI?|【经纬低调分享】

2025-12-23 22:19:20

AI 前线

腾讯的这款 AI 数据智能体工具 Lumos,颠覆了传统的数据分析

2025-12-23 22:19:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索