问题源于对agent运行时与工具系统协作机制理解偏差:agent是带状态容器和消息队列的动态实例;工具采用“发现-激活-执行”三级渐进式披露与沙箱化执行;上下文组装融合静态配置、动态记忆与检索结果;gateway与agent通过契约式消息管道通信;所有工具在资源隔离沙箱中安全执行。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在部署或调试OpenClaw时发现Agent无法正确调用工具、记忆未生效、或消息路由错乱,则问题很可能源于对Agent运行时与工具系统底层协作机制的理解偏差。以下是深入剖析该架构核心原理的路径:
一、Agent运行时:状态容器与消息队列的双重本质
Agent在OpenClaw中并非静态配置实体,而是一个具备生命周期管理的动态运行时实例。它既承载会话状态(如当前上下文、记忆指针、工具权限),又维护一个内部消息队列,用于缓冲未处理的用户输入、工具返回结果及定时触发事件。这种设计确保了多轮交互中状态一致性,同时支持异步工具执行不阻塞主线程。
1、启动时,OpenClaw根据agents.md中定义的id与workspace路径初始化Agent实例。
2、系统为每个Agent分配独立的memory namespace,所有历史记录以追加式事件日志形式写入对应workspace下的session.log文件。
3、Agent启动后自动加载SOUL.md人格定义,并将其中的system prompt与初始上下文注入运行时内存。
二、工具系统:渐进式披露与沙箱化执行
OpenClaw的工具调用机制摒弃了传统全量注入Prompt的方式,转而采用“发现-激活-执行”三级渐进式披露模型。该机制严格隔离技能元数据与执行逻辑,既压缩上下文体积,又保障工具调用的安全边界。所有工具均在受限沙箱环境中执行,输出经标准化过滤后才反馈至LLM。
1、当LLM在推理中生成tool_call指令时,运行时首先在skills/目录下匹配SKILL.md文件名,仅加载其name与description字段进行语义校验。
2、校验通过后,系统动态读取对应SKILL.md全文,并将其内容结构化注入当前Prompt,此时LLM才获得完整工具参数与约束说明。
3、LLM确认参数后,运行时启动沙箱进程,将参数序列化为JSON并传入exec.sh或index.ts入口,执行结果经stdout捕获并截断至预设token上限后返回。
三、上下文组装:动态提示词构建与记忆检索协同
每次消息进入Agent运行时前,系统必须完成上下文组装。该过程不是简单拼接历史,而是融合静态配置、动态记忆与实时检索结果的三重叠加。其中,记忆检索采用基于时间戳与语义相似度的双路召回策略,确保关键信息优先注入有限上下文窗口。
1、从workspace/session.log末尾向前扫描最近5000 tokens的原始事件流,提取用户语句、助手回复及工具调用片段。
2、调用memory-search服务,以当前用户消息为查询向量,在向量数据库中检索相关记忆条目,限制返回top-3高分结果。
3、将检索结果与SOUL.md中的core_memories段落合并,插入到系统提示词之后、用户消息之前的位置,形成最终输入Prompt。
四、消息分发管道:Gateway与Agent间契约式通信
Gateway与Agent之间不共享内存或进程空间,全部通信通过标准化消息管道完成。每条消息携带channel_id、session_id、message_id与raw_payload四个强制字段,构成不可篡改的传输契约。Agent仅解析自身订阅的channel_id与session_id组合,其余消息直接丢弃。
1、Gateway接收到平台原始消息后,调用对应Channel Plugin的parse()方法,输出统一格式的InternalMessage对象。
2、该对象经Router模块校验权限与归属,写入指定Agent的input_queue,并触发processNext()调度。
3、Agent运行时从input_queue取出消息,完成上下文组装后交由LLM处理;生成回复后,调用ReplyDispatcher反向构造平台专用格式并提交回Gateway。
五、安全沙箱:工具执行的资源隔离与输出净化
所有外部工具执行均被约束在Linux命名空间隔离的轻量级容器中,禁止访问网络、宿主文件系统及敏感系统调用。沙箱启动时仅挂载workspace子目录与skills/只读副本,并对CPU、内存、执行时长实施硬性配额。输出内容强制经过正则清洗与长度截断,防止恶意字符串注入回复流。
1、沙箱初始化时,系统生成唯一sandbox_id,并绑定至当前session_id与tool_name三元组。
2、执行命令前,参数经escapeShellArgs()函数处理,所有`、$、;等字符被转义或拒绝。
3、沙箱进程退出后,系统检查exit_code与stderr内容;若exit_code ≠ 0或stderr含关键词"permission"、"denied",则标记工具调用失败并终止流程。










