Monoize
变换

自动缓存:稳定提示词前缀

把每次请求都会变的 agent 元数据移到整次请求末尾的 user 节点,使隐式前缀缓存能命中对话历史。

行为

使用隐式前缀缓存的上游按 token 前缀精确匹配。只要有一个 token 变化,从该 token 起的缓存全部失效。

编程 agent 会把每次请求都变化的内容放在 system prompt 靠前的位置。Claude Code 会写入 <env> 块和一行 x-anthropic-billing-header。Codex CLI 会写入 <environment_context>。Cursor 会写入 <user_info> 和 <timestamp>。

此变换从开头的 system 连续段中取出这些内容。默认动作是搬移到整次请求末尾的新 user 节点,放在所有已有消息之后。模型读到的 token 完全相同,只是顺序不同。不删除任何 token。

末尾的 system 节点不够。Gemini 会把所有 system 节点拼进 systemInstruction。Responses 会把第一个 system 节点提到 instructions。这两种路径都会把变化块重新放到对话前面。

此变换只从开头连续的 system 和 developer 节点读取易变行。它绝不改写已有的 user 或 assistant 内容。搬移会追加一个位于末尾的 user 节点。

实测效果

一段 2,900 token 的 system prompt,模型 ZhipuAi/GLM-5.3,五轮逐轮增长的会话,其中一行的值每次请求都变化:

变化行的位置第 1 轮2345
不存在0%93.7%91.8%89.9%96.0%
在前两行之后0%0%0%0%0%
在稳定指令文本之后0%92.7%90.9%89.1%87.2%
移到 system prompt 末尾0%92.8%90.9%89.0%87.2%

第 1 轮总是 0%,因为它写入缓存而不是读取缓存。

该表使用 2,900 token 的 system prompt。若编程 agent 会话的 system prompt 约 2,000 token,对话增长到 70,000 token,变化块仍留在 system prompt 末尾,则缓存在 system prompt 之后失效。因此 relocate 把该块作为 user 消息追加到对话之后。

参考信息

属性值
类型 IDcache_prefix_stabilize
阶段request
范围Provider, 全局, API 密钥

适用场景

  • 上游 provider 类型是 chat_completion 或 responses。
  • 调用方是 Claude Code、Codex CLI、Cursor 这类编程 agent。
  • 某个高用量模型的缓存命中率偏低。请查看用量分析页的缓存命中率面板。

对 Anthropic(messages)上游,此变换不做任何事。该协议在整个节点的 cache_control 断点处缓存,因此在节点内部调整文本顺序不会移动缓存边界。那里请使用 cache_anthropic_system 和 cache_anthropic_tool_use。

配置

选项类型必填默认值说明
actionstring否"relocate"relocate 把匹配到的行移到所有已有消息之后的末尾 user 节点;strip 直接删除。
blocksarray否内置集合要匹配的按行分隔的块标记。每项需要 open 和 close。空数组表示禁用块匹配。
line_prefixesarray否内置集合要匹配的行前缀。空数组表示禁用行匹配。
stabilize_user_preambleboolean否true同时从 system 之后的首条 user 消息中提取匹配的块。hermes 等 agent 把每次请求都变动的元数据放在这里而不是 system 提示词里。

内置块集合是 <env>、<environment_context>、<user_info> 和 <timestamp>。内置行集合是 x-anthropic-billing-header:。

提供 blocks 会替换内置块集合。提供 line_prefixes 会替换内置行集合。

同一节点内只有开始标记而没有结束标记时不匹配。这可以避免一个格式错误的标记搬走 system prompt 的其余部分。

示例规则

{
  "transform": "cache_prefix_stabilize",
  "enabled": true,
  "phase": "request",
  "models": [
    "*"
  ],
  "config": {
    "action": "relocate"
  }
}

添加内置集合之外的 agent

从该 agent 发一次请求,在请求日志里读它的 system prompt,然后把包裹变化内容的标记加进来:

{
  "transform": "cache_prefix_stabilize",
  "enabled": true,
  "phase": "request",
  "models": [
    "*"
  ],
  "config": {
    "blocks": [
      { "open": "<env>", "close": "</env>" },
      { "open": "<environment_context>", "close": "</environment_context>" },
      { "open": "<agent-context>", "close": "</agent-context>" }
    ]
  }
}

顺序

把 cache_prefix_stabilize 排在 cache_openai_prompt 之前。cache_openai_prompt 从稳定前缀派生缓存键,因此它必须在搬移完成之后读取前缀。

本页目录