draft · 仅 crs13 预览环境显示,正式站不会发布

09 中转站猫腻,缓存省下的钱到底给了谁

前面几节讲的是模型和 Agent 框架。到中转站这里,问题会变得更现实。

模型有没有缓存,是一回事。用户有没有拿到缓存收益,是另一回事。

Claude、OpenAI、DeepSeek 都会在 usage 里返回缓存相关信息。字段名字不同,但作用差不多:让你知道这轮输入里,哪些按普通输入算,哪些走了缓存优惠。

这些信息一旦经过中转站,就可能消失。

很多 OpenAI-compatible API 会把不同供应商的 usage 统一成一套简单格式。接入方便了,缓存账本也被压平了。用户最后只看到总 input token,看不到上游到底省了多少。

这里就有第一层问题。

上游可能已经按缓存读取收了便宜价,中转站仍然按普通输入给用户计费。它不需要改请求,只要账单不区分普通输入和缓存输入,用户就很难发现。DeepSeek 这种 hit / miss 价差很大的模型尤其明显。

第二层问题是路由。

Prompt caching 依赖前缀一致,也依赖请求落到能复用缓存的位置。中转站如果在多个 key、workspace、region、上游账号之间轮询,同一个会话的请求就可能被打散。

用户看到的模型名可能一直没变,比如 claude-opus-4-8gpt-5.5deepseek-v4-pro。但背后实际走到哪个上游渠道,用户通常不知道。

有时中转站自己也未必掌握完整链路。它上面可能还接了别的聚合层、云厂商入口、区域路由或备用渠道。模型名保持一致,不代表缓存位置也一致。

第三层问题是请求被中转站改写。

有些中转站会插入自己的 system prompt,改 tool schema,或者为了兼容 OpenAI-compatible 格式重排 messages。用户以为自己发出去的是原始请求,实际到上游时,前缀已经变了。

这和缓存直接相关。Prompt caching 看的是请求前缀,前缀被中转站改过,用户自己保持稳定也没用。更麻烦的是,这类改写通常不会出现在用户侧日志里。用户只能看到自己发给中转站的请求,看不到中转站转给上游的最终请求。

所以判断中转站,不能只看标价。

便宜单价没有意义,关键要看它怎么处理缓存账本。

至少看三件事。

第一,usage 字段有没有透传。最好能看到供应商原始字段,不能只给一个总 token。

第二,缓存输入怎么计费。上游低价读取的部分,是不是也按低价算给用户。

第三,同一会话有没有路由粘性。连续任务里,请求最好固定在同一组上游资源上,不要每轮乱跳。

所以这一节先不写测试方案。

判断中转站有没有把缓存收益还给用户,不能靠几句泛泛的“连续请求试一下”。真实情况会受模型、TTL、路由、上游账号、计费粒度、账单刷新延迟影响。测试设计不严谨,很容易把缓存没命中、账单没透传、路由打散、后台延迟这几件事混在一起。

这里先把原则说清楚:没有请求级 usage,没有缓存输入的计费说明,没有路由粘性说明,就很难对账。后面讲“怎么判断”时,再单独设计可执行的检查步骤,不把它揉在中转站这一节里。