Поле usage

Объект `usage` — счётчики в конверте того же протокола, что и сам ответ. Рублёвое списание туда не пишем: оно в кабинете и в API расходов организации.

Не на каждом маршруте usage есть. Синтез речи отдаёт файл. Часть моделей картинок не присылает счётчики. Realtime копится в событиях сокета, а не в HTTP-ответе на секрет.

МаршрутЧто приходит клиентуКогда списываем
Chat, Completions, Messages, Responses, Embeddings, Decisionsusage с токенамисразу после успеха
Imagesdata[]; usage — не у всех моделейсразу, за штуку изображения
Speechбинарный файл, без JSONсразу, за символы input
Transcriptions / Translationsusage.seconds или токены, либо durationсразу
Videosзадача; секунды в seconds / duration / usage.secondsпри status: completed
RealtimeHTTP без usage; в сокете — response.usageпри закрытии соединения

В потоке SSE те же поля — в финальном chunk или событии завершения. Подробнее — потоковая передача.

Chat Completions и Completions

{
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 5,
    "total_tokens": 17,
    "prompt_tokens_details": { "cached_tokens": 8 },
    "completion_tokens_details": { "reasoning_tokens": 3 }
  }
}
ПолеЧто считает
prompt_tokensВход
completion_tokensВыход
total_tokensСумма, если поставщик её прислал
prompt_tokens_details.cached_tokensПрочитанный prompt cache
completion_tokens_details.reasoning_tokensТокены рассуждения, если модель их отдаёт

Для embeddings обычно только prompt_tokens и total_tokens.

Decisions

POST /decisions отдаёт usage.input_tokens и usage.output_tokens (у моделей «решения» выход часто нулевой). Поле cost может прийти от поставщика — это не счёт LLM Mart; ориентир по деньгам — кабинет.

Responses

{
  "usage": {
    "input_tokens": 12,
    "output_tokens": 5,
    "total_tokens": 17,
    "input_tokens_details": { "cached_tokens": 8 }
  }
}
ПолеЧто считает
input_tokensВход
output_tokensВыход
total_tokensСумма
input_tokens_details.cached_tokensПрочитанный cache

Anthropic Messages

{
  "usage": {
    "input_tokens": 12,
    "output_tokens": 5,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0
  }
}
ПолеЧто считает
input_tokensВход
output_tokensВыход
cache_creation_input_tokensЗапись в prompt cache
cache_read_input_tokensЧтение из prompt cache

Изображения

POST /images/generations, /images/edits, /images/variations. Ответ — { "created", "data": [ … ] }.

У части моделей (например gpt-image) в теле есть токены:

{
  "usage": {
    "input_tokens": 8,
    "output_tokens": 1056,
    "total_tokens": 1064,
    "input_tokens_details": {
      "text_tokens": 8,
      "image_tokens": 0
    }
  }
}

У DALL·E и части поставщиков блока usage нет — это нормально. Шлюз его не дописывает.

Списание в кабинете — за число элементов в data (параметр n, по умолчанию 1), не по токенам из usage.

Аудио

Синтез речи

POST /audio/speech отдаёт файл (audio/mpeg и т.п.), не JSON. Поля usage нет.

Списание — по числу символов в input (или prompt, если input пустой).

Транскрипция и перевод

POST /audio/transcriptions и /audio/translations. Два типичных конверта.

Длительность (Whisper и новый формат OpenAI):

{
  "text": "…",
  "usage": { "type": "duration", "seconds": 2.5 }
}

Если response_format=verbose_json, секунды могут лежать сверху как duration, без объекта usage.

Токены (модели вроде gpt-4o-transcribe):

{
  "text": "…",
  "usage": {
    "type": "tokens",
    "input_tokens": 14,
    "output_tokens": 11,
    "total_tokens": 25,
    "input_token_details": { "audio_tokens": 14, "text_tokens": 0 }
  }
}

Для кабинета: если есть секунды (usage.seconds или duration) — считаем их; иначе берём входные токены. Выходные токены транскрипции в списание не идут.

Видео

POST /videos сразу возвращает задачу, не готовый ролик. Скачивание GET /videos/{id}/content — файл без usage.

{
  "id": "vid_…",
  "status": "completed",
  "model": "…",
  "seconds": "4",
  "usage": { "seconds": 4 }
}

Секунды могут быть в seconds, duration или usage.seconds — как прислал поставщик. Списание — когда статус стал completed (в том числе remix). Пока задача queued / in_progress, денег нет.

GET /videos (список всех задач) не поддерживается.

Realtime

POST /realtime/client_secrets и /realtime/sessions usage не содержат — это только вход в сокет.

Счётчики приходят в событиях WebSocket, обычно response.done:

{
  "type": "response.done",
  "response": {
    "usage": {
      "input_tokens": 3,
      "output_tokens": 2,
      "input_token_details": { "audio_tokens": 1 },
      "output_token_details": { "audio_tokens": 4 }
    }
  }
}

На сессию — одна запись в учёте. Фиксируется при закрытии соединения (в том числе по неактивности 600 с).

Чего в usage нет

  • Цены в рублях, НДС, комиссия платформы.
  • Имя поставщика и маршрут биржи.

Если в JSON всё же есть поле cost, это не счёт LLM Mart. Ориентир по деньгам — кабинет.

Что дальше