OpenRouterのPrompt CachingとSticky Routingとは?料金を読む条件
OpenRouterのPrompt CachingとProvider Sticky Routingを、cache hit・provider差・session_id・fallback・料金・privacyの条件から整理します。
公開 2026.07.29 / 更新 2026.07.29
Prompt Cachingは、同じ長い入力を繰り返すときのcache readを使う仕組みです。Sticky Routingは、そのcacheを持つproviderへ会話を戻しやすくします。ただし、対応model・provider・TTL・cache hitが揃わなければ、名前を設定しただけで料金が下がるわけではありません。
- Prompt CachingとSticky Routingの役割差
- cache hit・session_id・fallback・料金の見方
- server-sideでusageを確認する方法
- 全model・全provider対応の断定
- 実測していない節約率
- providerの永続固定やデータ保持なしの保証
この記事のポイント
- Prompt Cachingはprovider・modelごとに自動または明示指定、cache write/readの価格、TTLが異なる
- Sticky Routingはcacheを保持するproviderへ後続requestを戻す仕組みで、常に同じproviderを永久固定する保証ではない
- session_idを使うと成功したrequestからsticky routingを始められるが、provider障害時はfallbackが起きる
- cached_tokens、cache_write_tokens、cache_discountなどのusageを見て、cache hitを推測ではなく確認する
Prompt CachingとSticky Routingを混同しない
| Prompt Caching | 繰り返すpromptの一部をprovider側cacheから読めるようにする |
| Sticky Routing | 同じmodel・会話の後続requestをcacheを持つproviderへ戻しやすくする |
| session_id | 会話のrouting keyを明示する。bodyまたはx-session-id headerで指定可能 |
| fallback | sticky providerが利用できない場合に別providerへ移るため、cache missや条件差を確認する |
Prompt Cachingは、system prompt、tool定義、長い参照資料など、複数turnで同じ部分を再利用するための仕組みです。Sticky Routingはcacheを持つproviderへ後続turnを戻しやすくしますが、対応条件が揃ったかはusageのcached_tokensなどで確認します。
Prompt Cachingは、毎回同じ入力なら必ず安くなる機能ではない
cache readが通常入力より安いproviderもありますが、最初のcache write、短すぎるprompt、TTL切れ、固定prefixの変更、provider移動でhitしないことがあります。Anthropicのように5分・1時間のTTLやcache writeの価格が分かれる例もあるため、providerの説明を一括して扱いません。
| 確認項目 | 見ること | 記事での扱い |
|---|---|---|
| 対応範囲 | model・providerごとのimplicit / explicit caching | 対応一覧を全modelへ一般化しない |
| cache write | 初回に書き込むtokenと価格 | 一度だけの実行では効果を期待しない |
| cache read | cached_tokensとread価格 | hitをusageで確認する |
| TTL | 5分・1時間などproviderごとの期限 | 長時間agentでは有効期間を再確認する |
| privacy | providerのlogging・retention・ZDR条件 | cacheをデータ保持なしと読み替えない |
Sticky Routingは、cacheのための条件付きの戻り道
OpenRouterの公式Docsでは、cacheを使ったrequestのproviderを記憶し、同じmodelの後続requestを同じprovider endpointへ戻す仕組みとして説明されています。デフォルトは会話の冒頭メッセージをもとに会話を識別し、session_idを指定すればその値をrouting keyに使います。手動のprovider.orderを指定した場合は明示した順序が優先されます。
- multi-turn agentの会話ごとにsession_idを安定させる
- session_idは最大256文字。ユーザーの秘密情報や生のpromptをそのままIDにしない
- sticky providerが不調ならfallbackが起こり、別providerでcache missや価格差が生じ得る
- session_idを使えばcache hit前からsticky routingが始まると公式Docsにあるが、成功requestと利用条件は確認する
server-sideでcache hitを確認する最小例
以下はOpenRouter公式Docsにあるsession_id・cache_control・Chat Completionsの契約を、server-sideのPythonで確認する最小例です。API keyは環境変数から読み、レスポンスのusageだけを観測します。model名とTTLは例であり、料金や提供状態の固定値ではありません。
import os
import requests
payload = {
"model": "~anthropic/claude-sonnet-latest",
"session_id": "agent-session-2026-07-29",
"cache_control": {"type": "ephemeral"},
"messages": [
{"role": "system", "content": "Use the project policy and return a short plan."},
{"role": "user", "content": "Review this task."},
],
}
response = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={
"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}",
"Content-Type": "application/json",
},
json=payload,
timeout=30,
)
response.raise_for_status()
data = response.json()
usage = data.get("usage", {})
prompt_details = usage.get("prompt_tokens_details", {})
print({
"cached_tokens": prompt_details.get("cached_tokens"),
"cache_write_tokens": prompt_details.get("cache_write_tokens"),
"cache_discount": usage.get("cache_discount"),
})cache hitを料金の証拠にする確認順
- 同じmodel、同じprovider条件、同じ固定prefixで2回以上の小さなテストをする
- cached_tokensが増えたか、cache_write_tokensが初回だけかをusageで見る
- cache_discount、入力・出力token、失敗・retry、最終providerを同じログで残す
- session_idやprovider指定を変えたテストを別条件として比較する
- 料金は公式model pageと請求画面で再確認し、単一テストから節約率を推定しない
よくある質問
Sticky Routingを使えば、必ず同じproviderに固定されますか?
必ずではありません。公式Docsではcacheやsession_idをもとに同じproviderへ戻しますが、手動provider.orderの優先、provider障害時のfallback、model・会話条件を分けて確認します。
cache hitはどこで確認できますか?
OpenRouter公式DocsではActivityの詳細、generation API、レスポンスusageのprompt_tokens_detailsを確認先として案内しています。cached_tokens、cache_write_tokens、cache_discountをログに残します。
Prompt Cachingなら入力内容は保存されませんか?
そう断定できません。providerごとのlogging・retention・ZDR条件と、cacheの有効条件を別々に公式ページで確認してください。cache機能の存在だけでprivacy条件は決まりません。
関連記事
- DeepSeek公式APIとOpenRouter経由の料金は同じ?値上げ時に確認したいルートの違い
DeepSeek公式APIのピーク時価格が、OpenRouter経由にもそのまま反映されるとは限りません。請求主体とprovider情報を分けて確認します。