Гайд · TNWS AI

Почему лимит токенов Pydantic AI не всегда останавливает запрос до отправки

4 мин—

Разбираем UsageLimits для токенов Pydantic AI: когда проверка происходит после ответа, как отдельно ограничить вход одного запроса и чего не обещать.

Что решаем и кому подходит

Поисковый вопрос: «почему Pydantic AI input_tokens_limit может сработать после запроса». Не принять лимит токенов за гарантию того, что большой текст никогда не уйдёт провайдеру. Официальная документация указывает, что по умолчанию per_request_input_tokens_limit сравнивается с учтёнными провайдером токенами уже после ответа; слишком большой запрос при этом мог быть отправлен и учтён. Предварительный подсчёт доступен через count_tokens_before_request=True, однако его применимость зависит от модели и механизма подсчёта. Отдельно существуют лимиты суммарного входа и выхода за один запуск. Инструкция опирается на актуальную официальную документацию Pydantic AI, проверенную 20 сентября 2026 года. Примеры предназначены для Python 3.10+ с пакетом pydantic-ai. Используйте модель и учётные данные, доступные именно вашему аккаунту; пример идентификатора из документации не является обещанием доступа. Демонстрационные коды, статусы и суммы вымышлены.

Порядок действий

  1. Определите, что вы ограничиваете: размер конкретного входного контекста или суммарное использование одного запуска.
  2. Для проверки одного запроса передайте UsageLimits(per_request_input_tokens_limit=...); в тесте поставьте небольшой порог и обработайте исключение.
  3. Если важно проверять до передачи запроса, изучите и включите документированную предварительную оценку, отдельно протестировав её с выбранной моделью.
  4. Дополните защиту локальным ограничением длины пользовательского текста и правилом работы с длинной историей.

До сетевого запуска установите pydantic-ai и настройте ключ провайдера предусмотренным им способом. Примеры не содержат действующих секретов. Для воспроизводимого теста зафиксируйте версии Python, пакета и выбранной модели; после обновления снова выполните как удачный, так и отрицательный сценарий. Вызов run_sync использован для наглядного скрипта вне уже работающего асинхронного цикла. Там, где проект асинхронный, применяйте документированный await agent.run(...) и управляйте ресурсами на стороне приложения.

Готовый шаблон для запуска

from pydantic_ai import Agent, UsageLimitExceeded, UsageLimits

agent = Agent("openai:gpt-5.2")
limits = UsageLimits(per_request_input_tokens_limit=100,
                     count_tokens_before_request=True)
try:
    result = agent.run_sync("Кратко объясни, что означает проверка входа.",
                            usage_limits=limits)
except UsageLimitExceeded:
    print("Контекст превысил заданный предел")
else:
    print(result.output)
    print(result.usage.input_tokens)

Конкретный вход и ожидаемый результат

Вход — короткий русский вопрос длиной в одну строку и порог 100 токенов в учебном коде. Ожидается, что короткий пример пройдёт при подходящей модели, но фактическое число токенов зависит также от инструкции, служебных данных и токенизации. Для отрицательного теста приложите к истории большой вымышленный текст и проверьте обработку UsageLimitExceeded. Не рассчитывайте число токенов через количество символов: эта величина не соответствует токенизатору модели.

Почему этот способ работает

У лимитов разные моменты проверки. Суммарный вход за несколько запросов — один критерий, максимальный вход одного конкретного запроса — другой; при повторной передаче истории суммарный счёт может расти быстрее, чем длина нового вопроса. В документации прямо отмечена особенность постфактум-проверки у провайдерского счётчика по умолчанию. Поэтому утверждение «при лимите 100 токенов сервис никогда не получит 101-й токен» без проверки выбранного режима будет ложным. Даже предварительная оценка требует реального теста на модели, особенно если в запрос входят инструменты, изображения или нестандартные сообщения. Стоимость также не равна одному числу токенов и регулируется отдельно.

Пограничный случай и предметная проверка

Проведите три измерения на своём приложении: вопрос без истории, тот же вопрос с полной историей и тот же вопрос после обработки истории вашим процессором. Сравните показатель input_tokens и время выполнения. Если история содержит большие инструментарные ответы, простое удаление части текста может разорвать пары вызова и результата инструмента; изменять историю следует с учётом её структуры. Храните короткий тестовый протокол для каждой модели после обновления библиотеки. Цель практики — управляемая ошибка и предсказуемая политика передачи данных, а не создание видимости математически точного тарифа по одному порогу.

Критерии приёмки

  1. Короткий вопрос или завершается контролируемо, или даёт понятную ошибку по реальному счётчику.
  2. Для большого входа предусмотрена обработка исключения; предварительную отсечку проверяют отдельно в тестовой среде.
  3. В интерфейсе не обещается невозможность отправки большого запроса при режиме проверки после ответа.

Проверка успешного выполнения Python-программы не равна проверке верности ответа нейросети. Сопоставьте результат с входом и с доверенным источником данных, затем повторите тест на отрицательном примере. Формулировка текста может отличаться от образца; условия приёмки описывают наблюдаемое поведение, которое действительно нужно пользователю. Если один критерий не соблюдён, не скрывайте сбой повтором без ограничения: сохраните минимальный безопасный воспроизводимый пример и исправьте соответствующий слой — данные, схему, инструмент, инструкцию или обработку ошибки.

Частые ошибки и чего не делать

  • Не используйте число символов как точный эквивалент числа токенов.
  • Не путайте output_tokens_limit с per_request_input_tokens_limit.
  • Не рассчитывайте на лимиты Pydantic AI как на единственную защиту от очень больших HTTP-тел запроса.

Вопросы и ответы

Всегда ли лимит срабатывает до API-вызова?

Нет; документированная проверка по умолчанию может выполняться после ответа.

Как проверять до отправки?

Использовать поддерживаемый предварительный подсчёт и протестировать конкретную модель.

Считает ли он историю?

Да, вход конкретного обращения включает переданный контекст, не только последнюю фразу.

Официальные источники

Частые вопросы

Всегда ли лимит срабатывает до API-вызова?

Нет; документированная проверка по умолчанию может выполняться после ответа.

Как проверять до отправки?

Использовать поддерживаемый предварительный подсчёт и протестировать конкретную модель.

Считает ли он историю?

Да, вход конкретного обращения включает переданный контекст, не только последнюю фразу.

Читайте также

Комментарии

Пока тихо. Скажите первое слово