Рассуждение моделей
Как получить ход рассуждений модели: поле reasoning_content, параметр reasoning_effort, счётчик токенов рассуждения и как это влияет на счёт
Рассуждающая модель перед ответом «думает вслух»: строит цепочку рассуждений, а пользователю отдаёт итог. Этот черновик приходит отдельным полем — его можно показать в интерфейсе, залогировать или просто выбросить.
Модели с рассуждением отмечены в каталоге значком «Рассуждение».
Где приходит ход рассуждений
В обоих режимах поле называется одинаково - reasoning_content:
| Режим | Где искать |
|---|---|
| Обычный запрос | choices[0].message.reasoning_content |
Потоковый (stream: true) | choices[0].delta.reasoning_content в чанках |
response = client.chat.completions.create(
model="Qwen/Qwen3.5-397B-A17B",
messages=[{"role": "user", "content": "Сколько будет 17*23?"}],
)
msg = response.choices[0].message
print(msg.reasoning_content) # ход рассуждений (может быть пустым)
print(msg.content) # сам ответОфициальный OpenAI SDK о поле не знает и в типах его не показывает, но значение
сохраняет: в Python оно доступно как msg.reasoning_content, в JS —
message.reasoning_content (TypeScript потребует привести тип).
Поле может прийти пустым
Ход рассуждений отдают не все каналы: часть из них показывает его только в потоковом режиме, часть не показывает вовсе - модель рассуждает, но черновик остаётся у провайдера. Ответ и счёт от этого не меняются. Что именно умеет конкретный канал - написано в подсказке рядом с ним в каталоге.
Как включить и выключить
У моделей три сценария, и в каталоге для каждого канала указан свой:
| Сценарий | Что делать |
|---|---|
| Рассуждение включено всегда | ничего; выключить нельзя |
| Рассуждение по запросу | передать reasoning_effort |
| Рассуждение можно выключить | способ указан в подсказке канала |
Параметр reasoning_effort принимает low, medium, high — чем выше, тем
длиннее рассуждение и дороже ответ:
curl https://api.tsarrouter.ru/v1/chat/completions \
-H "Authorization: Bearer sk-tsar-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "sber/gigachat-2-pro",
"messages": [{"role": "user", "content": "Сколько будет 17*23?"}],
"reasoning_effort": "low"
}'Другие значения не принимаются - придёт ошибка валидации 422. Канал, который
рассуждение не поддерживает, чаще всего параметр проигнорирует, но часть каналов
передаёт его провайдеру как есть - тогда возможна ошибка со стороны провайдера.
Один и тот же ответ от разных каналов
У модели может быть несколько каналов, и настройки рассуждения у них разные: где-то оно включено всегда, где-то включается параметром. Без явного указания запрос уходит на любой доступный канал — значит и поведение рассуждения может отличаться от запроса к запросу.
Чтобы зафиксировать канал, передайте provider.only:
{
"model": "Qwen/Qwen3.6-35B-A3B",
"messages": [{"role": "user", "content": "Сколько будет 17*23?"}],
"provider": {"only": ["cloudru"]}
}Какой канал ответил на самом деле, видно в заголовке ответа
X-TsarRouter-Provider. Все способы управления выбором канала - на странице
«Выбор канала и надёжность».
Сколько это стоит
Токены рассуждения — это обычные токены выхода. Они уже входят в
usage.completion_tokens и оплачиваются по цене выхода: отдельного тарифа за
рассуждение нет и второй раз за них не списывается.
Если провайдер сообщает, сколько именно ушло на рассуждение, эта цифра приходит
в usage:
{
"usage": {
"prompt_tokens": 27,
"completion_tokens": 323,
"total_tokens": 350,
"reasoning_tokens": 317,
"completion_tokens_details": {"reasoning_tokens": 317}
}
}В обычном запросе одно и то же число лежит в двух местах:
completion_tokens_details.reasoning_tokens (формат OpenAI) и
usage.reasoning_tokens (короткая форма) - берите любое. В потоковом режиме
финальный usage-чанк приходит в том виде, в каком его прислал провайдер:
надёжнее читать completion_tokens_details.reasoning_tokens, верхнеуровневого
usage.reasoning_tokens там может не быть.
Счётчик необязательный: если провайдер его не прислал, поля придут со значением
null или не придут вовсе. Отсутствие или ноль не значит, что модель
не рассуждала - только что цифры от провайдера не пришло. Единственная величина,
на которую можно опираться в расчётах, - completion_tokens: она полная всегда,
и счёт считается по ней.
Оставляйте запас по max_tokens
Рассуждение расходует тот же лимит, что и ответ. Если max_tokens мал,
модель потратит его на рассуждение и вернёт пустой или обрезанный content
с finish_reason: "length" - при полном счёте за выход. Для рассуждающих
моделей ставьте лимит с запасом или не ставьте вовсе.
Быстрый старт
ЦАРЬ РОУТЕР - агрегатор российских и open-source нейросетей с единым OpenAI-совместимым API. Один ключ, один формат: меняете base_url - и весь код на OpenAI SDK работает без изменений. Не нужно регистрироваться в Yandex Cloud, Cloud.ru, GigaChat или MWS - ЦАРЬ РОУТЕР берёт это на себя.
Потоковое распознавание речи
Транскрипция в реальном времени через WebSocket /v1/realtime/transcriptions: формат событий OpenAI Realtime, подключение, аудио-формат, биллинг, пример кода