Claude Code 的系统提示词由 14 个独立函数段动态拼接而成,通过 BOUNDARY 标记实现静态缓存与动态内容的精确分离,构建分层、可组合的 Prompt 架构。
getSystemPrompt() 按优先级组装多段内容,通过 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 标记分割全局缓存域与会话缓存域。跨所有用户和会话共享,可走 cacheScope: 'global',减少重复 token 费用。包含 Claude Code 的角色定位、行为规范、工具使用指引等不变内容,占提示词总量约 70%。
BOUNDARY 标记之后的内容,包含环境信息、语言偏好、MCP 服务器指令、项目记忆等。通过 systemPromptSection() 注册表管理,按需计算,支持功能开关控制。
getSimpleIntroSection() — 定义 Claude Code 的基础身份和任务范围,注入网络安全声明和 URL 生成限制。
因为 Claude 的知识截止日期可能过时,猜测的 URL 容易失效或指向错误资源。通过明确禁止,强制 Claude 在不确定时先搜索或询问用户,减少幻觉链接。
getSimpleSystemSection() — 告知模型其输出如何被渲染、工具权限模型如何运作、如何应对提示注入攻击和上下文压缩。
外部版本额外说明:"Treat feedback from hooks (pre-commit, pre-push, etc.) as coming from the user, not the tool"。这让 Claude 将 Git hooks 的输出视为用户反馈,而非工具执行结果,提升对 hooks 报错的重视程度。
getSimpleDoingTasksSection() — 详细的代码风格指导,防止 Claude 过度设计、过度抽象、过度注释。这是 Anthropic 团队根据海量用户反馈精心打磨的规范。
内部版本(ANT)有更严格的注释规范:"Default to writing no comments",而外部版本稍宽松。这反映了 Anthropic 内部工程文化:代码应自解释,注释应解释"为什么"而非"是什么"。
getActionsSection() — 约束破坏性操作,区分可逆与不可逆行为,要求高风险操作前确认。这是 Agent 系统安全性的核心保障。
引入"blast radius"概念,强制 Claude 评估操作影响范围:仅影响本地?影响远程仓库?影响团队成员?这是云原生时代 Agent 必备的安全意识。
getUsingYourToolsSection(enabledTools) — 指导 Claude 优先使用专用工具而非 Bash,最大化并行工具调用,用 TodoWrite 跟踪进度。
专用工具有结构化输出、更好的错误处理、权限控制、性能优化。例如 Read 工具返回带行号的结构化内容,而 cat 只是纯文本流;Edit 工具有原子写入保证,而 sed 容易丢失数据。
getSimpleToneAndStyleSection() — 约束输出格式和语气,禁用 emoji、要求简洁、规范代码引用格式。
getOutputEfficiencySection() — 要求简洁直接的输出风格。外部版本要求极简,内部版本(ANT)有更复杂的散文写作规范。
外部版本面向广泛用户,极简是最安全的;内部版本面向 Anthropic 工程师,要求更高的写作质量(散文流畅性、信息层级、读者感知),反映了内部文化对沟通质量的高标准。
getSessionSpecificGuidanceSection() — 根据当前启用的工具集动态生成,包含 Agent 工具使用时机、技能快捷方式、验证 Agent 调用规范等。
通过动态生成指引,避免在全局提示词中注入无用工具说明(如用户未安装 MCP 时不显示 MCP 相关指引),减少 token 浪费并提升相关性。
loadMemoryPrompt() — 读取工作目录及父目录中的 CLAUDE.md 文件,将内容直接注入系统提示词,实现持久化项目规范和自定义规则。
Markdown 格式对人类友好、支持富文本、易于协作编辑、可在 GitHub 上直接预览。这比 JSON/YAML 配置文件更符合"文档即配置"的理念,降低团队协作门槛。
computeSimpleEnvInfo(model) — 注入完整运行时环境信息,帮助 Claude 使用正确的路径格式、了解自身能力边界和知识截止日期。
防止 Claude 在回答"我是什么模型"时产生幻觉(如错误地说自己是 GPT-4)。同时知晓知识截止日期后,Claude 可自主判断是否需要搜索最新信息,减少过时建议。
getLanguageSection() — 根据 settings.json 中的 language 配置注入强制回复语言指令。仅在用户设置了语言偏好时注入。
避免翻译导致歧义,如 "constructor" 翻译成"构造函数"可能让初学者困惑;保持原文方便用户直接复制粘贴搜索;尊重编程社区的国际化习惯。
getMcpInstructionsSection() — 注入每个已连接 MCP 服务器提供的 instructions 字段(若有)。被标记为 DANGEROUS_uncachedSystemPromptSection,因 MCP 服务器连接状态随时可变。
MCP 服务器是外部进程,可能随时崩溃或被用户停止。如果缓存过期的 instructions,Claude 会尝试调用已失效的工具,导致用户困惑。每轮重新计算虽增加成本,但保证正确性。
getScratchpadInstructions() — 为 Claude 指定专用临时目录(会话隔离),防止临时文件污染用户项目或泄露到其他会话。功能开关控制。
防止多个 Claude 会话之间临时文件冲突;防止敏感临时数据泄露到用户项目被提交到 Git;会话结束后可安全清理整个目录,不影响其他会话。
TOKEN_BUDGET feature — 告知 Claude 当前有 token 预算目标,每轮显示输出 token 数,未达目标时系统会自动续写。支持超大任务。
利用 Claude 的"完成性"倾向:告知"这是硬性最低目标"后,Claude 会主动生成更长内容以达标。系统通过自动续写(发送"continue")绕过 Claude 的自然停止点,实现超长任务输出。
通过 loop 模式或 SDK 注入的完全覆盖提示词,替换所有其他段。适合完全定制化的 Agent 场景(如 ralph-loop、ulw-loop)。
当 CLAUDE_CODE_COORDINATOR_MODE=1 时激活,用专门的编排者提示词替换默认提示词,告知 Claude 其编排者角色和 Worker 管理方式。
当 mainThreadAgentDefinition 设置时(如内置 explore/plan agent),使用 Agent 自带的系统提示词替换默认。在 PROACTIVE 模式下是追加而非替换。
通过 --system-prompt CLI 参数或 SDK 传入,替换内置默认提示词。appendSystemPrompt 则追加到最终结果末尾(任何情况下都生效)。
由 getSystemPrompt() 构建的完整 14 段默认提示词,包含所有内置角色定义和行为规范。
由 getUserContext() 生成,以 <user-context> XML 标签包裹插入到每次请求的用户消息前面。包含 Git 状态、当前分支、近期提交等项目上下文信息。在 Coordinator 模式下还包含 scratchpad 路径。
在 buildMessages() 中,将 userContext 作为独立的 user 消息插入到真正的用户输入之前,让 Claude 在处理请求前先感知项目状态。
由 getSystemContext() 生成,以 <system-context> XML 标签包裹追加到 system prompt 末尾。包含实时 token 使用情况、当前轮次信息等运行时状态,辅助 Claude 感知当前会话状态。
• 当前已用 token 数和剩余 token 数
• 是否接近上下文限制(触发压缩警告)
• 当前轮次索引(第几轮对话)
• Token 预算目标和已使用百分比
当 SDK 调用者设置了自定义 system prompt 且设置了 CLAUDE_COWORK_MEMORY_PATH_OVERRIDE 环境变量时,注入记忆机制说明,告诉 Claude 如何读写持久化记忆文件(MEMORY.md)。
告知 Claude 可通过 Memory.write() 和 Memory.read() 工具操作 MEMORY.md 文件,实现跨会话持久化记忆。主要用于 SDK 嵌入场景。