众所周知,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_key和prompt_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:13000localhost:13000my-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_affinitykey_fpkey_path: prompt_cache_keycache_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 即可。
版权属于:DeepFal
本文链接:https://blog.deepfal.cn/index.php/archives/958/
转载时须注明出处及本声明