[转][译] 从零开始构建 OpenClaw — 第一部分(智能体核心)
[转][译] 从零开始构建 OpenClaw — 第二部分(技能插件系统)
[转][译] 从零开始构建 OpenClaw — 第三部分(元技能)
[转][译] 从零开始构建 OpenClaw — 第四部分(工具循环检测)
[转][译] 从零开始构建 OpenClaw — 第五部分(对话压缩)
[转][译] 从零开始构建 OpenClaw — 第六部分(持久化记忆)
[转][译] 从零开始构建 OpenClaw — 第七部分(子智能体系统)
原文:Building Openclaw from Scratch — Part 7 (Subagent System)
通过第 1-6 部分,你构建了一个能够调用工具、学习新技能、检测自身失败循环、在上下文满时压缩记忆以及在会话间记住事物的智能体。每一个功能都使单个智能体更加强大。这一部分将完全改变模型。

不再是一个智能体在一个上下文窗口中做所有事情,现在父智能体可以生成子智能体——每个子智能体都有自己隔离的上下文、自己受限的工具集和一个专注的任务。一个智能体进行研究。另一个进行实现。第三个进行审查。每个智能体独立运行,汇报结果,父智能体综合这些结果。
这就是区分一个聪明的聊天机器人和一个 AI 系统的概念:智能体作为可组合的工作单元。
你的智能体的上下文窗口中的每个标记都是一块房地产。当你要求你的智能体“研究这个代码库中身份验证的工作方式,然后重构登录模块”时,这两个任务都在争夺同一个空间。智能体在研究期间读取了 30 个文件,用代码片段填满了它的上下文。当它开始重构时,窗口的一半已经被它不再需要的研宄工件占用了。如果上下文满了,压缩功能就会启动,并总结掉它可能仍然需要的细节。
这是根本性的矛盾:宽泛的任务会稀释上下文质量。一个同时进行研究和实现的单一智能体就像一个只有一个显示器的开发者,试图同时阅读文档和编写代码——不断切换窗口,失去位置,忘记细节。
子智能体通过为每个任务提供自己的工作区来解决这个问题。研究智能体用代码分析填充它的上下文。实现智能体以研究摘要加上它自己的工作文件开始,两者互不干扰。
子智能体模型是一个树:
父智能体决定何时进行委派。它在工具集中看到 ,用特定任务调用它,并将子智能体的完整输出作为工具结果接收。父智能体永远不会失去自己的上下文——子智能体的工作发生在单独的上下文窗口中,只有最终结果会回流。
这是你在进程管理、微服务和团队协调中看到相同模式:一个将任务委派给专家的监督者。
无约束的子智能体生成是危险的。一个智能体可能会生成子智能体,子智能体会生成孙智能体,孙智能体会生成曾孙智能体,从而指数级地消耗 API 信用。有三个约束条件使系统保持有限:
- 深度限制 — 子代不能进一步生成子代。在我们的实现中这不是一个计数检查(“如果深度 >= 最大值,拒绝”),而是一个结构保证:子智能体简单地不会接收到 工具。你不能调用不存在的东西。
- 并发限制 — 一个注册表跟踪活跃的运行。在每次生成之前,系统检查:“已经有 3 个子智能体在运行了吗?如果是,则拒绝。”这可以防止发散爆炸。
- 超时清理 — 每次启动都会开始一个 5 分钟的计时器。如果一个子进程在此时仍未完成,它将通过 强制过期,并且其注册条目会被标记为过时。这可以防止僵尸智能体永远阻塞新的启动。
这三个约束 — 深度、并发、超时 — 是生产系统中找到的相同原语:进程池、线程池、连接限制。这些概念可以直接迁移。
当子进程完成时,父进程如何获取结果?有两种常见的模式:
- 同步(阻塞)— 父进程的工具调用会阻塞,直到子进程完成。结果作为工具响应直接返回。简单、可预测,无需协调。
- 异步(基于队列)— 子进程独立完成。结果被排队,并在父进程准备好时交付。更复杂,但能实现真正的并行。
我们的实现使用同步模式。当父进程调用 时,工具的 函数 会等待子会话完成。结果作为正常的工具响应流回。这是最简单的设计,展示了所有概念——注册、生命周期跟踪、超时——而无需消息队列和交付协调的复杂性。
完整的 openclaw 使用异步模式,配合 、重试退避和幂等性键。这是同一想法的生产版本。
该系统位于 下的五个文件中:
增加约 50 行集成代码在 和 1 行代码在 。
定义了运行记录和默认值:
是跟踪的单元。每个生成的子进程都会得到一个。四个状态映射到一个干净的生命周期: → | | 。
是一个记忆中的 ,有三个职责:
在并发检查之前运行。这是防御性的——如果一个子进程超时但其中止信号没有干净地触发,过时的清理操作可以防止它永远阻塞新的启动。清理操作会扫描所有运行,找到任何带有 且超时的运行,并强制将它们标记为 。
注册表还提供 、 、 、 和 —— 每个运行的完整生命周期。
是系统的核心。 函数创建并运行一个子会话:
预飞行检查控制入口。注册立即发生——即使会话创建失败,运行也会被跟踪。 开始一个硬倒计时。
然后创建子会话:
两个关键选择在这里:
- — 子进程获得零个自定义工具。没有 ,没有 ,没有 。只有编码原语: , , , 。这是结构深度限制——你不能调用工具集中不存在的功能。
- — 子进程的会话仅存在于记忆中。没有磁盘持久化,没有会话文件。当子进程销毁时,其状态会消失。这对短暂的工人来说完全正确。
任务运行时具有中止处理:
如果 5 分钟定时器触发,中止信号会触发 ,这会中断子进程的 LLM 循环。 块始终进行清理:
计时器已清除,会话已释放。无论成功、失败还是超时,都没有泄漏的资源。
为子智能体构建一个专注的提示词:
这是有意为之的简短内容。父智能体的系统提示词包含数百个标记——技能目录、记忆内容、项目上下文文件、工具摘要。子智能体不需要任何这些内容。它的全部工作就是:完成任务,并汇报结果。系统提示词中每节省一个标记,就有一个标记可用于实际工作。
将 spawner 暴露为 LLM 可调用的工具:
execute 函数优雅地捕获错误,将其作为内容返回而不是抛出:
这是重要的——父智能体将错误视为文本,而不是崩溃。它可以决定如何响应:使用不同的任务重试,回退到自己执行工作,或向用户报告失败。
父智能体在启动时创建注册表和生成上下文:
命令显示运行历史:
并且注册表在 时与循环检测器一起重置:
父智能体选择将 grep 和分析任务委托给子智能体。子智能体在其自己的上下文中运行 和 ,生成摘要,结果作为工具响应返回。父智能体自己的上下文几乎未被触及——只是工具调用及其响应。
- 子智能体生成——父智能体将任务委托给具有隔离记忆会话的子智能体(跨越 5 个文件,约 430 行代码)
- 三个安全约束——并发限制(3)、结构深度限制(子代无法获得生成工具)和超时清理(5 分钟)
- 基于注册表的生命周期 — 每次运行从创建到完成/失败/过期都被跟踪,并在每次生成尝试中进行陈旧清理
- 命令 — 查看哪些子智能体已运行此会话
自然演化是工作流编排——链式模式,其中每个智能体的输出为下一个提供输入(侦察兵→规划器→工作者),以及并行模式,用于同时跨多个专注智能体进行分支。随着注册表和生成器的准备就绪,这些是建立在您刚刚构建的相同基础上的执行模式。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/231090.html