OPENCODE中CC费用再降五倍?异常计费token原因解析

:police_car_light: 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缓存计费
带有模型广场的官网模板则可以触发正常缓存计费


:white_check_mark: 解决方案:补全 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暂时没有处理:

29 个赞

同时引入查询资料中也存在类似疑问的帖子

@paker_root

1 个赞

牛哇,这是真在科研!

1 个赞

太强了,大佬

1 个赞

感觉兼容性不太行

佬太强了

PR已经提交给官方了,后续可以等待正式版本启用:

fix(metadata): Some providers use requestbody(body.metadata.user_id) to enable cache features Fixes #8195 by tisoz · Pull Request #11276 · anomalyco/opencode

临时修复版:
npm install -g opencode-windows-fixed-cache

启用方式
opencode.json
provider.options.enableMeta = true

会隔几天更新一次,版本跟着dev同步

效果方面:

8 个赞

太强了佬,感谢贡献 :beating_heart: :beating_heart:

佬,临时修复方案考虑支持下mac吗?或者你开源一下,我去拉出来修改

在我github上面,你看看我提交的pr,然后去我仓库

这个上个月就有佬分析过了,cch也做了应对,接入cch后,cch转发请求时会帮你填加一个会话ID。

我觉得那玩意不太靠谱,因为转发本质上也不太好识别对话属于哪个project id 和session id,我查看了请求原始参数,所以才做成了opencode集成,因为本质上转发也得找到同样的会话流才方便对缓存处理,a要是用到b的缓存不就乱说话了

1 个赞

佬,那setcachekey还有没有意义啊

cch的实现原理也挺简单的,不过你这个更方便,cch还要部署个vps

1r 300opus 这么顶??

有的,一些其他模型依赖这个开启缓存

这个对非aws模型也适用么?还是说其他模型可以使用setCacheKey

佬 搞个github workflow自动patch吧

应该是要的

谢谢佬,刚想睡觉就有人递枕头