Краткий ответ
Это не сбой API: бюджет на рассуждение исчерпывает бюджет на ответ. Модели с рассуждением, такие какgpt-6.1-sol, сначала генерируют ход рассуждений, а затем формируют ответ. На обе части выделяется общий лимит max_tokens. Если лимит исчерпывается во время рассуждений, ответ обрывается ещё до начала, и вы получаете пустой результат.
Увеличьте max_tokens (для начала безопасно установить значение 1000 или выше) или снизьте уровень рассуждений, и проблема исчезнет.
Что вы увидите
Существует две распространённые формы. Первая — явная ошибка с HTTP-статусом 429 или 500 (полеmessage может быть локализовано, поэтому в некоторых ответах ожидается сообщение на китайском языке):
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. Рассуждения будут приходить отдельными событиями, поэтому вы сможете видеть, что делает модель, а ответ не исчезнет незаметно.Справочник параметров по семействам моделей
Часто задаваемые вопросы
Почему в журнале указано, что запрос выполнен успешно, хотя я получил ошибку?
Почему в журнале указано, что запрос выполнен успешно, хотя я получил ошибку?
В журнале отмечается, что генерация на стороне вышестоящего сервиса завершилась и тарификация была выполнена. При этом журнал не проверяет, пуст ли отображаемый текст. Успешное завершение генерации и наличие непустого ответа — не одно и то же.
Поможет ли просто повторить запрос?
Поможет ли просто повторить запрос?
Обычно нет. При том же prompt и том же
max_tokens модель, скорее всего, снова потратит бюджет на рассуждение. Изменение параметров гораздо эффективнее, чем повторный запрос.Взимается ли плата за пустой ответ?
Взимается ли плата за пустой ответ?
Да. Токены рассуждения учитываются как фактическое потребление и тарифицируются как выходные токены. Точную сумму можно посмотреть в журнале вызовов.
Все ли модели ведут себя так?
Все ли модели ведут себя так?
Нет. Эта проблема возникает только у моделей с рассуждением, которые выполняют этап обдумывания. Обычные модели без рассуждения, например
gpt-4o или deepseek-chat, расходуют весь max_tokens на отображаемый ответ.Увеличивает ли большое значение max_tokens стоимость?
Увеличивает ли большое значение max_tokens стоимость?
Нет.
max_tokens — это верхний предел, а не фактическое потребление. Модель останавливается после завершения ответа, а плата взимается только за фактически сгенерированные токены.Связанные материалы
Что такое max_tokens?
Значение параметра, история названия и значения по умолчанию для каждой модели
Потоковая передача и передача без потоковой передачи
Для длинных ответов и моделей рассуждения рекомендуется использовать потоковую передачу
Как устранять ошибки моделей
Общая диагностика ошибок 400, 401, 429 и 503
Как читать данные о тарификации в логах
Проверка того, была ли тарифицирована заявка и какова её стоимость