OpenClaw 对话提示词长啥模样?
大模型本身是无状态的——每次对话都是”从零开始”。OpenClaw 每次发消息时,把所有上下文组装成一个超长 prompt 发送。
Prompt 构造流程图

下面介绍下 Prompt 中各部分内容作用。
构造 System Prompt-静态信息
基础身份: “You are a personal assistant running inside OpenClaw.”,让模型知道自己是在 OpenClaw 环境中运行的助手。
工具:告诉模型有哪些工具可用(read, write, exec, grep, browser 等)。
安全规则:明确禁止自我保护、复制、资源获取、权力寻求等行为;安全优先于任务完成,冲突时暂停并询问。
CLI:提供 OpenClaw CLI 命令的快速参考指南。
技能:引导 AI 识别和使用已注册的技能,避免盲目读取技能文件。
内存指导:让 AI 正确使用内存工具进行信息检索,控制内存召回的质量和性能。
工作空间:确保 AI 正确理解文件路径的解析规则,防止在沙箱环境中混淆宿主路径和容器路径。
文档:引导 AI 正确查找 OpenClaw 相关信息。
沙箱:让 AI 理解沙箱环境的限制,正确处理路径映射和权限问题。
用户身份:让 AI 知道哪些用户有权限与它交互,防止未授权用户获取敏感信息或执行危险操作。
时间:让 AI 知道用户的时区,便于处理时间相关的任务。
静态项目上下文:
|
|
|
|
|
|
|
AGENTS.md |
|
|
|
|
SOUL.md |
|
|
|
|
IDENTITY.md |
|
|
|
|
USER.md |
|
|
|
|
TOOLS.md |
|
|
|
|
BOOTSTRAP.md |
|
|
|
|
MEMORY.md |
|
|
缓存边界的作用
SYSTEM_PROMPT_CACHE_BOUNDARY 是一个重要的分界线:
- 之前(Stable)
:不常变化的内容,适合缓存 - 之后(Dynamic)
:每次对话都可能变化,必须每次重新生成
对支持 Prompt Caching 的提供商(如 Anthropic),在 API 层面添加正确的缓存控制参数,最终发送给大模型的内容中,这个标记会被移除或转换为 API 特定的格式。边界标记不会减少发送给模型的 Token 数量,而是利用 Prompt Caching 来降低计费成本。
构造 System Prompt-动态信息
HEARTBEAT.md:是一个用于周期性任务检查和自动化提醒的工作区文件,是让 Agent 在无人主动交互时也能自主执行任务的机制。
Webchat/Messaging/Voice/Reactions 指导:
|
|
|
|
|
|
嵌入式内容渲染规则 |
仅 Webchat 渠道 |
|
|
消息发送、会话管理、子代理协调 |
所有渠道 |
|
|
语音合成指导 |
配置了 TTS 时 |
|
|
表情反应使用策略 |
Discord/Signal 等支持反应的渠道 |
Runtime Context:是指 host, os, arch, node, model 等信息,让 Agent 能够根据当前实际环境做出正确决策,而不是依赖静态假设。
注入 Session History
加载历史信息:加载的历史消息包含当前会话的完整对话记录,是 Agent 保持对话连续性的核心机制。
处理孤立信息:孤立信息是指 Session 历史记录末尾存在用户消息,但这些消息没有对应的 Agent 回复,因上一次对话异常终止造成。若不处理,Agent 可能会”回复”一个已经过时的用户问题。
过滤 heartbeat:Heartbeat 是后台轮询,不包含有价值的信息。
注入当前用户信息
合并用户输入:发送给模型的信息可能包含用户不可见的内容。比如:用户发送消息,系统检测到上次工具调用失败,自动添加重试指令。合并逻辑:用户可见部分(记录在历史中)+ 系统添加的隐藏部分(不记录在历史中)。
检测并加载图片:检测到图片后,将其转换为可传输的 Base64 格式,随消息一起发送给大模型。
发送大模型信息
组装 → 发送给大模型:使用 pi-embedded-runner 执行时框架组装 prompt,向大模型发送消息。
看来一次会话向大模型发送的信息很多,但对于现在大模型支持上下文长度 1M Token,也是小菜一碟。
夜雨聆风