Если ответ модели заканчивается на полуслове, первым делом посмотрите поле finish_reason в ответе. Значение length означает, что модель упёрлась в лимит токенов ответа или в размер окна контекста. Это не сбой Heli и не ошибка сети — модель остановили по лимиту.
Как проверить
- stop — модель закончила ответ сама.
- length — достигнут max_tokens или предел контекста.
- tool_calls — модель вызвала инструмент и ждёт его результата.
- В стриминге finish_reason приходит в последнем чанке с непустым choices.
resp = client.chat.completions.create(
model="openai/gpt-5.4-mini",
messages=messages,
max_tokens=800,
)
choice = resp.choices[0]
if choice.finish_reason == "length":
print("Ответ обрезан, использовано:", resp.usage.completion_tokens)Почему лимит срабатывает
- max_tokens ограничивает только ответ. Промпт считается отдельно, но вместе с ответом должен помещаться в окно контекста модели.
- Reasoning-модели тратят часть лимита на скрытые рассуждения. При маленьком max_tokens видимый ответ может быть коротким или пустым с finish_reason length.
- JSON-ответ, обрезанный по лимиту, невалиден. Для structured output задавайте лимит с запасом и проверяйте finish_reason до разбора JSON.
Что сделать
- Увеличьте max_tokens под реальный размер ответа.
- Попросите модель отвечать короче или по пунктам — это дешевле, чем поднимать лимит.
- Для длинных текстов генерируйте по частям: сначала план, затем разделы отдельными запросами.
- Чтобы продолжить обрезанный ответ, добавьте его в messages как сообщение assistant и попросите продолжить с места остановки.
max_tokens в Heli
Перед запросом Heli резервирует на балансе оценку его стоимости, и max_tokens входит в эту оценку. Если параметр не задан, берётся консервативный запас, поэтому при маленьком остатке длинный запрос может получить 402. Списывается фактическая стоимость по токенам ответа. Во вкладке «Лимиты» можно задать потолок max_output_tokens для ключа: запрос с большим max_tokens получит 400 с кодом max_tokens.
Сколько ставить
Посмотрите usage.completion_tokens на реальных ответах вашего сценария и задайте max_tokens с запасом примерно в четверть. Для классификации и коротких меток хватает десятков токенов, для ответов в чате — сотен, для статей и отчётов — тысяч. Слишком большой лимит не делает ответ длиннее, но увеличивает резерв на балансе и время ответа в худшем случае.
Если модель вызывает инструменты, обрезка по лимиту ломает JSON аргументов функции. При finish_reason length не выполняйте такой вызов, а повторите запрос с большим лимитом. В интерфейсе чата при обрезанном ответе удобно показывать кнопку «Продолжить».
Попробуйте Heli
Ключ sk-heli- появляется после подтверждения почты. Через Google и Яндекс — сразу в кабинете.