OpenCode CLI 在 Fox 中缓存计费失效的问题排查与解决方案
工具环境
- opencode cli v1.1.40
- claudecode cli v2.1.17
- Fox Code(Claude 转发中转)
- DORO(Claude 转发中转)
异常的发现,claude与opencode存在计费差异
在 Fox Code 提供的 Claude 超低计费吸引下,我开始将日常开发工作流迁移到:
OpenCode CLI + Fox Code
原本预期是利用 Claude 的 aws分组 大幅降低上下文费用
但实际使用过程中,很快发现:
- OpenCode 在日常 workflow 中单会话大约 5~10 个问题
- 上下文很快膨胀到 100k tokens
- 每次对话成本基本稳定在:
≈ 0.1 USD / 单次请求 (日常单功能实现约50~100次请求)
更蛋疼的式:
- OpenCode 的输出模式偏向分段式生成代码
- 一次 session 很容易消耗几百万 token
- opencode上下文溴代导致总体费用增长非常快
对比:ClaudeCode CLI + Fox 成本明显更低
在尝试调优后,我切换到:
ClaudeCode CLI + Fox
结果成本直接下降到了之前的 15% 左右。
- Fox 本身缓存计费机制是正常的(但不是那么标准,隔壁DORO的cc api是在opencode中正常计费)
- Claude CLI 也确实能触发 cache token计费
- opencode存在请求差异/fox存在请求差异(两者同时存在问题导致缓存失效)
OpenCode 启用 setCacheKey 后仍然无缓存
OpenCode 文档中提到可以通过:setCacheKey:true来启用缓存功能
实际配置后:
- 请求仍然全部按 full context 计费
深入排查:问题出在 /v1/message 请求体缺失 metadata.user_id
经过大量查阅与抓包调试,我最终定位到根因:
OpenCode 发出的 /v1/message 请求体中缺失关键字段:
"metadata": {
"user_id": "user_xxx_account__session_xxx"
}
而 Fox 的缓存计费依赖:
- metadata.user_id 标注用户 session
- 才能正确归类 prompt cache key
但其他中转则没有此类问题,目前观测到中转站中类似fox官网模板的均无法正常cc缓存计费
带有模型广场的官网模板则可以触发正常缓存计费
解决方案:补全 metadata.user_id 后缓存正常生效
只要在请求体中补全:
"metadata": {
"user_id":"user_9f76af04f457a811f11a4d4c36986076c434db17d2d71d1abc8ac06bfb344ea3_account__session_3d44c07c-405f-4ae8-b6ec-fa28c5b91c45"
}
Fox 即可正常识别:
- prompt cache key
- cache hit
- 缓存计费
最终成本直接下降到与 ClaudeCode CLI 类似水平
总结
OpenCode CLI 在 Fox 中缓存失效的根因:
请求体缺失
metadata.user_id
导致 Fox 无法标注缓存上下文,prompt cache 无法触发
修复后效果:
- cache hit 正常
- 成本显著下降约之前的15%左右( 1 rmb = 40 cc opus 请求 → 1rmb = 300 cc opus 请求 )
关联 Issue
问题已经提交给opencode官方,因为观察到claude cli是有正常携带metadata.userid,而opencode暂时没有处理:
