← 返回信息流
Agent SkillLINUX DO · AI·1 小时前

OpenCode接入sub2api时Claude code缓存掉失问题

原标题:有关于 OpenCode 接入 New API 或者是sub2api时候用Claude code,缓存出现时不时掉缓存的问题

速览

该帖子报告了OpenCode接入New API或sub2api后使用Claude code时缓存率不稳定的问题,约每20次出现1-2次缓存不命中。原因在于Claude code的缓存偏移量随机变化,导致部分上下文未命中缓存,表现为缓存被算作输入。OpenCode后台计费显示正常,但sub2api计费时会重复计算缓存作为输入,不过实际不额外扣费,整体仍可用但缓存率可能下降。

AI 深度解读

背景

在 AI 辅助编程工具的使用中,缓存机制是降低 API 调用成本、提升响应速度的关键。许多用户会通过 New API 或 sub2api 这类中间层服务来接入 Claude Code(CC)等模型,期望通过缓存命中来节省输入 token 的费用。然而,实际使用中经常出现缓存效果不稳定、部分缓存丢失的问题,影响开发体验和成本控制。本文源自 LINUX DO 论坛用户的一篇技术分享,详细记录了作者在迁移至 sub2api + CPA 方案后遇到的缓存不命中问题,以及排查和定位原因的过程,最终揭示了 Claude Code 在处理缓存时的一个底层行为特性。

核心内容

用户此前在 New API 下使用 Claude Code 时,发现缓存统计存在问题,怀疑是流式与非流式请求差异导致 New API 无法正确统计缓存,因此决定转向 CPA + sub2api 方案。迁移后,缓存确实能够被正确统计,但出现了新的严重问题:缓存会时不时地不命中,频率大约每 20 次请求中出现 1~2 次。查看后台日志时,用户发现部分缓存的标记被错误地归为「输入」,而非缓存命中。

进一步排查时,用户联想到论坛此前讨论过的「CC 出现随机 CCH 字符串」导致缓存率骤降的问题。但该问题已在版本更新中修复,且如果每次都是随机字符串,缓存率应该持续偏低,而不是时高时低。因此用户推测另有原因。

最终,在另一篇帖子中找到了解释。该帖子的核心观点是:Claude Code 在处理缓存时,会对历史对话内容进行分割,并生成一个随机的「缓存偏移量」。举例来说,假设用户第一次询问「今天有没有下雨」,模型回答「不会下雨」;第二次询问「那我今天应该干什么」。正常情况下,模型厂商会把前一组问答(用户问「今天有没有下雨」,模型答「不会下雨」)整体作为缓存记录。但 Claude Code 每次调用时,这个缓存偏移量会随机变化,导致分割点不同。例如,第一次的缓存记录可能是「用户今天问没有下雨」「模型回答不会下雨」,而第二次调用时偏移量变化,可能将用户输入分割为「用户今天问没有」「下雨」,模型回答「不会下雨」,这样大模型只命中了前面的部分(「用户今天问没有」),后面的部分(「下雨」)未能命中缓存,从而造成缓存丢失。如果偏移量偏到后面,部分缓存丢失,缓存率可能降至 70%;若偏移量偏到前面,则缓存率可能骤降至 10%。

用户猜测,该问题的根本解决思路是移除所有随机缓存标记,并按照标准方式重新打上缓存标记(用户未查看源代码,仅为推测)。但值得注意的是,OpenCode 工具的表现似乎正常。在 OpenCode 的后台计费中,显示缓存命中率正常,虽然实际上缓存内容被重新当作输入计算了一遍,但 sub2api 在计费时并未重复收取这部分费用。因此,虽然缓存率无法达到很高(最高可能掉两三千 token 的缓存),但整体仍然可用,不会出现「雷霆 40 万全新输入」的极端情况。

关键要点

  • 问题现象:在 sub2api + CPA 方案下,Claude Code 的缓存命中率不稳定,每 20 次请求中约有 1~2 次缓存不命中,导致部分缓存被降级为输入。
  • 后台日志显示:部分缓存标记被错误归类为「输入」,而非缓存命中。
  • 排查过程:首先排除了之前版本中随机 CCH 字符串的问题,因其已被修复且缓存率波动不符合该问题的特征;最终在论坛另一篇帖子中找到根本原因。
  • 根本原因:Claude Code 每次调用时,对历史对话的缓存偏移量是随机变化的。这导致缓存分割点不固定,部分历史对话内容无法被完整命中,造成缓存丢失。
  • 具体示例:用户问「今天有没有下雨」,模型答「不会下雨」,第二次问「那我今天应该干什么」。若偏移量变化,缓存可能只命中「用户今天问没有」而丢失「下雨」,导致部分缓存失效。
  • 缓存率波动范围:偏移量落在不同位置时,缓存率可能从 70% 降至 10%。
  • OpenCode 的表现:OpenCode 的后台计费显示正常,实际缓存内容虽然被重新计算为输入,但 sub2api 并未重复计费,因此整体可用,仅会掉少量缓存(约两三千 token),不会出现大规模全新输入的情况。
  • 用户推测的解决方案:移除所有随机缓存标记,按标准方式打缓存标记(未验证源代码)。

意义与影响

该分享揭示了 Claude Code 在缓存机制设计上的一个细节——随机缓存偏移量,这一设计虽然可能出于某些技术原因(如避免缓存污染或提高安全性),但在实际使用中给用户带来了缓存效率的不确定性。对于依赖缓存来降低 API 成本的开发者而言,理解这一行为有助于更准确地评估实际成本,并选择合适的中间层工具(如 OpenCode)来规避异常计费问题。同时,该问题也提醒了 AI 工具开发者:缓存策略的透明性和一致性对用户体验至关重要,随机偏移量带来的不可预测性可能会影响用户对工具稳定性的信任。未来,Claude Code 若能在缓存偏移量上提供更稳定的方案,或允许用户配置分割策略,将有助于提升缓存命中率,降低用户的使用成本。对于普通用户,若遇到类似缓存率波动问题,可参考本文的排查思路,并优先考虑使用 OpenCode 等兼容性更好的工具。

查看原文 →linux.do