POST /api/v1/chat/completions: как устроены сообщения, что можно положить в content, как получить предсказуемый JSON и какие параметры действительно влияют на результат. Сводная таблица всех полей запроса — в справочнике эндпоинта.
В примерах ниже
$TEXT_MODEL — переменная окружения с идентификатором модели из GET /api/v1/models. Идентификаторы не зашивают в код: состав каталога меняется, а зашитый список устаревает молча. Разбор — в разделе Модели и цены.Роли и порядок
Массивmessages — это история диалога целиком, а не только последняя реплика. Каждый запрос повторно отправляет всю переписку, и провайдер берёт за неё плату — поэтому историю стоит обрезать, а не копить.
Блоки контента
content — либо строка, либо массив блоков. Типов ровно четыре:
Вызов функций
Полный материал вынесен в отдельный гайд: Вызов функций. Здесь только форма запроса.finish_reason: "tool_calls", вызовы лежат в choices[0].message.tool_calls, аргументы — JSON-строкой. Дальше цикл: выполнить функцию, отправить сообщение с ролью tool и тем же tool_call_id, повторить запрос.
Структурированный вывод
cURL
response_format, примеры схем и валидация через pydantic и zod — на странице Структурированный вывод.
Рассуждения
choices[0].message.reasoning (и дублируется в reasoning_content), объём — в usage.completion_tokens_details.reasoning_tokens. За рассуждения платят как за выходные токены, поэтому effort напрямую двигает цену. Подробнее — в гайде по токенам рассуждений.
Параметры генерации
stop
Массив строк, на которых генерация обрывается. Сама строка в результат не входит, а finish_reason становится stop.
temperature
От 0 до 2. Низкие значения ближе к воспроизводимому результату, высокие — к разнообразию.
Фактический диапазон и поведение задаёт провайдер модели, а не платформа: часть моделей принимает только один или два фиксированных значения.
temperature: 0 не гарантирует побайтово одинаковый ответ — при одинаковых аргументах повтор может отличаться.max_completion_tokens
Потолок выходных токенов. Это единственный параметр, участвующий в проверке контекстного окна: вместе со входом он резервирует место в context_length, и при нехватке приходит 422 content_too_large.
max_tokens — устаревшее имя. Оно переносится в max_completion_tokens, только если новое имя не задано; если заданы оба, побеждает новое имя.
Python
n, seed, logprobs
Три параметра, поддержка которых зависит от модели. Ни один из них — не переносимый контракт.
n > 1 и logprobs в одном запросе — плохая идея: первый расходует квоту выхода кратно больше, второй возвращает объёмный лог, который дорого разбирать.
Неизвестные поля
Тело запроса разбирается по известной схеме, а лишние поля молча игнорируются: ни ошибки, ни предупреждения.max_output_tokens и think здесь не существуют — запрос пройдёт как обычный «Привет» без ограничения длины и без рассуждений.
Это удобно при переносе кода с другого провайдера: незнакомые параметры не ломают запрос. Это же опасно: опечатка в имени параметра выглядит как «работает», но ничего не делает. Если поведение не изменилось после правки — проверьте имя поля по справочнику.
Что дальше
Вызов функций
Полный цикл: определение, выполнение, возврат результата
Потоковая передача
Показ ответа по частям
Структурированный вывод
JSON-схема, отказы, валидация
Справочник эндпоинта
Полный список полей запроса и ответа
