Перейти к основному содержанию

Краткий ответ

Это не сбой API: бюджет на рассуждение исчерпывает бюджет на ответ. Модели с рассуждением, такие как gpt-6.1-sol, сначала генерируют ход рассуждений, а затем формируют ответ. На обе части выделяется общий лимит max_tokens. Если лимит исчерпывается во время рассуждений, ответ обрывается ещё до начала, и вы получаете пустой результат. Увеличьте max_tokens (для начала безопасно установить значение 1000 или выше) или снизьте уровень рассуждений, и проблема исчезнет.

Что вы увидите

Существует две распространённые формы. Первая — явная ошибка с HTTP-статусом 429 или 500 (поле message может быть локализовано, поэтому в некоторых ответах ожидается сообщение на китайском языке):
Вторая — HTTP 200 с пустым содержимым:
Обратите внимание на блок использования: completion_tokens равен 300, reasoning_tokens равен 300, а text_tokens равен 0 — модель сгенерировала 300 token, потратила их все на рассуждение и не вывела ни одного слова.
В журнале вызовов запрос отображается как успешный и тарифицированный, что не является противоречием: модель действительно создала содержимое (трассировку рассуждений), просто не вывела видимый текст.

Почему это происходит

Вывод модели с рассуждением состоит из двух этапов: max_tokens (или max_completion_tokens, max_output_tokens) ограничивает оба этапа вместе, а не длину видимого ответа. Поэтому если для max_tokens установлено небольшое значение, например 200–500, а задача требует существенного reasoning, бюджет исчерпывается на этапе рассуждения. finish_reason становится равным length, и содержимое оказывается пустым.

Три проверки

1

Шаг 1: прочитайте finish_reason

Если это length, вывод был усечён: модель не отказалась отвечать. Если это stop, но содержимое по-прежнему пусто, перейдите к шагам 2 и 3.
2

Шаг 2: прочитайте reasoning_tokens в usage

Найдите usage.completion_tokens_details.reasoning_tokens и сравните его с completion_tokens. Если значения близки или равны, большая часть бюджета ушла на рассуждение.
3

Шаг 3: прочитайте max_tokens в вашем запросе

Если вы явно задали max_tokens небольшим значением, например 300, это почти наверняка является причиной. Если вы этого не делали, проверьте, не подставил ли ваш SDK или фреймворк небольшое значение по умолчанию.
Этот скрипт выводит все три сигнала одновременно:

Как исправить

Увеличьте max_tokens

Прямое решение. Используйте 1000–2000 для обычного чата и 4000 или больше для сложных рассуждений и длинных ответов. Расход токенов на рассуждения может оказаться гораздо выше, чем вы ожидаете.

Уменьшите уровень рассуждений

Если модель поддерживает reasoning_effort, измените значение с high на medium или low. Расход на обдумывание заметно снизится.

Переключитесь на потоковую передачу

Установите для stream значение true. Рассуждения будут приходить отдельными событиями, поэтому вы сможете видеть, что делает модель, а ответ не исчезнет незаметно.

Справочник параметров по семействам моделей

Некоторые модели с рассуждениями не принимают max_tokens и требуют max_completion_tokens. Неправильное имя параметра может вызвать ошибку или быть проигнорировано без уведомления, из-за чего модель использует значение по умолчанию, не соответствующее вашим намерениям.

Часто задаваемые вопросы

В журнале отмечается, что генерация на стороне вышестоящего сервиса завершилась и тарификация была выполнена. При этом журнал не проверяет, пуст ли отображаемый текст. Успешное завершение генерации и наличие непустого ответа — не одно и то же.
Обычно нет. При том же prompt и том же max_tokens модель, скорее всего, снова потратит бюджет на рассуждение. Изменение параметров гораздо эффективнее, чем повторный запрос.
Да. Токены рассуждения учитываются как фактическое потребление и тарифицируются как выходные токены. Точную сумму можно посмотреть в журнале вызовов.
Нет. Эта проблема возникает только у моделей с рассуждением, которые выполняют этап обдумывания. Обычные модели без рассуждения, например gpt-4o или deepseek-chat, расходуют весь max_tokens на отображаемый ответ.
Нет. max_tokens — это верхний предел, а не фактическое потребление. Модель останавливается после завершения ответа, а плата взимается только за фактически сгенерированные токены.

Связанные материалы

Что такое max_tokens?

Значение параметра, история названия и значения по умолчанию для каждой модели

Потоковая передача и передача без потоковой передачи

Для длинных ответов и моделей рассуждения рекомендуется использовать потоковую передачу

Как устранять ошибки моделей

Общая диагностика ошибок 400, 401, 429 и 503

Как читать данные о тарификации в логах

Проверка того, была ли тарифицирована заявка и какова её стоимость