Search the alley

記事を検索

2文字以上でタイトル・カテゴリ・タグを検索できます。

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で指定可能
fallbacksticky 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 readcached_tokensとread価格hitをusageで確認する
TTL5分・1時間などproviderごとの期限長時間agentでは有効期間を再確認する
privacyproviderの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条件は決まりません。

関連記事