# max_tokens и обрыв ответа

Курс: Claude API для разработчиков — https://zero2claude.ru/learn/api
Канонический URL: https://zero2claude.ru/learn/api/1-3-max-tokens

max_tokens задаёт потолок длины ответа. Слишком мало — текст обрывается; распознаём это по stop_reason.

## Что такое max_tokens

`max_tokens` — **обязательный** параметр: верхний предел того, сколько токенов модель сгенерирует в ответе. Это не «сколько надо», а «не больше чем». Поставишь слишком мало — Claude не успеет договорить, и ответ оборвётся на полуслове.

Представь: ты просишь модель выгрузить 50 заказов в JSON, но ставишь `max_tokens: 50`. Ответ обрежется где-то на третьем заказе, JSON будет невалидным.

## Как понять, что ответ оборвался

Смотри на поле `stop_reason` в ответе:

```
{
  "content": [{"type": "text", "text": "[{\"id\": 1, \"sum\": ..."}],
  "stop_reason": "max_tokens",
  "usage": {"input_tokens": 120, "output_tokens": 50}
}
```

- `end_turn` — модель закончила сама, всё в порядке.
- `max_tokens` — упёрлась в потолок, ответ **неполный**. Увеличь `max_tokens` и повтори.

## Сколько ставить

```
resp = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=16000,
    messages=[{"role": "user", "content": "Выгрузи заказы в JSON"}],
)
if resp.stop_reason == "max_tokens":
    print("Ответ обрезан — нужно больше токенов")
```

Для обычных задач разумно ставить около `16000`. Если ждёшь длинный ответ, переходи на стриминг и поднимай потолок (до `64000` и выше) — иначе долгий ответ упрётся в таймаут запроса.

Большой max_tokens сам по себе денег не стоит — платишь за реально сгенерированные output_tokens. Но и обрезанный ответ не бесплатен: токены до обрыва уже потрачены.
