> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sunra.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Token kullanımı

Her LLM yanıtı, isteğin tükettiği tokenleri bildiren bir `usage` nesnesi taşır. Sunra kullanımı, çağırdığınız endpoint'in semantiğiyle raporlar: bir Messages yanıtı Anthropic sözleşmesini, bir Chat Completions veya Responses yanıtı ise OpenAI sözleşmesini izler.

Bu biçimler kasıtlı olarak farklıdır. Bir Chat Completions yanıtını okuyan bir OpenAI SDK'sı OpenAI semantiğini varsayar, bir Messages yanıtını okuyan bir Anthropic SDK'sı ise Anthropic semantiğini varsayar. Her endpoint, tek bir ortak biçime zorlanmak yerine kendi spesifikasyonunun vaat ettiğine sadık kalır.

| Endpoint               | Prompt sayım alanı | Önbelleğe alınmış tokenler buna dahil mi?                                                           |
| ---------------------- | ------------------ | --------------------------------------------------------------------------------------------------- |
| `/v1/messages`         | `input_tokens`     | Hayır — üç girdi kovası birbirini dışlar                                                            |
| `/v1/chat/completions` | `prompt_tokens`    | Evet — önbelleğe alınmış tokenler bir alt kümedir, `prompt_tokens_details` içinde ayrıntılandırılır |
| `/v1/responses`        | `input_tokens`     | Evet — önbelleğe alınmış tokenler bir alt kümedir, `input_tokens_details` içinde ayrıntılandırılır  |

<Warning>
  `/v1/messages` ve `/v1/responses` her ikisi de `input_tokens` alan adını kullanır ve bu ad her ikisinde aynı anlama gelmez. Messages üzerinde yalnızca taze girdiyi ifade eder. Responses üzerinde ise önbelleğe alınmış tokenler dahil olmak üzere prompt'un tamamını ifade eder.
</Warning>

## Messages

`/v1/messages` üzerinde, üç girdi kovası **birbirini dışlar**. Hiçbir token iki kez sayılmaz, dolayısıyla prompt toplamı bunların toplamıdır:

```
total prompt = input_tokens + cache_creation_input_tokens + cache_read_input_tokens
```

<ResponseField name="input_tokens" type="integer">
  Yalnızca taze girdi tokenleri. Her iki önbellek kovasını da hariç tutar.
</ResponseField>

<ResponseField name="cache_creation_input_tokens" type="integer">
  Bu istek tarafından önbelleğe yazılan tokenler.
</ResponseField>

<ResponseField name="cache_read_input_tokens" type="integer">
  Bu isteğe önbellekten sunulan tokenler.
</ResponseField>

<ResponseField name="output_tokens" type="integer">
  Model tarafından üretilen tokenler.
</ResponseField>

<ResponseField name="total_tokens" type="integer">
  Üç girdi kovası artı `output_tokens`. Streaming olmayan yanıtlarda bulunur.
</ResponseField>

Bulunmayan veya `null` olan bir kova sıfır sayılır.

### Örnek senaryo

Aynı 19.000 tokenlik ön ek, `claude-opus-4-8` modeline iki kez gönderilir. İlk istek önbelleği yazar; ikincisi onu okur.

```json Soğuk istek (önbellek yazma) theme={null}
{
  "usage": {
    "input_tokens": 8,
    "cache_creation_input_tokens": 19349,
    "cache_read_input_tokens": 0,
    "output_tokens": 2,
    "total_tokens": 19359,
    "sunra_usage_semantics": "anthropic.exclusive.v1"
  }
}
```

```json Sıcak istek (önbellek okuma) theme={null}
{
  "usage": {
    "input_tokens": 8,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 19349,
    "output_tokens": 2,
    "total_tokens": 19359,
    "sunra_usage_semantics": "anthropic.exclusive.v1"
  }
}
```

`input_tokens` her iki istekte de 8'de kalır, çünkü her seferinde gerçekten yeni olan girdi 8'dir. 19.349 tokenlik ön ek, oluşturma kovasından okuma kovasına geçer. Her iki isteğin toplamı da aynı 19.359 tokendir, ancak maliyetleri aynı değildir: önbellek yazmaları ve önbellek okumaları kendi token başına fiyatlarıyla ücretlendirilir; bu yüzden ayrı kovalar olarak raporlanırlar.

## Chat Completions ve Responses

Bu endpoint'ler OpenAI semantiğini değiştirmeden raporlar. Prompt sayımı prompt'un **tamamıdır** ve önbelleğe alınmış tokenler bunun ayrıca raporlanan bir **alt kümesidir**.

```json /v1/chat/completions theme={null}
{
  "usage": {
    "prompt_tokens": 19357,
    "completion_tokens": 2,
    "total_tokens": 19359,
    "prompt_tokens_details": {
      "cached_tokens": 19349
    }
  }
}
```

`prompt_tokens` ile `cached_tokens` değerlerini toplamak çift sayıma yol açar. Bu endpoint'lerde taze girdiyi elde etmek için çıkarma yapın:

```
fresh input = prompt_tokens - prompt_tokens_details.cached_tokens
```

Aynı kural, `input_tokens` ve `input_tokens_details.cached_tokens` ile `/v1/responses` için de geçerlidir.

## `sunra_usage_semantics` işaretçisi

Sunra'nın normalleştirdiği yanıtlar, `usage` içinde bir işaretçi taşır:

```json theme={null}
"sunra_usage_semantics": "anthropic.exclusive.v1"
```

İşaretçi, herhangi bir tekil olaya ya da alana değil, **yanıta** dair bir taahhüttür. Streaming olmayan bir yanıtta kök `usage` nesnesinde görünür; streaming bir yanıtta ise girdi kovalarını taşıyan olay olan `message_start` içinde görünür. Bu değerle birlikte mevcut olduğunda, bu sayfadaki garantiler geçerlidir: üç girdi kovası birbirini dışlar ve `total_tokens` — bulunduğu yerde — bunların toplamı artı `output_tokens`'tır.

**Yokluğu da bir taahhüttür.** Sunra yalnızca ölçtüğü yanıt biçimlerini normalleştirir. Bunun dışındaki her şey upstream sağlayıcıdan olduğu gibi iletilir ve işaretlenmeden bırakılır; işaretçi taşımayan bir yanıt, kovalarına Sunra'nın kefil olmadığı bir yanıttır.

Bir yanıtın hangi yaklaşımı izlediğini tahmin etmek için sayıları incelemek yerine işaretçiyi doğrulayın. Bu alan tam da biçim koklamanın yerini almak için vardır — "kovalar prompt sayımından daha fazlasını topladığına göre birbirini dışlıyor olmalı" gibi bir sezgisel yöntem birden fazla yaklaşım tarafından karşılanır ve eninde sonunda bir yanıtı yanlış okur.

```python theme={null}
usage = response["usage"]

if usage.get("sunra_usage_semantics") == "anthropic.exclusive.v1":
    total_prompt = (
        usage["input_tokens"]
        + usage.get("cache_creation_input_tokens", 0)
        + usage.get("cache_read_input_tokens", 0)
    )
else:
    # Not normalized by Sunra. Treat the upstream shape as unverified
    # and consult that provider's own documentation.
    total_prompt = None
```

İşaretçiyi yalnızca `/v1/messages` yanıtları taşır. Chat Completions ve Responses, OpenAI spesifikasyonunu izler ve işaretlenmez.

Değer sürümlenmiştir. Bu alanların anlamındaki geriye dönük uyumsuz bir değişiklik yeni bir değerle yayınlanır; böylece `anthropic.exclusive.v1` ile yapılan bir eşitlik kontrolü sessizce farklı bir sözleşmeyi okumaya başlamaz.

## Streaming

Streaming ile yapılan bir Messages isteğinde kullanım bilgisi iki olaya yayılır. `message_start` girdi tarafını ve işaretçiyi taşır. Sonlandırıcı `message_delta` yalnızca `output_tokens` taşır. İşaretçiyi `message_start` içinde doğrulayın, ardından iki olayı olağan şekilde birleştirin — sonraki olayın kullanım bilgisini öncekinin üzerine uygulayın — böylece yukarıda belgelenen değerlere ulaşırsınız.

`total_tokens`, streaming yanıtlarda yer almaz. Hiçbir olay hem girdi hem de çıktı tarafını bilmez, dolayısıyla akış sırasında hesaplanan herhangi bir toplam yanlış olur. Akış tamamlandığında kovaları kendiniz toplayın.

## Önceki davranıştan geçiş

Sunra daha önce `/v1/messages` üzerinde upstream `usage` nesnesini olduğu gibi iletiyordu. Bazı sağlayıcıların önündeki çeviri katmanı, önbellek oluşturma tokenlerini `input_tokens` **içine** katlar; bu nedenle Anthropic sözleşmesini izleyip üç kovayı toplayan bir çağıran, önbellek oluşturma tokenlerini iki kez saymış olur.

* **Üç kovayı topluyorsanız**, Anthropic sözleşmesinin tarif ettiği gibi, artık doğrusunuz. Sizin tarafınızda bir değişiklik gerekmez.
* **Eski davranışı telafi ediyorduysanız** — `cache_creation_input_tokens` değerini `input_tokens` içinden kendiniz çıkararak veya katlamayı başka bir şekilde tersine mühendislikle çözerek — **durun**. Bu düzeltme artık zaten hariç tutulmuş tokenleri çıkarır ve girdinizi olduğundan az gösterir.
* **`total_tokens` değerini okuyorsanız**, tam sayımı raporlamaya devam eder: taze girdi, her iki önbellek kovası ve çıktı.

Değişikliği bir dağıtım tarihine değil işaretçiye bağlayın; böylece aynı kod yolu hem işaretli hem de işaretsiz yanıtlar için doğru olur.
