文件

行数

角色

用途

agent-run-handler.ts

531

单 Agent 9 阶段流水线

多 Agent 要在 Dispatch 阶段做拆分

run-loop.ts

669

LLM↔Tool 核心循环

每个 Agent 的执行引擎

call.ts

1337

LLM API 调用层

统一鉴权/限流/重试

run-orchestrator.ts 是执行前的准备层:解析 session、获取 lane(并发控制)、加载插件、选模型、跑 hooks。最后交给 executePreparedEmbeddedRun → run-loop.tsrun-loop.ts 就是 Agent 的核心循环(下一章节再讲run-loop.ts)

第一阶段:run-orchestrator.ts 执行前的准备层

 run-orchestrator.ts是嵌入式 Agent 运行编排 的核心实现,它的主要职责是协调和执行一个 AI Agent 的完整推理过程,包括参数解析、会话管理、并发控制、插件钩子触发、模型路由、结果返回等一系列复杂步骤。

  • 所属模块@openclaw/core 的嵌入式 Agent 运行时。

  • 核心导出runEmbeddedAgent(params): Promise<EmbeddedAgentRunResult> —— 外部调用的唯一入口。

  • 职责:将外部调用参数转换为一个可执行的 Agent 运行实例,并管理其生命周期,包括:

    • 会话(Session)的创建与复用

    • 并发控制(Lane)

    • 插件前置钩子(Before Agent Reply)

    • 模型选择与回退

    • 工作区(Workspace)解析

    • 执行阶段诊断与日志

    • 结果返回与异常处理

二、核心流程(从入口到执行)

整个流程可以简化为以下关键步骤:

1. 入口函数 runEmbeddedAgent L59-80

  • 标准化输入参数(paramsInput)。L62

  • 如果未显式提供配置,则从全局运行时快照获取。L65-69

  • 生成或继承 lifecycleGeneration(生命周期代),用于跟踪运行实例。L70-72

  • 调用内部函数 runEmbeddedAgentInternal 并包裹生命周期上下文。L73-79

2. 内部函数 runEmbeddedAgentInternal(主体)L82-EOF

a. 参数预处理与会话键解析 L85-99
  • 通过 applyAgentRunSessionTargetIdentity 补全 agentIdsessionId 等

  • 调用 backfillSessionKey 确保 sessionKey 非空(即使调用方未传)。

  • 执行 assertAgentHarnessRunAdmission 进行准入检查(如并发数限制等)

b. 确定运行目标(Session Target)L100-111
  • 调用 resolveAgentRunSessionTarget,得到最终有效的 sessionIdsessionFileagentId 等。

c. Lane(车道)系统 —— 并发控制 L112-138
  • 分别解析 sessionLane(会话专属)和 globalLane(全局共享)。

  • 通过 createEmbeddedRunLaneController 创建车道控制器,提供:

    • enqueueSession:排队进入会话级队列

    • enqueueGlobal:排队进入全局队列

    • noteLaneTaskProgress:任务进度通知

    • throwIfAborted:检查是否被中断

d. 会话延迟维护等待 L164
  • 在执行真正运行前,会调用 waitForDeferredTurnMaintenanceForSession等待当前会话的延迟转录重写等维护任务完成,保证数据一致性

e. 尝试 CLI 后端分发 L174
  • 调用 runEmbeddedAgentViaCliBackendIfEligible如果当前运行可以通过 CLI 后端处理(如 Claude CLI),则直接返回结果,避免启动嵌入式环境

f. 本地嵌入式运行(主要路径)
  • 工作区解析:通过 resolveRunWorkspaceDir 得到工作区目录,并处理 fallback 逻辑。L195-215

  • 加载运行时插件ensureRuntimePluginsLoaded 确保所需的插件已加载。L216-222

  • 模型解析resolveInitialEmbeddedRunModel 根据参数和配置确定使用的 provider 和 modelId。L224-229

  • 钩子(Hook)执行:L242-282

    • 构建钩子上下文(hookCtx),包含运行 ID、会话键、工作区、模型信息、触发源等。

    • 调用 runBeforeAgentReplyForTurn,执行所有注册的 before-agent-reply 钩子。

    • 如果钩子返回 handled,则直接使用钩子返回的回复,跳过模型推理。

  • 执行实际运行:调用 executePreparedEmbeddedRun,传入所有准备好的参数和上下文,进行真正的 Agent 推理。

三、关键组件与设计模式

组件 作用 设计意图
Lane Controller 管理并发执行队列,分为会话级和全局级。 确保同一会话的串行执行,同时允许不同会话并行;全局 lane 可用于限制全局并发数。
Progress Controller 跟踪执行阶段,通知外部进度状态。 用于监控和调试,支持外部订阅执行进度。
Failure Suspension 当运行失败时,可将当前运行挂起(suspend)。 提供重试或恢复机制,避免整个会话崩溃。
Recovery Message Action Capability 从持久化存储恢复消息动作能力。 支持断点续跑,保证长时间运行的可恢复性。
Hook System 在模型推理前插入自定义逻辑(如拦截、修改 prompt)。 提供扩展点,让插件可以在运行前修改或接管回复。
Fallback 配置 支持模型失败时回退到其他模型。 提高系统稳定性,应对模型不可用或限流。
Execution Phase Diagnostics 收集各阶段的耗时和状态。 用于性能分析和问题定位。

四、值得注意的设计细节

  1. 生命周期代(Lifecycle Generation)
    每次运行都会携带一个 lifecycleGeneration,用于关联跨组件的事件和日志,便于追踪一个完整请求的生命周期

  2. markWaitingForDeferredMaintenance / markDeferredMaintenanceWaitEnded
    在等待会话维护期间,会标记回复操作的等待状态,确保转录重写等后台任务先完成,再读取会话数据,保证一致性

  3. 工作区回退(Workspace Fallback)
    如果指定的工作区不可用,会回退到默认工作区,并输出警告日志,增强了健壮性

  4. 工具结果格式(Tool Result Format)
    根据消息通道是否支持 Markdown,动态决定工具结果的展示格式(markdown 或 plain),提升了用户体验。

  5. Probe Session 支持
    当 sessionId 以 probe- 开头时,会跳过某些持久化操作,用于快速测试或健康检查


五、总结

run-orchestrator.ts 是 OpenClaw 嵌入式 Agent 的“总指挥”,它通过分层、职责清晰的编排,将复杂的 Agent 运行过程拆解为可管理、可扩展、可监控的步骤。它体现了以下几个优秀工程实践:

  • 关注点分离:会话管理、并发控制、钩子、模型选择各自独立。

  • 可观测性:详细的时间戳、阶段日志、诊断信息。

  • 弹性与恢复:支持失败挂起、模型回退、恢复能力。

  • 扩展性:通过插件钩子和后备机制,允许外部干预或增强。

理解这份源码,相当于掌握了 OpenClaw 嵌入式 Agent 的“骨架”,对后续开发插件、调试问题或定制运行流程都很有帮助。
 

                

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐