Поле usage
Объект `usage` — счётчики в конверте того же протокола, что и сам ответ. Рублёвое списание туда не пишем: оно в кабинете и в API расходов организации.
Не на каждом маршруте usage есть. Синтез речи отдаёт файл. Часть моделей картинок не присылает счётчики. Realtime копится в событиях сокета, а не в HTTP-ответе на секрет.
| Маршрут | Что приходит клиенту | Когда списываем |
|---|---|---|
| Chat, Completions, Messages, Responses, Embeddings, Decisions | usage с токенами | сразу после успеха |
| Images | data[]; usage — не у всех моделей | сразу, за штуку изображения |
| Speech | бинарный файл, без JSON | сразу, за символы input |
| Transcriptions / Translations | usage.seconds или токены, либо duration | сразу |
| Videos | задача; секунды в seconds / duration / usage.seconds | при status: completed |
| Realtime | HTTP без 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. Ориентир по деньгам — кабинет.