众所周知,openclaw是token吞金兽。虽然现在gpt调用几乎是免费的,但是可能也有些朋友使用其他api渠道或者没有自己的号池在使用各家中转站。如果没办法正确的调通缓存触发,会让token的使用成本超超超级加倍!关乎钱包的问题必须马上折腾明白。

今天更新了3.23-1和3.23-2版本之后,发现缓存触发果然出问题了,解决思路如下:

修复前:

修复后:

适用场景:

  • 你用的是 openai-responses
  • 链路是 OpenClaw -> CPA/new-api/其他 OpenAI-compatible proxy -> 上游 OpenAI/Codex
  • 升级到 2026.3.22+ / 2026.3.23+ 后,发现 prompt cache 基本不触发,cache_tokens 大量变成 0

一、根因

OpenClaw 在 2026-03-19 合入了这条逻辑:

  • PR #49877
  • 标题:fix: strip prompt_cache_key for non-OpenAI openai-responses endpoints

也就是:

  • 如果 baseUrl 不是官方 OpenAI / Azure OpenAI
  • OpenClaw 会把 prompt_cache_keyprompt_cache_retention 从请求里剥掉

这能避免某些第三方兼容接口报错,但会误伤实际上 支持 prompt cache 的 OpenAI-compatible proxy

例如:

  • 本地 new-api
  • CLIProxyAPI
  • 各种转发到真实 OpenAI / Codex 的代理

二、具体改哪个文件

1) 优先找实际安装目录

如果你是全局安装(npm -g / pnpm -g),通常 OpenClaw 会在类似下面的位置:

  • /usr/lib/node_modules/openclaw/dist/
  • 或者:
    $(npm root -g)/openclaw/dist/

2) 目标文件不是固定文件名,但目标函数名固定

需要找包含这个函数的 dist bundle:

grep -RIl 'function shouldStripResponsesPromptCache(model)' /usr/lib/node_modules/openclaw/dist

如果是 npm 全局安装但不在 /usr/lib/node_modules,可以用:

grep -RIl 'function shouldStripResponsesPromptCache(model)' "$(npm root -g)/openclaw/dist"

3) 我这台机器上命中的文件是

/usr/lib/node_modules/openclaw/dist/pi-embedded-CbCYZxIb.js

注意:你那边文件名可能不一样,以 grep 找到的实际文件为准


三、具体怎么改

原始代码

找到这个函数:

function shouldStripResponsesPromptCache(model) {
    if (typeof model.api !== "string" || !OPENAI_RESPONSES_APIS.has(model.api)) return false;
    if (typeof model.baseUrl !== "string" || !model.baseUrl.trim()) return false;
    return !isDirectOpenAIBaseUrl(model.baseUrl);
}

最小修复版(手动放行指定代理)

如果你要放行自己的代理,比如:

  • 127.0.0.1:13000
  • localhost:13000
  • my-proxy.example.com

可以改成:

function shouldStripResponsesPromptCache(model) {
    if (typeof model.api !== "string" || !OPENAI_RESPONSES_APIS.has(model.api)) return false;
    if (typeof model.baseUrl !== "string" || !model.baseUrl.trim()) return false;
    if (
        model.baseUrl.includes("127.0.0.1:13000") ||
        model.baseUrl.includes("localhost:13000") ||
        model.baseUrl.includes("my-proxy.example.com")
    ) return false;
    return !isDirectOpenAIBaseUrl(model.baseUrl);
}

我实际给本机打的最小补丁

function shouldStripResponsesPromptCache(model) {
    if (typeof model.api !== "string" || !OPENAI_RESPONSES_APIS.has(model.api)) return false;
    if (typeof model.baseUrl !== "string" || !model.baseUrl.trim()) return false;
    if (model.baseUrl.includes("127.0.0.1:13000") || model.baseUrl.includes("localhost:13000")) return false;
    return !isDirectOpenAIBaseUrl(model.baseUrl);
}

四、修改步骤(手动版)

1) 备份目标文件

cp /usr/lib/node_modules/openclaw/dist/pi-embedded-*.js /usr/lib/node_modules/openclaw/dist/pi-embedded-backup-$(date +%s).js

更稳一点:先用 grep 定位具体文件后再备份。

2) 编辑目标文件

用你习惯的编辑器打开 grep 找到的那个 js 文件,把上面的函数替换掉。

3) 重启 gateway

openclaw gateway restart

4) 验证

openclaw health

然后再看你的 new-api / CPA 日志,确认是否重新出现:

  • channel_affinity
  • key_fp
  • key_path: prompt_cache_key
  • cache_tokens > 0

五、给懒得手动找文件的人:可直接发给自家 OpenClaw 的提示词

把下面这段直接发给自己的 OpenClaw,让它自己尝试定位并修改:


你帮我修一个 OpenClaw 的本地缓存兼容问题。

目标:

- 我现在的 OpenClaw 升级后,会把发往 OpenAI-compatible proxy 的 `prompt_cache_key` 剥掉,导致 prompt cache 基本不触发。
- 请你在本机全局安装的 OpenClaw dist 文件里,找到 `shouldStripResponsesPromptCache(model)` 这个函数。
- 对我指定的代理 baseUrl / host 做白名单放行,让这些代理**不要再被 strip `prompt_cache_key`**。

请按以下步骤做:

1. 先定位 OpenClaw 的实际 dist 目录:
   - 优先看 `/usr/lib/node_modules/openclaw/dist`
   - 如果没有,再看 `$(npm root -g)/openclaw/dist`

2. 在 dist 目录中搜索:
   - `function shouldStripResponsesPromptCache(model)`

3. 找到包含该函数的真实 bundle 文件(不要改 `.bak` 备份文件)。

4. 先备份该文件。

5. 把这个函数:

function shouldStripResponsesPromptCache(model) {
    if (typeof model.api !== "string" || !OPENAI_RESPONSES_APIS.has(model.api)) return false;
    if (typeof model.baseUrl !== "string" || !model.baseUrl.trim()) return false;
    return !isDirectOpenAIBaseUrl(model.baseUrl);
}

改成带白名单放行的版本。

我希望放行这些代理(你按实际变量生成 OR 条件):

- 127.0.0.1:13000
- localhost:13000
- 以及我 OpenClaw 配置里 `models.providers.*` 中所有 `api = openai-responses` 且 `baseUrl` 不是官方 OpenAI/Azure OpenAI 的 provider baseUrl

也就是说:

- 先从 `~/.openclaw/openclaw.json` 读取 provider 配置
- 自动把符合条件的 baseUrl 也加进白名单

6. 修改完成后:
   - 重启 gateway:`openclaw gateway restart`
   - 跑 `openclaw health`

7. 最后告诉我:
   - 你改了哪个文件
   - 你放行了哪些 baseUrl/host
   - 是否重启成功
   - health 是否正常

注意事项:

- 只做最小修改,不要顺手改别的逻辑
- 目标是“对白名单代理保留 `prompt_cache_key`”,不是全局关闭 strip 逻辑
- 如果 bundle 文件名和当前版本不同,以实际 grep 结果为准
- 如果找不到函数,就把搜索结果告诉我,不要瞎改

六、补充说明

为什么不要直接全局禁用 strip?

因为有些第三方接口确实会因为 prompt_cache_key 报 400。

所以更稳的方式是:

  • 只对白名单代理放行
  • 其他非 OpenAI 端点仍保持原逻辑

更理想的上游方案

OpenClaw 已经有人提 PR:

  • #52017
  • fix(agents): add supportsPromptCache compat opt-in for third-party OpenAI proxies

如果这个 PR 后面合并了,理论上未来就不需要手打这种 dist 补丁了。


七、最短结论

如果你用的是:

  • OpenClaw openai-responses
  • 中间走本地/第三方 OpenAI-compatible proxy
  • 升级后缓存突然不命中

那就去找:

  • shouldStripResponsesPromptCache(model)

并对白名单代理加一句:

if (model.baseUrl.includes("你的代理地址")) return false;

然后重启 gateway 即可。

最后修改:2026 年 03 月 24 日
如果觉得我的文章对你有用,请随意赞赏~