Chat Completions
Основной эндпоинт API. Формат запроса и ответа совпадает с OpenAI — код и SDK переносятся без правок.
Эндпоинт
https://api.tokendock.cloud/v1/chat/completions
Принимает историю сообщений, возвращает ответ модели — целиком или потоком. Обязательных полей два:
model и messages. Всё остальное имеет значения по умолчанию.
- Заголовок
Authorization: Bearer sk-td-…иContent-Type: application/json. - Модель указывается полным id из каталога, вместе с вендором.
- Ответ в формате OpenAI — SDK и клиенты разбирают его без адаптеров.
curl https://api.tokendock.cloud/v1/chat/completions \
-H "Authorization: Bearer $TOKENDOCK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4.1-mini",
"messages": [
{ "role": "user", "content": "Привет. Ответь одним предложением." }
]
}' Параметры запроса
Неизвестные поля игнорируются, поэтому код, написанный под другой вендор, не ломается. Параметры, которые модель не поддерживает, тоже игнорируются — сравнить возможности можно по тегам в каталоге.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| model | string | — | Обязательный. Полный id модели из каталога, вместе с вендором: openai/gpt-4.1-mini, anthropic/claude-4.5-sonnet. |
| messages | array | — | Обязательный. История диалога. Каждый элемент — объект с role (system, user, assistant, tool) и content. |
| temperature | number | 1 | От 0 до 2. Ниже — ответы стабильнее и суше, выше — разнообразнее. Для извлечения данных берите 0–0.3. |
| top_p | number | 1 | Nucleus sampling. Меняйте что-то одно — либо temperature, либо top_p. |
| max_tokens | integer | без ограничения | Верхняя граница длины ответа в токенах. По умолчанию ограничением служит контекст модели. |
| stop | string | array | null | До четырёх стоп-последовательностей. Генерация обрывается перед стоп-строкой, сама строка в ответ не попадает. |
| stream | boolean | false | true — ответ приходит потоком server-sent events по мере генерации. |
| response_format | object | text | Тип json_object заставляет модель вернуть валидный JSON. Поддерживается не всеми моделями. |
| tools | array | — | Описания функций, которые модель может вызвать: имя, описание, JSON Schema параметров. |
| tool_choice | string | object | auto | auto, none, required или конкретная функция по имени. Работает только вместе с tools. |
| seed | integer | — | Попытка воспроизводимого результата при одинаковом запросе. Гарантий нет — это свойство модели, а не шлюза. |
| user | string | — | Ваш идентификатор конечного пользователя. Попадает в аналитику расходов, помогает искать источник нагрузки. |
Примеры запросов
System-сообщение и параметры генерации
Роль system задаёт правила поведения на весь диалог. Низкая
temperature нужна там, где ответ должен быть предсказуемым.
{
"model": "openai/gpt-4.1-mini",
"messages": [
{
"role": "system",
"content": "Ты технический ассистент. Отвечай коротко, без вступлений и извинений."
},
{
"role": "user",
"content": "Чем ClickHouse отличается от PostgreSQL для аналитики?"
}
],
"temperature": 0.3,
"max_tokens": 500
} Вызов функций (tools)
Опишите функции в поле tools — модель сама решит, когда их вызвать. Ответ придёт с
finish_reason: "tool_calls", а content будет пустым.
{
"model": "anthropic/claude-4.5-sonnet",
"messages": [
{ "role": "user", "content": "Какая сейчас погода в Новосибирске?" }
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Текущая погода в городе",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "Название города" },
"units": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["city"]
}
}
}
],
"tool_choice": "auto"
}
Аргументы приходят строкой с JSON внутри — её нужно распарсить. Выполните функцию у себя и отправьте результат
обратно сообщением с ролью tool и тем же tool_call_id.
{
"id": "chatcmpl-td-2b7e05c9d41f",
"object": "chat.completion",
"created": 1787046102,
"model": "anthropic/claude-4.5-sonnet",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_td_8a1f",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\":\"Новосибирск\",\"units\":\"celsius\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 96,
"completion_tokens": 28,
"total_tokens": 124
}
} Структурированный вывод
{ "type": "json_object" } обязывает модель вернуть валидный JSON. Формат полей всё
равно опишите в system-сообщении: режим гарантирует синтаксис, а не схему.
{
"model": "openai/gpt-4.1-mini",
"messages": [
{
"role": "system",
"content": "Верни только JSON с полями items, delivery и total. Без пояснений."
},
{
"role": "user",
"content": "Заказ: 2 ноутбука по 89 900 ₽, доставка 1 200 ₽."
}
],
"response_format": { "type": "json_object" },
"temperature": 0
} Поля ответа
Структура одинакова для всех моделей. При stream: true те же поля приходят частями
внутри чанков — разбор описан в разделе streaming.
| Поле | Тип | Описание |
|---|---|---|
| id | string | Идентификатор ответа. Пригодится при обращении в поддержку. |
| object | string | chat.completion для обычного ответа, chat.completion.chunk для чанка потока. |
| created | integer | Время создания ответа, unix-время в секундах. |
| model | string | Модель, которая фактически обработала запрос. |
| choices[].index | integer | Порядковый номер варианта ответа. Обычно единственный — 0. |
| choices[].message | object | Сообщение модели: role, content и, если модель вызвала функцию, tool_calls. |
| choices[].finish_reason | string | stop — модель закончила сама, length — упёрлись в max_tokens или контекст, tool_calls — модель просит вызвать функцию, content_filter — ответ заблокирован фильтром провайдера. |
| usage.prompt_tokens | integer | Токены запроса: все сообщения, системный промпт и описания tools. |
| usage.completion_tokens | integer | Токены ответа, включая аргументы вызовов функций. |
| usage.total_tokens | integer | Сумма двух предыдущих полей. |
Токены и usage
Токен — не символ и не слово. Русский текст обычно расходуется быстрее английского, код и разметка — ещё быстрее. Точное число всегда приходит в ответе, оценивать заранее не нужно.
- prompt_tokens — все сообщения запроса вместе с system-промптом, историей диалога и описаниями функций из
tools. Длинная история — главный источник роста счёта. - completion_tokens — сгенерированный текст, аргументы вызовов функций и служебные reasoning-токены у моделей с рассуждениями.
- total_tokens — сумма. Стоимость считается отдельно по входу и выходу: цена выхода у большинства моделей в 3–5 раз выше.
При потоковой выдаче usage приходит в последнем чанке, если в запросе передан
{ "stream_options": { "include_usage": true } }. Списание происходит по факту ответа,
история — в разделе «Расходы» в консоли.
Ограничения
Шлюз одинаков для всех моделей, но сами модели разные. Что именно доступно — видно по тегам и колонке контекста в каталоге.
- tools. Вызов функций умеют не все модели. Если модель их не поддерживает, поле игнорируется и ответ придёт обычным текстом.
- vision. Картинки в
contentпринимают только модели с тегом vision — напримерopenai/gpt-4.1илиanthropic/claude-4.5-sonnet. - Длина контекста. От 8K у эмбеддинговых моделей до 10M у
meta/llama-4-scout. Сумма prompt и completion не должна превышать контекст, иначе ответ оборвётся сfinish_reason: "length". - response_format. Режим json_object поддерживают не все модели: часть провайдеров вернёт ошибку 400.