OpenClaw 的执行流程是一套本地优先、模型无关、安全可控、可中断可恢复的 ReAct 闭环,从用户输入到结果返回全程可追踪。下面按启动初始化 → 消息接收 → Agent 循环 → 工具执行 → 记忆与收尾五个阶段,给出最完整、最细节的源码级解析。
入口:openclaw gateway → 启动单进程 Node.js Gateway。
- 读取 config.yaml / .env:模型、渠道、安全策略、沙箱配置。
- 自检:Node.js 版本、Docker 可用、端口占用、文件权限。
- 加载全局工具白名单、命令黑名单、路径限制。
- 扫描 ./skills/ 下所有 .yaml / .md 技能文件。
- 解析技能描述、参数、依赖、权限,注入 LLM 系统提示词。
- 技能注册表(skills/registry.ts)构建完成,运行时可直接匹配。
- 启动三级记忆:工作记忆(内存)、短期记忆(向量库)、长期记忆(SQLite / 文件)。
- 会话管理器(sessions/session-manager.ts)启动,负责会话锁、状态持久化。
- 加载并启动配置的渠道:Telegram、Discord、飞书、CLI、WebSocket。
- 每个渠道实现统一适配器:sendMessage / onMessage,统一消息格式。
- 预加载 pi-embedded-runner 执行引擎,初始化沙箱池(Docker)。
- 建立会话锁机制(ACTIVE_EMBEDDED_RUNS Map),防止并发冲突。
用户在渠道发指令 → 进入 Gateway → 路由到对应会话。
- 渠道适配器(如 channels/feishu.ts)接收消息。
- 格式转换:渠道私有格式 → OpenClaw 内部标准 Message 对象。
- 初步安全过滤:黑名单关键词、消息长度、频率限流。
- 按 chatId + userId 匹配 / 创建会话(Session 对象)。
- 会话级串行执行:消息进入 LaneQueue,同一会话消息排队执行。
- 加会话锁(acquireSessionLock),避免并发执行同一会话。
- Gateway 将标准化消息转发给绑定的 PiEmbeddedRunner 实例。
- 触发 runEmbeddedPiAgent(session, input) 入口函数。
核心函数:runEmbeddedPiAgent(
src/agents/pi-embedded-runner/run.ts)。流程:
输入 → 上下文构建 → LLM 推理 → 工具调用 → 结果回填 → 循环 → 完成。
typescript
运行
const prompt = buildPrompt(session, input);
- 系统提示:身份、技能列表、工具列表、安全规则、记忆规则。
- 记忆加载:工作记忆:当前会话历史(自动压缩,compactor.ts)。短期记忆:相关历史片段(向量检索)。长期记忆:用户偏好、技能经验。
- 输入清洗:用户指令去重、格式标准化、敏感信息过滤。
- 技能注入:当前会话可用技能列表,供 LLM 选择。
const stream = await model.invoke(prompt, { stream: true });
- 支持任意 OpenAI-compatible 模型:GPT、Claude、Ollama、通义千问等。
- 流式返回:实时获取文本、思考过程(Thinking)、工具调用(toolCall)。
- 模型解析器:区分 “纯文本回答” 与 “需要工具调用”。
- 四状态机解析模型思考:NORMAL → PENDING_TAG → IN_THINKING → PENDING_CLOSE。
- 实时展示思考过程给用户,透明可控。
- 若模型返回 toolCall:
- json
- { “name”: “read_file”, “params”: { “path”: “./main.py” } }
- 进入工具执行流程;否则直接返回文本给用户,流程结束。
工具调用是 OpenClaw 最核心、最安全的环节,全程可审计。
入口:executeToolWithPolicy(toolCall, session)。
- 权限校验:用户权限、会话权限、工具白名单。
- 路径 / 命令检查:文件操作:仅允许白名单路径(如 ~/Downloads)。命令:禁止 rm -rf /、sudo 等危险操作。
- 循环检测:防止无限递归调用(如 read_file → write_file → read_file)。
- 参数消毒:类型校验、路径规范化、敏感字符过滤。
- 主会话(用户直接交互):可选择 Host 执行(性能高)。
- 子会话 / 自动任务:强制进入 Docker 沙箱(隔离文件、网络、权限)。
- 沙箱配置:只读文件系统、网络限制、资源配额。
typescript
运行
const result = await sandbox.execute(toolName, sanitizedParams);
- 匹配工具实现:tools/file-system.ts / tools/browser.ts 等。
- 执行原子操作:read_file、write_file、run_command、browser_navigate。
- 捕获执行结果 / 错误:结构化返回(成功 / 失败、内容、日志)。
- 结果格式校验:确保是 LLM 可理解的结构化数据。
- 写入会话历史:session.history.push({ role: ‘tool’, content: result })。
- 日志记录:工具调用、参数、结果、耗时,存入审计日志。
工具执行完成 → 回到 Agent 循环 → 多轮迭代直到任务完成。
- LLM 收到工具结果,重新推理:任务完成?→ 生成最终回答,结束循环。需要更多工具?→ 生成新的 toolCall,重复执行流程。需要用户补充信息?→ 追问用户,等待新输入。
- 用户:“整理下载文件夹”。
- LLM:调用 list_files → 获取文件列表。
- 执行 list_files → 返回文件列表。
- LLM:调用 mkdir → 创建分类文件夹。
- 执行 mkdir → 返回成功。
- LLM:调用 move_file(批量)→ 移动文件。
- 执行 move_file → 返回结果。
- LLM:判断完成 → 生成总结,返回用户。
- 工具执行失败:自动重试(可配置次数)、降级策略、错误反馈。
- LLM 调用异常:重试、切换模型、返回错误信息。
- 会话中断:状态持久化,重启后从断点恢复。
- 任务完成:LLM 生成结构化回答 / 总结。
- 流式返回:通过渠道适配器发送给用户(实时打字效果)。
- 非流式:一次性返回完整结果。
- 自动压缩会话历史:compactSessionHistory(session) → 语义摘要、删除冗余、保留关键信息。
- 记忆持久化:工作记忆 → 短期记忆(向量库)→ 长期记忆(SQLite)。
- 会话归档:标记任务完成,保存审计日志。
- 释放会话锁:lock.release()。
- 沙箱清理:Docker 容器停止、删除。
- 内存回收:临时变量、缓存清理。
plaintext
用户输入 → 渠道接收 → Gateway 路由 → 会话锁 → 上下文构建 → LLM 推理 → 工具调用 → 安全检查 → 沙箱执行 → 结果回填 → ReAct 循环 → 完成 → 结果返回 → 记忆压缩 → 资源释放
- 本地优先:全流程在本地运行,数据不离开设备。
- 模型无关:无缝切换任意 LLM,不被厂商绑定。
- 安全可控:沙箱 + 白名单 + 审计日志,防止 AI 乱操作。
- 透明可调试:全程日志、思考过程、工具调用可查看。
- 可中断可恢复:会话状态持久化,重启后继续执行。
- 高性能:嵌入式运行(无 RPC)、会话串行、沙箱池化。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/273035.html