Claude Opus 4.8 新增了一个对 Agent 应用非常关键的能力:mid-conversation system messages。开发者可以在 messages 数组中途追加 role: "system",用系统级优先级更新指令,同时不破坏已有 prompt cache。
以前的问题
传统 Claude API 中,系统指令通常放在顶层 system 字段。
这对 prompt caching 很友好,因为系统提示位于稳定 prefix 前部。但问题是:如果长会话运行到一半,你需要增加新的系统级约束,就必须修改顶层 system。
一旦顶层 system 发生变化,缓存 prefix 的 hash 会改变,之前几十轮对话和工具 schema 可能全部 cache miss。
新能力:在 messages 中插入 system 角色
Opus 4.8 允许这样写:
{
"model": "claude-opus-4-8",
"system": "You are a code review assistant.",
"messages": [
{"role": "user", "content": "Review utils.py"},
{"role": "assistant", "content": "..."},
{"role": "user", "content": "Now review callers"},
{
"role": "system",
"content": "From now on, every suggestion must include explicit type annotations."
}
]
}这个 system message 从当前位置开始生效。它比普通 user message 优先级更高,适合应用开发者注入 operator-level 事实和约束。
为什么它能保住 Prompt Cache?
Prompt cache 要求请求 prefix 字节级一致。Claude 的缓存顺序包括:
- tools
- system
- messages
如果修改顶层 system,最前面的 prefix 变了,缓存很容易失效。
mid-conversation system message 是追加在历史末尾,前面的 tools、system 和旧 messages 保持不变,因此已有 cache entry 仍然可以命中。
适合使用的场景
- 长程代码 Agent 中途切换工程规范
- 用户打开/关闭某种工作模式
- 工具可用性发生变化
- 应用检测到 token budget 降低
- 文件系统状态变化,需要作为系统级事实注入
- Agent loop 正在执行时,需要把用户新输入折叠进当前任务
关键判断:如果这条信息来自应用/operator,而不是最终用户,就应该考虑 system role。
优先级规则
官方说明:
- 顶层
system仍适合放全局稳定指令 - mid-conversation system messages 适合后续才出现的规则
- 后出现的 system message 会覆盖前面冲突的 system 指令
- 它比普通 user message 具有更高优先级
因此不要把用户原话随意提升成 system。只有应用层事实、权限、模式、策略变化才应该用 system。
可用性限制
当前限制:
- 仅 Claude Opus 4.8
- 支持 Claude API 和 Claude Platform on AWS
- 不支持 Amazon Bedrock、Vertex AI、Microsoft Foundry
- 不需要 beta header
- 符合 Zero Data Retention eligibility
实战建议
- 稳定角色、人设、工具规则仍放顶层
system - 高频变化的应用状态用 mid-conversation system message
- 不要把时间戳、随机值塞进顶层 system
- 配合 prompt caching 降低 Agent loop 成本
- 记录每次 system update,方便审计和排查行为变化
来源:Anthropic 官方文档 - Mid-conversation system messages | 整理:ClaudeEagle