ЦАРЬ РОУТЕР

Рассуждение моделей

Как получить ход рассуждений модели: поле 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" - при полном счёте за выход. Для рассуждающих моделей ставьте лимит с запасом или не ставьте вовсе.

На этой странице

Редактировать на GitVerse