news 2026/7/3 17:53:27

OpenClaw Agent Runner 深度解析:一次 Agent 运行的完整生命周期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenClaw Agent Runner 深度解析:一次 Agent 运行的完整生命周期

OpenClaw Agent Runner 深度解析:一次 Agent 运行的完整生命周期

    • 1. 引言:Agent Runner 是什么?
    • 2. Runner 与 Provider、Model、Channel 的区别
    • 3. 一次 Agent 运行的完整阶段
      • 3.1 阶段一:参数校验与会话解析
      • 3.2 阶段二:上下文组装
        • 3.2.1 工作区引导文件加载
        • 3.2.2 Skills 加载
        • 3.2.3 模型与认证解析
      • 3.3 阶段三:执行循环(Agent Loop)
        • 3.3.1 排队与并发控制
        • 3.3.2 `runEmbeddedAgent` 的核心循环
        • 3.3.3 超时机制
      • 3.4 阶段四:流式回复与事件投递
        • 3.4.1 事件流
        • 3.4.2 分块流式传输
        • 3.4.3 静默回复
      • 3.5 阶段五:持久化与生命周期结束
        • 3.5.1 持久化
        • 3.5.2 `agent.wait` 等待完成
    • 4. 运行时选择策略(Runtime Selection)
    • 5. 运行时所有权:谁拥有循环的哪部分?
    • 6. 架构速览:代码在哪里?
    • 7. 结语

🌺The Begin🌺点点关注,收藏不迷路🌺

⬇ ⬇ 底部 ⬇ ⬇

1. 引言:Agent Runner 是什么?

在 OpenClaw 的架构中,Agent Runner(或称 Agent Runtime)是真正“干活”的核心引擎。如果用一座工厂来比喻 OpenClaw:

  • Gateway是“前台接待”——接消息、做路由、控制权限
  • Agent Runner是“生产车间”——把用户指令变成实际操作,再把结果送回来

一句话定义:Agent Runner 是拥有一个已准备模型循环的组件——它接收提示词,驱动模型输出,处理原生工具调用,并将完成的轮次返回给 OpenClaw。

本文将完整拆解 Agent Runner 的工作过程,从触发到结束,逐一剖析每个阶段的职责、机制和设计考量。

2. Runner 与 Provider、Model、Channel 的区别

首先需要理清一个常见的混淆点。在 OpenClaw 中,Runner(执行环境)、Provider(提供商)、Model(模型)和 Channel(渠道)是四个不同层级的概念:

层级示例含义
Provideropenai,anthropic,openai-codexOpenClaw 如何认证、发现模型并命名模型引用
Modelgpt-5.5,claude-opus-4-6为 Agent 轮次选择的具体模型
Agent Runtimeopenclaw,codex,claude-cli执行已准备轮次的底层循环或后端
ChannelTelegram, Discord, Slack, WhatsApp消息进入和离开 OpenClaw 的位置

简单来说:Provider 解决“找谁认证”,Model 解决“用哪个大脑”,Runtime 解决“怎么跑这个大脑”,Channel 解决“从哪里接消息”。

Runtime 又有两个家族:

  • 嵌入式 Harness:在 OpenClaw 已准备的 Agent 循环内运行,包括内置的openclaw运行时和插件注册的codex
  • CLI 后端:运行本地 CLI 进程,保持模型引用为标准形式,如anthropic/claude-opus-4-7配合agentRuntime.id: "claude-cli"

3. 一次 Agent 运行的完整阶段

一次 Agent 运行经历五个核心阶段。以下将逐一展开。

触发入口
Gateway RPC / CLI

阶段一:参数校验与会话解析

阶段二:上下文组装

阶段三:执行循环
模型推理 ↔ 工具执行

阶段四:流式回复与事件投递

阶段五:持久化与生命周期结束

3.1 阶段一:参数校验与会话解析

Agent 运行的触发方式有两种:

  1. Gateway RPCagentagent.wait
  2. CLI 命令openclaw agent --message "..."

当用户消息抵达后,agentRPC 执行以下步骤:

  1. 参数校验:检查消息格式、权限、Token 限额等
  2. 会话解析:根据sessionKeysessionId定位到具体会话
    • 私聊消息 → 映射到主会话(main)
    • 群组/频道消息 → 按频道隔离,每个群组拥有独立会话键
  3. 会话元数据持久化:记录会话状态
  4. 立即返回:返回{ runId, acceptedAt }不等待运行完成。这个设计让 Gateway 可以快速响应,而 Agent 在后台继续处理。

关键设计:agentRPC 是异步的——它只负责“接下这个任务”,真正的执行由agentCommandrunEmbeddedAgent完成。

3.2 阶段二:上下文组装

agentCommand开始真正执行前,需要完成上下文组装。这是 Agent 能够“有记忆、有身份、有工具”的基础。

3.2.1 工作区引导文件加载

OpenClaw 在agents.defaults.workspace目录下加载一系列引导文件,注入到系统提示词中:

文件内容
AGENTS.md操作指示 + “记忆”
SOUL.md人格、边界、语气
TOOLS.md用户维护的工具备注
BOOTSTRAP.md一次性首次执行仪式(完成后删除)
IDENTITY.mdAgent 名称/氛围
USER.md用户数据 + 偏好的称呼方式

这些文件在新会话的第一轮中会被注入到系统提示词的“项目上下文”中。空白文件会被略过;大文件会被修剪截断以保证提示词精炼。

3.2.2 Skills 加载

Agent 会加载 Skills 快照。Skills 通过SKILL.md文件描述,采用渐进式披露机制:启动时只加载技能的名称和描述摘要,详细的指令文本只有被选中时才加载。这种设计有效控制了上下文窗口的占用。

3.2.3 模型与认证解析

系统解析:

  • 模型引用(如openai/gpt-5.5
  • 认证配置文件(如 OAuth 或 API Key)
  • 运行时策略(决定使用哪个 Runtime)

运行时选择有明确的优先级:

  1. 模型级运行时策略(最高优先级)
  2. Provider 级运行时策略
  3. auto 模式:注册的插件 Runtime 可以声明支持的 Provider/Model 组合
  4. 兜底:如果没有运行时声明该轮次,使用openclaw作为兼容性运行时

OpenAI Agent 模型是一个特例:未设置运行时和auto模式都会解析到Codex harness

3.3 阶段三:执行循环(Agent Loop)

这是 Agent Runner 最核心的部分——ReAct 循环

3.3.1 排队与并发控制

运行按会话键串行化,并可选择经过全局通道。这个设计防止了工具/会话竞争,保持会话历史一致性。

会话转录写入受文件锁保护。锁是进程感知且基于文件的,能捕获绕过进程内队列或来自其他进程的写入者。会话转录写入者最多等待session.writeLock.acquireTimeoutMs(默认 60,000ms),之后报告会话忙。

核心设计原则:OpenClaw 采用“串行优先”的队列模型——每个会话独立排队,默认串行执行,优先保证状态稳定。并发越多,状态越容易失控。

3.3.2runEmbeddedAgent的核心循环

runEmbeddedAgent是执行循环的实际承载者:

  1. 建立 Pi 会话:构建 pi-agent-core 运行时所需的对象
  2. 订阅 Pi 事件:将 pi-agent-core 的事件桥接到 OpenClaw Agent 流
    • 工具事件 →stream: "tool"
    • Assistant 增量 →stream: "assistant"
    • 生命周期事件 →stream: "lifecycle"(phase:start/end/error
  3. 强制执行超时:通过中止计时器控制运行时长
  4. 对于 Codex app-server 轮次:如果已接受的轮次在终端事件前停止产生进度,则中止该轮次

接收用户消息

上下文组装

模型推理

需要调用工具?

执行工具
文件/浏览器/命令

工具结果返回
作为 Observation

生成最终回复

3.3.3 超时机制

OpenClaw 设置了多层超时,防止 Agent“死循环”或卡住:

超时类型默认值说明
Agent 运行时172,800 秒(48 小时)agents.defaults.timeoutSeconds
模型空闲看门狗120 秒无响应块到达时中止模型请求
等待 Agent 完成30 秒agent.wait默认等待时间
会话写入锁等待60,000 秒session.writeLock.acquireTimeoutMs

3.4 阶段四:流式回复与事件投递

OpenClaw 支持在模型生成过程中流式输出,而不是等全部生成完再一次性返回。

3.4.1 事件流

Agent 运行过程中发出的流事件包括:

  • lifecyclestartend/error
  • assistant:来自模型的流式增量文本
  • tool:工具调用的 start/update/end 事件
  • compaction:压缩周期事件
3.4.2 分块流式传输

通过配置blockStreamingDefault可以开启分块流式传输,在模型生成文本块时发送部分回复,而不是等待完整回复。关键设置包括blockStreamingBreak(在text_endmessage_end处分块)和humanDelay(分块回复之间的类人暂停)。

3.4.3 静默回复

精确的静默 TokenNO_REPLY/no_reply表示“不要投递用户可见的回复”。系统会将其从出站负载中剥离,但工具媒体附件仍会投递。

3.5 阶段五:持久化与生命周期结束

3.5.1 持久化

循环完成后,整个会话和工具结果被持久化。会话转录以 JSONL 格式存储在:

~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl

会话 ID 是稳定的,由 OpenClaw 选定。

3.5.2agent.wait等待完成

agent.wait使用waitForAgentRun等待特定runId生命周期 end/error,返回{ status: ok|error|timeout, startedAt, endedAt, error? }

4. 运行时选择策略(Runtime Selection)

OpenClaw 在 Provider 和模型解析之后选择嵌入式运行时。选择优先级如下:

  1. 模型级运行时策略(最高优先级):位于已配置的 Provider 模型条目中,或agents.defaults.models["provider/model"].agentRuntime
  2. Provider 级运行时策略:位于models.providers.<provider>.agentRuntime
  3. auto 模式:已注册的插件 Runtime 可以声明支持的 Provider/Model 组合
  4. 兜底:如果没有运行时声明,使用openclaw作为兼容性运行时

特别注意:整会话和整 Agent 运行时固定项(如OPENCLAW_AGENT_RUNTIME)会被忽略。运行openclaw doctor --fix可以移除过期的配置并转换旧版模型引用。

5. 运行时所有权:谁拥有循环的哪部分?

不同运行时拥有循环中不同范围的内容。以 OpenClaw 内置 Runtime 和 Codex app-server 为例:

表面OpenClaw 嵌入式Codex app-server
模型循环所有者OpenClawCodex app-server
规范线程状态OpenClaw 转录Codex 线程 + OpenClaw 转录镜像
OpenClaw 动态工具原生 OpenClaw 工具循环通过 Codex 适配器桥接
原生 Shell 和文件工具OpenClaw 路径Codex 原生工具,通过钩子桥接
上下文引擎原生 OpenClaw 上下文组装OpenClaw 将上下文投影到 Codex 轮次
压缩OpenClaw 或选定上下文引擎Codex 原生压缩 + OpenClaw 通知
渠道投递OpenClawOpenClaw

这个所有权拆分是主要设计规则:

  • 如果 OpenClaw 拥有该表面 → 提供正常的插件钩子行为
  • 如果原生运行时拥有该表面 → OpenClaw 需要运行时事件或原生钩子
  • 如果原生运行时拥有规范线程状态 → OpenClaw 应镜像和投影上下文,不重写不受支持的内部实现

6. 架构速览:代码在哪里?

OpenClaw 的 Agent Runtime 代码分布如下:

路径职责
src/agents/embedded-agent-runner/内置 Agent 循环、Provider 流适配器、压缩、模型选择、会话接线
src/agents/sessions/会话持久化、扩展加载、资源发现、Skills、提示词、主题
packages/agent-core/可复用 Agent 核心、Harness 类型、消息、压缩助手、提示词模板
src/agents/runtime/OpenClaw 对@openclaw/agent-core的门面 + 本地代理工具
src/agents/agent-tools*.tsOpenClaw 拥有的工具定义、Schema、策略、钩子适配器
src/agents/agent-hooks/内置运行时钩子,如压缩保护和上下文修剪
src/llm/模型/Provider 注册、传输助手、Provider 特定流实现

7. 结语

Agent Runner 是 OpenClaw 从“能说会道”到“真刀真枪干活”的关键转化器。一次 Agent 运行的生命周期可以概括为:

  1. 参数校验与会话解析→ 接单
  2. 上下文组装→ 准备工作
  3. 执行循环(模型推理 ↔ 工具执行)→ 核心干活
  4. 流式回复与事件投递→ 边干边汇报
  5. 持久化与生命周期结束→ 收工存档

理解 Agent Runner 的工作方式,是深入掌握 OpenClaw 工程原理的必修课。它融合了队列管理、会话锁、运行时选择、超时控制、事件流分发等多个系统工程的关键设计,值得仔细品味。


🌺The End🌺点点关注,收藏不迷路🌺

⬆ ⬆ 顶部 ⬆ ⬆
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 3:45:25

导师认可的AI论文平台综合榜(2026 最新盘点)

基于学术适配性、写作效率、功能完整性及用户反馈&#xff0c;以下是2026年主流AI论文写作工具的权威测评榜单&#xff0c;按综合使用价值从高到低排列&#xff0c;并详细标注各平台的核心优势与适用人群。&#x1f3c6; 第一梯队&#xff1a;全流程学术解决方案&#xff08;★…

作者头像 李华
网站建设 2026/7/2 16:30:14

SpringBoot基础

SpringBoot是一个简化 Spring 应用程序开发的框架&#xff0c;它的主要目标是减少 Spring 应用程序的配置和开发复杂性&#xff0c;使我们能够更快地构建、测试和部署 Spring 应用。简单来说&#xff0c;它通过提供默认配置、自动化配置和嵌入式服务器等功能&#xff0c;简化了…

作者头像 李华
网站建设 2026/7/3 11:22:11

量子通信中的损耗挑战与优化传输方案

1. 量子态在损耗信道中的传输挑战量子信息传输面临的核心难题是信道损耗。在光纤通信中&#xff0c;光子损耗率随距离呈指数增长——1550nm电信窗口的典型光纤损耗系数为0.2dB/km&#xff0c;这意味着80km传输后信号强度将衰减至原始值的约1.6%。这种损耗对量子通信尤为致命&am…

作者头像 李华