Ошибка context_length_exceeded — переполнен контекст

Модель отказалась отвечать, потому что запрос не помещается. Разбираем, из чего складывается контекст и что резать в первую очередь.

2 мин · · ошибки · токены · модели

Ошибка context_length_exceeded означает, что запрос вместе с запрошенным ответом не помещается в контекстное окно модели. Запрос отклоняется целиком, до генерации — и это хорошая новость: за отклонённый запрос денег не берут.

Из чего складывается контекст

Считается всё, что уходит в модель за один вызов.

Системный промпт. В агентах он часто занимает тысячи токенов, про которые вы не помните, потому что писали их не вы.

Вся история переписки. Модель не помнит предыдущие вызовы — клиент пересылает историю заново каждый раз. Поэтому длинный диалог упирается в лимит внезапно: последнее сообщение было коротким, а вместе с историей перевалило за границу.

Определения инструментов. Схемы функций в JSON занимают больше, чем кажется: десяток инструментов легко даёт пару тысяч токенов.

Вложенные файлы и результаты вызовов инструментов. В агентных сценариях это обычно самая крупная часть.

И, наконец, max_tokens — место, зарезервированное под ответ. Оно вычитается из окна заранее. Запрос на 195 тысяч токенов при окне в 200 тысяч упрётся в лимит, если вы попросили max_tokens: 8000.

Что делать по порядку

Уменьшите max_tokens. Самое дешёвое действие. Часто выставлено «с запасом» вроде 64 000, хотя ответ нужен на две тысячи. Это освобождает окно мгновенно.

Обрежьте историю. Оставьте системный промпт, несколько первых сообщений (в них обычно задача) и последние — середину диалога чаще всего можно выбросить без потерь.

Уберите результаты инструментов. Вывод команды, который агент прочитал пять шагов назад, в контексте больше не нужен. Многие фреймворки умеют чистить старые результаты автоматически, поищите такую настройку.

Сожмите историю в резюме. Замените первые двадцать сообщений одним абзацем с выводами. Дороже предыдущих вариантов — за резюме тоже платите, — но работает, когда диалог принципиально длинный.

Возьмите модель с большим окном. Последний шаг, а не первый: если контекст растёт бесконтрольно, большее окно лишь отодвинет проблему и увеличит счёт, потому что платите вы за каждый токен на входе.

Как не встречать эту ошибку

Считайте токены до отправки, а не после отказа. Практическое правило для прикидки: один токен — примерно четыре символа латиницы или два-три символа кириллицы. Точные цифры даёт токенизатор, но для проверки «влезаем или нет» приближения достаточно.

И следите за формой роста. Если в логах видно, как размер запроса растёт на каждом шаге агента, лимит вы встретите обязательно — вопрос лишь в том, на каком шаге.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.