> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Почему модель с рассуждением возвращает пустой контент?

> Получаете empty_response или HTTP 200 с пустым текстом? Обычно max_tokens расходуется на рассуждение. Три проверки и три решения.

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

Это не сбой API: **бюджет на рассуждение исчерпывает бюджет на ответ**.

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

Увеличьте `max_tokens` (для начала безопасно установить значение 1000 или выше) или снизьте уровень рассуждений, и проблема исчезнет.

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

Существует две распространённые формы.

**Первая — явная ошибка** с HTTP-статусом 429 или 500 (поле `message` может быть локализовано, поэтому в некоторых ответах ожидается сообщение на китайском языке):

```json theme={null}
{
  "error": {
    "message": "上游返回了空响应。",
    "type": "shell_api_error",
    "code": "empty_response"
  }
}
```

**Вторая — HTTP 200 с пустым содержимым**:

```json theme={null}
{
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "" },
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 1500,
    "completion_tokens": 300,
    "completion_tokens_details": { "reasoning_tokens": 300, "text_tokens": 0 }
  }
}
```

Обратите внимание на блок использования: `completion_tokens` равен 300, `reasoning_tokens` равен 300, а `text_tokens` равен 0 — **модель сгенерировала 300 token, потратила их все на рассуждение и не вывела ни одного слова.**

> [!NOTE]
>
> В журнале вызовов запрос отображается как успешный и тарифицированный, что не является противоречием: модель действительно создала содержимое (трассировку рассуждений), просто не вывела видимый текст.

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

Вывод модели с рассуждением состоит из двух этапов:

| Этап | Содержимое | Возвращается вам |
| - | - | - |
| Рассуждение | токены reasoning, внутреннее обдумывание | Некоторые модели предоставляют его как `reasoning_content`; обычно он невидим |
| Ответ | текстовые токены, видимый вывод | Да |

`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 или фреймворк небольшое значение по умолчанию.

Этот скрипт выводит все три сигнала одновременно:

```python theme={null}
import json
from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.apiyi.com/v1")

resp = client.chat.completions.create(
    model="gpt-6.1-sol",
    messages=[{"role": "user", "content": "your question"}],
    max_tokens=2000,
)

choice = resp.choices[0]
usage = resp.usage
print("finish_reason:", choice.finish_reason)
print("content:", repr(choice.message.content)[:100])
print("completion_tokens:", usage.completion_tokens)
print("reasoning_tokens:", getattr(usage.completion_tokens_details, "reasoning_tokens", None))
```

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

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

> [card] Уменьшите уровень рассуждений
>
> Если модель поддерживает `reasoning_effort`, измените значение с `high` на `medium` или `low`. Расход на обдумывание заметно снизится.

> [card] Переключитесь на потоковую передачу
>
> Установите для `stream` значение `true`. Рассуждения будут приходить отдельными событиями, поэтому вы сможете видеть, что делает модель, а ответ не исчезнет незаметно.

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

| Семейство моделей | Параметр бюджета вывода | Параметр уровня рассуждений |
| - | - | - |
| Модели OpenAI с рассуждениями (серии o, GPT-5/6) | `max_completion_tokens` (Chat), `max_output_tokens` (Responses) | `reasoning_effort` |
| Режим обдумывания Claude | `max_tokens` | `thinking.budget_tokens` |
| Режим обдумывания Gemini | `maxOutputTokens` | `thinkingConfig.thinkingBudget` |

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

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

> [accordion] Почему в журнале указано, что запрос выполнен успешно, хотя я получил ошибку?
>
> В журнале отмечается, что генерация на стороне вышестоящего сервиса завершилась и тарификация была выполнена. При этом журнал не проверяет, пуст ли отображаемый текст. Успешное завершение генерации и наличие непустого ответа — не одно и то же.

> [accordion] Поможет ли просто повторить запрос?
>
> Обычно нет. При том же prompt и том же `max_tokens` модель, скорее всего, снова потратит бюджет на рассуждение. Изменение параметров гораздо эффективнее, чем повторный запрос.

> [accordion] Взимается ли плата за пустой ответ?
>
> Да. Токены рассуждения учитываются как фактическое потребление и тарифицируются как выходные токены. Точную сумму можно посмотреть в [журнале вызовов](https://docs.apiyi.com/ru/faq/log-billing-explained.md).

> [accordion] Все ли модели ведут себя так?
>
> Нет. Эта проблема возникает только у моделей с рассуждением, которые выполняют этап обдумывания. Обычные модели без рассуждения, например `gpt-4o` или `deepseek-chat`, расходуют весь `max_tokens` на отображаемый ответ.

> [accordion] Увеличивает ли большое значение max\_tokens стоимость?
>
> Нет. `max_tokens` — это верхний предел, а не фактическое потребление. Модель останавливается после завершения ответа, а плата взимается только за фактически сгенерированные токены.

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

> [card] [Что такое max\_tokens?](https://docs.apiyi.com/ru/faq/max-tokens.md)
>
> Значение параметра, история названия и значения по умолчанию для каждой модели

> [card] [Потоковая передача и передача без потоковой передачи](https://docs.apiyi.com/ru/faq/streaming-vs-non-streaming.md)
>
> Для длинных ответов и моделей рассуждения рекомендуется использовать потоковую передачу

> [card] [Как устранять ошибки моделей](https://docs.apiyi.com/ru/faq/model-error-troubleshooting.md)
>
> Общая диагностика ошибок 400, 401, 429 и 503

> [card] [Как читать данные о тарификации в логах](https://docs.apiyi.com/ru/faq/log-billing-explained.md)
>
> Проверка того, была ли тарифицирована заявка и какова её стоимость


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.