Dokümantasyon

Dokümantasyon

İstem önbelleğe alma

Bir kez cache_control ile istemin sabit önekini işaretleyin — ya da bu alanı içermeyen OpenAI biçiminde bir Claude modeline ulaşın; Kunavo sizin için kesme noktalarını yerleştirir. Öneki yeniden kullanan sonraki her çağrı, bu kısmı girdi fiyatının bir bölümü üzerinden ücretlendirir — çoğu sohbet modelinde girdi fiyatına göre 10% oranında, en düşük 2.5% oranında. Kunavo'nun yönlendirme katmanı, konuşmanızı aynı üst sağlayıcı anahtarına sabitleyerek önbelleği sıcak tutar.

30 bin token'lık bir sistem isteminde Claude Sonnet 5 ile önbellek okuma maliyeti $1.4 / 1M yerine $0.14 / 1M olur. Oturum başına aynı bağlamı 50 kez yeniden gönderen bir ajan için önbellek, girdi faturasını yaklaşık %90 azaltır.

Nasıl etkinleştirilir

Herhangi bir sistem bloğuna, mesaja veya araç tanımına bir cache_control: { type: "ephemeral" } kesme noktası ekleyin. Model ilk çağrıda bu noktaya kadarki bölümü önbelleğe alır; aynı önek baytlarını paylaşan sonraki çağrılar önbelleği kullanır.

cache_example.py
from openai import OpenAI

client = OpenAI(
    api_key="sk-kn-...",
    base_url="https://api.kunavo.com/v1",
)

# Mark the large, stable prefix once with cache_control.
# Every subsequent call that sends the same prefix reads it back
# from cache at 0.10× the input rate on Claude Sonnet 5.
# Per-model rates are in the pricing table below.
SYSTEM = [
    {
        "type": "text",
        "text": open("long_system_prompt.txt").read(),
        "cache_control": {"type": "ephemeral"},
    },
]

resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": "Summarize the doc above in 3 bullets."},
    ],
)

u = resp.usage
# OpenAI-compat fields populated by Kunavo:
# - prompt_tokens_details.cached_tokens — read from cache
# - cache_creation_input_tokens          — written to cache this call
print(u.prompt_tokens_details.cached_tokens,
      getattr(u, "cache_creation_input_tokens", 0))

Anthropic'in kendi Messages API'sinde aynı veri iletim biçimi kullanılır — cache_control Claude'a çevrilmeden aktarılır:

messages_api.sh
# Native Anthropic Messages API — cache_control passes through untranslated.
curl https://api.kunavo.com/v1/messages \
  -H "Authorization: Bearer $KUNAVO_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "system": [
      {
        "type": "text",
        "text": "<your large stable system prompt>",
        "cache_control": { "type": "ephemeral" }
      }
    ],
    "messages": [
      { "role": "user", "content": "Summarize the doc above in 3 bullets." }
    ],
    "max_tokens": 1024
  }'
Baytların aynı olması önemlidir. Önbellek anahtarı içerik adreslidir. Önekin herhangi bir yerindeki tek bir farklı karakter, o bölümün önbelleğini geçersiz kılar. Dinamik içeriği (zaman damgaları, kullanıcı adları, çağrı başına kimlikler) önbelleğe alınan bloğun ardına koyun, içine değil.

OpenAI biçimli uç noktalarda otomatik kesme noktaları

OpenAI Chat Completions ve Responses biçimlerinde cache_control alanı hiç yoktur — OpenAI kendi sunucularında örtük olarak önbelleğe alır. Claude ise bunu yapmaz: yalnızca bir kesme noktasıyla işaretlenen içeriği önbelleğe alır. Dolayısıyla OpenAI konuşan bir istemcinin önbelleğe alma isteğinde bulunma yolu yoktur; isteğinin doğrudan çevirisi Claude'a ulaştığında hiçbir kesme noktası içermez ve uzun bir sohbetin her turunda tüm geçmiş tam girdi ücreti üzerinden yeniden ücretlendirilir.

Dolayısıyla /v1/chat/completions veya /v1/responses üzerinden bir Claude modeline ulaştığınızda Kunavo, protokolün taşıyamadığı kesme noktalarını ayarlar. Etkinleştirmeniz gereken bir şey yoktur. Bu yalnızca Claude modelleri için geçerlidir — diğer tüm model aileleri, sağlayıcılarının örtük önbelleğe aldığı bir protokol üzerinden sunulur ve yerleştirilecek kesme noktaları yoktur.

no_cache_control.py
# Plain OpenAI Chat Completions — no cache_control anywhere in the body.
# The format has no field for one; Kunavo inserts the breakpoints instead.
resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[
        {"role": "system", "content": LONG_SYSTEM_PROMPT},
        {"role": "user", "content": "first question"},
        {"role": "assistant", "content": "...previous answer..."},
        {"role": "user", "content": "follow-up"},
    ],
)

u = resp.usage
# Turn that writes the cache:
#   u.cache_creation_input_tokens            -> 18,000
#   u.prompt_tokens_details.cached_tokens    ->      0
# Next turn, same prefix, inside the 5-minute window:
#   u.cache_creation_input_tokens            ->    240   (only the new turn)
#   u.prompt_tokens_details.cached_tokens    -> 18,000
#
# Both stuck at 0 on a conversation well over the threshold? The prefix is
# changing between calls — a timestamp or request id inside the cached span.

Nereye ve bütçenin hangi sırayla harcandığına bakalım:

  • Son mesaja eklenen kayan bir kesme noktası — son mesajın son içerik bloğuna eklenir; böylece ondan önceki her şey önbelleğe alınır. İstek, sohbette kalan bir sistem mesajıyla bitiyorsa (aşağıya bakın), bunun yerine o mesajın hemen önündeki bloğa eklenir. Yalnızca messages zaten bir asistan turu içerdiğinde eklenir: önbelleğe yazma, girdinin 1.25× kadar ücretlendirilir; bu nedenle kimsenin yeniden göndermeyeceği bir istemi işaretlemek dörtte bir oranında fazladan ücrete yol açar ve hiçbir tasarruf sağlamaz. Önceki bir asistan turu, bu kesin önekin yeniden gönderilmek üzere olduğunun göstergesidir.
  • system üzerinde bir, tools üzerinde bir — istemin sabit başlangıç kısmı. Tek seferlik bir çağrıda bile işaretlemeye değer; çünkü sistem istemini bir kez gönderen bir çağıran, sonraki çağrıda neredeyse her zaman aynısını gönderir.
  • Sohbette kalan bir sistem mesajının önünde — kayan nokta ile system ve tools noktalarından artan bütçe, ardından başka bir şey gelen bu tür mesajların sonuncusunun hemen önündeki bloğa, sonra da bir öncekinin önüne eklenir. En son doldurulur, çünkü buna yalnızca böyle bir mesajı turdan tura taşıyan bir istemci ihtiyaç duyar; böyle bir mesaj içermeyen bir sohbette, ki sohbetlerin neredeyse tamamı böyledir, bu konum yoktur.

İki sınır bunu kısıtlar. İstem — mesajlar, system ve araç şemaları dâhil — 8.192 karakterden kısaysa hiçbir şey eklenmez: Anthropic, kendi minimum önbelleğe alınabilir uzunluğundan (1.024 token, Haiku'da 2.048) kısa bir önek üzerindeki kesme noktasını sessizce yok sayar ve ne yazma ne de okuma ücreti alır; dolayısıyla böyle bir noktayı eklemek hiçbir fayda sağlamaz. Ayrıca Anthropic istek başına en fazla 4 kesme noktasını kabul eder — beşinci nokta sessizce yok sayılmaz, doğrudan 400 hatası verir.

Modelin ilk yanıtından sonra gönderilen bir sistem ya da developer mesajı system alanına taşınmaz; gönderildiği turda, sohbetin içinde kalır. Taşınsaydı, eklendiği turda istemin başı değişir ve tüm geçmiş önbelleğe yeniden yazılırdı. Üst sağlayıcı kabul ediyorsa Claude bunu bir sistem mesajı olarak alır; aksi hâlde o kullanıcı turunun içinde, <system-reminder> etiketleri arasında metin olarak alır. Modelin ilk yanıtından önce gönderilen bir sistem mesajı ya da kendi kesme noktası bir saatlik önbellek isteyen bir mesaj yine system alanına gider.

Kendi kesme noktalarınız asla taşınmaz veya kaldırılmaz. Bunlar da aynı 4 nokta sınırına dâhildir; Kunavo yalnızca boş bıraktığınız konumları doldurur. 4 noktalı kendi düzeninizi gönderirseniz hiçbir şey eklenmez; 1 nokta gönderirseniz çevresine en fazla 3 nokta eklenebilir. Bütçe kısıtlı olduğunda önce en derindeki konum doldurulur — istemin sonlarına doğru bir kesme noktası, öncesindeki her şeyi önbelleğe alır; bu nedenle ilerleyen kesme noktası en değerlisidir. Anthropic'in kendi /v1/messages uç noktasında hiçbir şey eklenmez: gövdeniz gönderildiği gibi aktarılır ve içindeki tüm kesme noktaları size aittir.
Kesme noktası, önbellek isabeti anlamına gelmez. Bir önekin önbelleğe alınabilir olduğunu işaretler; isabet için aynı önek baytlarının Anthropic'in geçici penceresi içinde — beş dakika, her okumada yenilenir — yeniden gönderilmesi ve aşağıda açıklanan yakınlık yönlendirmesinin sağladığı şekilde aynı üst sağlayıcı anahtarına yönlendirilmesi gerekir. Yeni bir önekle yapılan ilk çağrı her zaman yazmadır, asla okuma değildir; her turda değişen bir istem, kesme noktaları nereye yerleştirilirse yerleştirilsin isabet sağlamaz.

Raporlamada hiçbir şey değişmez: Yanıt alanları bölümünde açıklanan aynı cached_tokens ve cache_creation_input_tokens alanları, kesme noktalarını siz eklemiş olsanız da ağ geçidi eklemiş olsa da doldurulur. Bu nedenle, eklenen bir kesme noktasının gerçekten isabet sağladığını kullanım nesnesinden kontrol edebilirsiniz.

Fiyatlandırma

Önbellek ücretleri her modelin girdi fiyatından ve sağlayıcının kendi oranlarından hesaplanır — aşağıdaki tablolar esas alınmalıdır ve içlerindeki her ücret, elle girilmek yerine ilgili modelin girdi fiyatından hesaplanır. Önbellek okumaları, hem Anthropic'te hem OpenAI'de girdi ücretinin 0.10× oranında ücretlendirilir, 2 istisna ile: 0.025× on Claude Fable 5.1, 0.05× on Claude Opus 5.5. Önbellek yazmaları, tüm Claude modellerinde ve GPT-6 Astra, GPT-6 Sol, GPT-6 Luna, GPT-5.6 Sol ve GPT-5.6 Terra üzerinde girdi ücretinin 1.25× oranında ücretlendirilir. Kunavo, Claude'un 1 saat TTL'li yazmalarını da aynı 1.25× oranında ücretlendirir; bu, Anthropic'in 2× oranından düşüktür. Diğer tüm modellerde ayrı bir yazma fiyatı yoktur: yazmalar normal girdi ücreti üzerinden ücretlendirilir. Her iki durumda da bir kez bile yeniden kullanılan bir öneğin önbelleğe alınmış hâli, yeni gönderilmesinden daha ucuza gelir. Her sınıfa modelin kendi indirimi uygulanır; bu nedenle önbellek fiyatları da modelin girdi ve çıktı fiyatları gibi sağlayıcının liste fiyatından aynı oranda indirimlidir.

Anthropic

ModelInputCache readCache write
Claude Fable 5.1$7$0.175 0.025×$8.75 1.25×
Claude Fable 5$7$0.7 0.10×$8.75 1.25×
Claude Opus 5.5$2.8$0.14 0.050×$3.5 1.25×
Claude Opus 5$3.5$0.35 0.10×$4.375 1.25×
Claude Opus 4.8$3.5$0.35 0.10×$4.375 1.25×
Claude Opus 4.7$3.5$0.35 0.10×$4.375 1.25×
Claude Opus 4.6$3.5$0.35 0.10×$4.375 1.25×
Claude Sonnet 5$1.4$0.14 0.10×$1.75 1.25×
Claude Sonnet 4.6$2.1$0.21 0.10×$2.625 1.25×
Claude Haiku 4.5$0.7$0.07 0.10×$0.875 1.25×

OpenAI

ModelInputCache readCache write
GPT-6 Astra$4$0.4 0.10×$5 1.25×
GPT-6 Sol$0.8$0.08 0.10×$1 1.25×
GPT-6 Luna$0.04$0.004 0.10×$0.05 1.25×
GPT-5.6 Sol$2$0.2 0.10×$2.5 1.25×
GPT-5.6 Terra$0.7$0.07 0.10×$0.875 1.25×
GPT-5.5$2$0.2 0.10×$2 1×
Uzun istemler, sağlayıcının uzun bağlam kademesinden ücretlendirilir. Eşiği aştığınızda isteğin tamamı, önbellek okumaları ve yazmaları dâhil, modelin girdi ve çıktı fiyatlarının katı üzerinden ücretlendirilir: 272K girdi token'ını aşan istemlerde GPT-6 Astra, GPT-6 Sol, GPT-6 Luna, GPT-5.6 Sol, GPT-5.6 Terra ve GPT-5.5 için (2× girdi, 1.5× çıktı). Claude'un uzun bağlam ek ücreti yoktur: 1 milyonluk bağlamı standart ücret üzerinden faturalandırılır.
Katalog taban fiyatı, önbelleği hesaba katar. Kunavo çağrı başına max(catalog_cost, upstream × markup) ücret alır — taban fiyat, yeni girdi fiyatına göre değil, önbelleğe alınmış girdi ücretine göre hesaplanır; böylece tasarruf size yansır, etkisiz hâle gelmez.
Yukarıdaki ücretler katalog fiyatlarıdır. Gerçek çağrı başına fatura, modelin fiilen tükettiği üst sağlayıcı kredilerinden (marj eklenerek) hesaplanır ve ardından katalog fiyatına yükseltilir. Önbellek isabetlerinde üst sağlayıcı daha az kredi alır; bu nedenle üst sağlayıcı maliyeti × marj dalı genellikle katalog fiyatının altında kalır ve katalog fiyatı dalı uygulanır. Kısacası katalog fiyatı, en kötü durumdaki fiyatınızdır; önbellekli çağrılar bunun altında kalabilir, ancak üzerine çıkmaz.

Yakınlık yönlendirmesi önbelleği sıcak tutar

Üst sağlayıcıların istem önbellekleri API anahtarı başına tutulur. Her istek rastgele bir üst sağlayıcı anahtarına yönlendirilirse önbellek isabet oranı yaklaşık 1/N olur. Kunavo, sistem isteminizden ve ilk kullanıcı mesajınızdan sabit bir karma türetir ve aynı öneke sahip tüm çağrıları aynı üst sağlayıcı anahtarına yönlendirir — ağırlıklı rendezvous hashing kullanarak havuz değiştiğinde yalnızca yaklaşık 1/N anahtarı yeniden eşler.

Herhangi bir ayar yapmanız gerekmez. Yakınlık yönlendirmesi tüm sohbet çağrılarına otomatik olarak uygulanır. (Görsel / video / TTS isteklerinde rastgele yönlendirme kullanılır — bu kipler için anahtar başına önbellek yoktur.)

Kontrol paneli ölçümleri

Çağrılarınız önbellekten yararlanmaya başladığında /app/usage, seçili zaman aralığı için toplam iki ölçüm sunar:

  • İsabet oranı — önbellekten sunulan girdi token'ları ÷ toplam girdi token'ları. Çağrı başına token sayılarından hesaplanır ve kesindir.
  • Tasarruf — bu zaman aralığında USD cinsinden tasarruf; her model için ayrı ayrı ve modelin gerçek önbellek okuma ücreti kullanılarak hesaplanır (düz ortalama varsayımı yapılmaz). Bu, katalog fiyatlarıyla hesaplanan bir tahmindir — gerçek faturalar katalog fiyatıyla tabanlandığından ve önbellekli çağrılar bu tabanın altında kalabildiğinden, bu rakam fiilî tasarruf için oldukça dar bir üst sınırdır. Tipik sohbet iş yüklerinde ikisi arasındaki fark birkaç yüzdeyi geçmez.

Her çağrının ayrıntı sayfasında (/app/usage/<id>) sıfırdan farklı olduklarında önbelleğe alınan ve önbelleğe yazılan token sayıları ile fiilen faturalandırılan tutar gösterilir.

Yanıt alanları

Kunavo, önbellek token'larını her iki yanıt biçiminde de sunar. OpenAI ile uyumlu /v1/chat/completions uç noktasında:

AlanAnlam
usage.prompt_tokensToplam girdi token'ı (önbelleğe alınan ve önbelleğe yazılan token'lar dâhildir).
usage.prompt_tokens_details.cached_tokensGirdinin önbellekten sunulan alt kümesi.
usage.cache_creation_input_tokensBu çağrıda önbelleğe yazılan token'lar (yukarıdaki tablolarda modelin önbellek yazma ücreti üzerinden faturalandırılır).

/v1/messages adresindeki Anthropic'e özgü Messages API'de Anthropic'in özgün alanları olduğu gibi aktarılır:

AlanAnlam
input_tokensYeni (önbelleğe alınmamış) girdi.
cache_read_input_tokensÖnbellekten sunulur, girdi ücretinin 0.10× oranında faturalandırılır (Claude Fable 5.1 için 0,025×, Claude Opus 5.5 için 0,05×).
cache_creation_input_tokensBu çağrıda önbelleğe yazılır (girdi ücretinin 1,25× katı üzerinden faturalandırılır; 1 saat TTL'li yazmalar da buna dâhildir ve Anthropic'in 2× oranından düşüktür).

Sonraki adımlar