OpenRouter 推出 Prompt Caching + Sticky Routing，降低多轮 Agent 调用成本

你的代理每次都会发送相同的系统提示、工具定义、模式和政策指令。在一个6轮的会话中，你可能会因为同样的开头块被计费6次，即使唯一变化的是用户的最新消息或代理的最新工具结果。

提示缓存可以解决这个问题。提供商会从缓存中读取你提示中重复的部分，而不是每次都按全价收费。粘性路由通过将会话发送回拥有热缓存的同一提供商，从而在各轮之间保持这一效果。

本文讨论金钱方面：缓存的令牌成本、为什么缓存读取和写入的价格不同、session_id 如何从第一轮开始保持代理会话的热状态，以及如何检查缓存是否真正有效。

缓存读取的成本为正常输入价格的0.1倍到0.5倍，具体取决于提供商。正因如此，缓存可以显著降低代理循环的成本。

重复的部分通常是昂贵的部分：长系统提示、工具定义、JSON模式、保护措施、检索的文档或示例，这些内容保持模型的一致性。如果没有缓存，每轮都要为所有内容支付全额费用。有了缓存，第一次请求会将它写入缓存，之后的请求以更低的价格读取。

提示缓存文档：https://openrouter.ai/docs/guides/best-practices/prompt-caching 有完整的细分说明。具体金额仍取决于模型和提供商路线；乘数告诉你对于该提供商，缓存输入与正常输入相比如何。

对于代理构建者，这一模式很简单：第一轮可能需要支付建立缓存的费用，但只要复用相同的开头块，之后每轮都将便宜得多。

提示缓存有两种成本：写入和读取。

写入发生在提供商存储提示可复用部分时。读取发生在之后的请求复用已存储内容时。一旦相同内容被读取足够多次来覆盖写入成本，你就会获得收益。

在某些提供商上，写入成本高于正常输入。Anthropic 缓存写入默认5分钟TTL成本为输入量的1.25倍，1小时TTL成本为输入量的2.0倍。一次从未被复用的Anthropic缓存写入，其成本比不使用缓存直接发送相同提示还要高。

对于一次性请求，缓存可能无济于事。对于多轮代理，重复是默认行为：代理在整个会话中携带相同的指令、工具、模式和策略上下文。所以在几轮之后，写入就能收回成本。

对于下一轮很快到来的短时突发，使用5分钟的缓存生命周期（TTL）。当会话可能暂停足够长时间以致默认缓存过期，但内容仍然值得保留时，使用1小时的缓存。

只有当下一次请求落在拥有缓存的提供者端点时，热缓存才有帮助。

当请求可以路由到多个提供者时，第一轮可以在一个提供者上写入缓存，而第二轮落在其他地方。第二个提供者没有可读的热缓存。请求仍然可以执行，但你要支付全价，cached_tokens 保持在低或零。

这就是为什么我们将粘性路由与提示缓存结合使用。在缓存请求之后，我们会将同一模型的后续请求路由回同一提供者端点，当该提供者的缓存读取价格低于正常输入时。如果该粘性提供者不可用，OpenRouter 会退回到下一个可用提供者，而不会导致请求失败。

默认情况下，OpenRouter 通过对话的第一条系统或开发者消息以及第一条非系统消息进行哈希来识别对话。当这些开场消息保持不变时，这种方法有效。

代理经常打破这一点。有些在总结状态、重新排列工具上下文或添加新的运行元数据时，会重写它们的第一条消息。当开场消息变化时，哈希也会变化，导致对话可能落在不同的提供者上。解决方法是显式设置 session_id。

对于代理循环，需要设置 session_id。当你传递它时，OpenRouter 会直接将其用作粘性路由键，而不是从开场消息派生键。

有了 session_id，粘性路由在第一次成功请求后立即生效，而不依赖任何缓存命中。没有它，粘性只在检测到缓存命中后才开始。对于多轮代理，这意味着从第一轮就可靠的缓存与有时才是热缓存的缓存之间的区别。

您可以将 session_id 作为顶层请求体字段发送，或通过 x-session-id 头发送。在会话或代理运行期间保持其稳定，并保持在 256 字符以内。

使用与工作单元匹配的值：聊天线程、工单、工作流运行或代理任务。不要为每个回合创建新的 session_id，否则请求将无法到达持有缓存的提供者。

如果您使用路由模型，例如 Auto Router：https://openrouter.ai/docs/guides/routing/routers/auto-router#session-stickiness 或 Pareto Router：https://openrouter.ai/docs/guides/routing/routers/pareto-router#session-stickiness，则会话粘性不仅固定提供者，还会固定路由器选择的模型。这可防止会话中途中切换模型，从而保持行为一致并保持缓存活跃。

检查的最快方法是查看用量：https://openrouter.ai/docs/cookbook/administration/usage-accounting。

在响应中，usage.prompt_tokens_details.cached_tokens 显示从缓存读取了多少 tokens。如果大于零，表示请求命中了缓存。cache_write_tokens 显示在缓存写入请求期间写入了多少 tokens。

在此示例中，大多数提示 tokens 来自缓存，这一回合没有写入新的缓存条目。

您可以在三个地方检查缓存行为：活动页面上的详细视图：https://openrouter.ai/activity、/api/v1/generation API，以及 API 响应返回的 usage.prompt_tokens_details 对象。

使用 cache_discount 查看生成节省了多少。在付费写入的提供者上，您可能会在写入回合看到负折扣，因为缓存写入比普通输入更昂贵。在后续的缓存读取回合中，折扣应为正数。

当缓存看起来损坏时，通常归结为四种情况之一：提示太短、缓存过期、开头内容更改，或者请求转移到不同的提供者。

每个提供者都有最小提示大小，低于该大小时不进行缓存。在 Anthropic 上，Claude Opus 4.5 到 4.8 和 Claude Haiku 4.5 需要 4,096 个 tokens；Claude Haiku 3.5 需要 2,048；Claude Sonnet 4、4.5 和 4.6（以及 Opus 4 / 4.1）需要 1,024。OpenAI 需要 1,024。Gemini 2.5 Pro 需要 4,096；Gemini 2.5 Flash 需要 1,024。

如果你的可重复使用内容低于这个最小值，缓存将不会开始。不要为了强制缓存而在请求中填充无关文字。只在你已经有大量可重复使用内容的地方使用缓存：工具、模式、检索到的文档、示例或政策文本。

缓存寿命不长。Anthropic 的默认缓存时间是 5 分钟，长会话可选择 1 小时。Gemini 的隐式缓存大约持续 3-5 分钟，读取时不会重置。一旦缓存过期，下一个请求必须写入一个新的缓存。

如果你的用户在轮次之间经常暂停，请在支持的情况下使用更长的 TTL，或构建代理以在空闲期间接受新的写入。

当提示的开头保持不变时，自动和隐式缓存效果最好。将稳定的内容放在前面：系统指令、工具、模式和固定参考资料。将易变的内容放在后面：用户问题、时间戳、临时状态、工具输出和短期元数据。

细节很重要。首条系统消息中的时间戳会使每次提示看起来都是新的。如果不需要成为缓存内容的一部分，请将它移动到后续的用户或工具消息中。

缓存存在于其被写入的位置。如果后续请求路由到不同的提供者端点，该端点无法读取之前的缓存。

对于代理工作流，设置 session_id 并让粘性路由保持会话在热提供者上。有一个注意点：如果你自己设置了 provider.order，你的顺序会优先于粘性路由。如果你需要特定的提供者顺序，请使用提供者路由控制：https://openrouter.ai/docs/guides/routing/provider-selection。

如果你的代理每轮发送相同内容，请检查以下清单：

大致想象一个代理，在 6 轮中重复相同的 10,000 个令牌。

此示例仅涵盖重复内容。它忽略了较小的变化消息和模型的输出令牌。节省量会随着轮数增加而增长。

当你的代理反复发送相同的高成本内容时，缓存读取和粘性路由防止其成为循环中最昂贵的部分。

是的。OpenRouter 支持在支持的提供商和模型之间进行提示缓存。大多数提供商会自动启用，而 Anthropic 和阿里巴巴 Qwen 使用 cache_control 进行显式缓存。缓存读取费用取决于提供商，为正常输入价格的 0.1 倍到 0.5 倍，因此在第一次请求后重用的前缀成本会大大降低。

缓存读取费用取决于提供商，为正常输入价格的 0.1 倍到 0.5 倍。Anthropic、DeepSeek 和阿里巴巴 Qwen 的读取费用为 0.1 倍。OpenAI 的读取费用为 0.25 倍到 0.50 倍。Gemini、Grok 和 Moonshot 的读取费用为 0.25 倍。Groq 的读取费用为 0.5 倍。

常见原因包括提示低于提供商的最小令牌数、缓存过期、提示前缀不稳定，或者轮次之间提供商的漂移。对于代理工作流，首先设置一个稳定的 session_id，然后检查 usage 响应中的 cached_tokens，任何大于零的值都确认命中缓存。

为对话、工单或工作流运行传递一个稳定的 session_id。OpenRouter 使用它作为粘性路由键，因此后续请求会路由回同一个拥有热缓存的提供商端点。设置 session_id 后，粘性在第一次成功请求后激活，即在观察到任何缓存命中之前。

检查 usage.prompt_tokens_details.cached_tokens 以查看缓存读取情况，以及 cache_write_tokens 以查看缓存写入情况；cached_tokens 值大于零表示缓存命中。你也可以在响应中读取 cache_discount 来查看每次生成的成本影响，或者在活动页面打开详细信息视图：https://openrouter.ai/activity 或 /api/v1/generation API。

是的。在设置了 session_id 后，路由模型如 Auto Router 和 Pareto Router 会为对话固定解析模型和提供商，因此后续轮次会持续命中同一个热缓存。