Гайд · TNWS AI
Как запросить повторный вызов инструмента Pydantic AI через ModelRetry
ModelRetry в инструменте Pydantic AI: недостающая часть кода, ограниченный бюджет попыток и разница между просьбой к модели и исправлением данных.
Что решаем и кому подходит
Поисковый вопрос: «как повторить вызов инструмента Pydantic AI при неполном аргументе». Вернуть модели понятное требование исправить аргумент инструмента, если она указала неполный код заявки. Официальный пример демонстрирует ModelRetry внутри tool_plain: ошибка передаётся обратно модели как запрос повторить действие. Бюджет повторов ограничен; после исчерпания выполнение не превращается в успешный ответ. Не используйте этот механизм для бесконечных сетевых ошибок, которые модель не способна исправить. Инструкция опирается на актуальную официальную документацию Pydantic AI, проверенную 20 сентября 2026 года. Примеры предназначены для Python 3.10+ с пакетом pydantic-ai. Используйте модель и учётные данные, доступные именно вашему аккаунту; пример идентификатора из документации не является обещанием доступа. Демонстрационные коды, статусы и суммы вымышлены.
Порядок действий
- Опишите один читающий инструмент с требованием к полному коду вида
R-7. - При ошибке формы аргумента поднимите
ModelRetryс конкретной инструкцией о формате; при неизвестном, но корректном коде верните «не найдено». - Для агента задайте небольшой бюджет
retriesдля инструментов и ограничьте число модельных запросов. - Проверьте известный код, неполный код и неизвестный полный код; журнал покажет, исправила ли модель аргумент.
До сетевого запуска установите pydantic-ai и настройте ключ провайдера предусмотренным им способом. Примеры не содержат действующих секретов. Для воспроизводимого теста зафиксируйте версии Python, пакета и выбранной модели; после обновления снова выполните как удачный, так и отрицательный сценарий. Вызов run_sync использован для наглядного скрипта вне уже работающего асинхронного цикла. Там, где проект асинхронный, применяйте документированный await agent.run(...) и управляйте ресурсами на стороне приложения.
Готовый шаблон для запуска
from pydantic_ai import Agent, ModelRetry, UsageLimitExceeded, UsageLimits
agent = Agent("openai:gpt-5.2", retries={"tools": 2},
instructions="Для кода заявки используй читающий инструмент.")
@agent.tool_plain
def lookup(code: str) -> str:
"""Прочитать статус по полному коду вида R-7."""
if not code.startswith("R-") or not code[2:].isdigit():
raise ModelRetry("Укажи полный код в формате R-число.")
return {"R-7": "в работе"}.get(code, "Не найдено")
try:
answer = agent.run_sync("Проверь статус заявки R-7.",
usage_limits=UsageLimits(request_limit=4))
except UsageLimitExceeded:
print("Достигнут предел обращений к модели")
else:
print(answer.output)
Конкретный вход и ожидаемый результат
Вход: «Проверь статус заявки R-7». Если модель отправляет в инструмент 7 без префикса, функция отвечает ModelRetry с пояснением формата. После исправления аргумента на R-7 инструмент возвращает «в работе». Для R-8 формат правильный, но запись отсутствует — здесь нужно сообщить «Не найдено», а не просить модель придумать другой код. Если текст пользователя содержит лишь «7» и не содержит префикса, добавлять R- допустимо только при явно принятом в приложении правиле, иначе следует запросить уточнение.
Почему этот способ работает
Повторная попытка исправляет только то, что модель может вывести из доступных сведений. Когда внешний сервис не работает, повтор той же невалидной операции может увеличить задержку, но не дать полезного результата; такую ошибку обрабатывают в приложении отдельно. В руководстве Pydantic AI бюджеты для инструментов и выходного результата задаются через retries, а лимиты числа модельных шагов — через UsageLimits. Это независимые ограничения с разными задачами. После окончательной ошибки показывайте пользователю безопасное описание проблемы, не подробности внутреннего исключения или полную трассировку. Если инструмент способен менять состояние, до повторного вызова отдельно решайте проблему идемпотентности.
Пограничный случай и предметная проверка
Приёмочный тест должен регистрировать вход каждого фактического вызова lookup. Одна лишь финальная фраза «в работе» не доказывает, что модель воспользовалась справкой: она могла угадать. Сделайте отдельный отрицательный тест с правильно оформленным кодом, которого нет в словаре, и убедитесь, что модель не заменяет его известным R-7. Если полное значение кода является чувствительным идентификатором клиента, дополните инструмент авторизацией через RunContext, а не только проверкой шаблона. Строка, совпадающая с регулярным выражением, всё ещё может относиться к другому пользователю. В журнале храните лишь обезличенные тестовые примеры.
Критерии приёмки
- Корректный R-7 даёт статус «в работе».
- Неизвестный R-8 не заменяется чужим кодом и не получает выдуманный статус.
- Неполный аргумент вызывает ограниченный запрос на исправление; запуск не продолжается бесконечно.
Проверка успешного выполнения Python-программы не равна проверке верности ответа нейросети. Сопоставьте результат с входом и с доверенным источником данных, затем повторите тест на отрицательном примере. Формулировка текста может отличаться от образца; условия приёмки описывают наблюдаемое поведение, которое действительно нужно пользователю. Если один критерий не соблюдён, не скрывайте сбой повтором без ограничения: сохраните минимальный безопасный воспроизводимый пример и исправьте соответствующий слой — данные, схему, инструмент, инструкцию или обработку ошибки.
Частые ошибки и чего не делать
- Не поднимайте ModelRetry для любой случайной ошибки Python: многие исключения должны завершить запрос как ошибка сервиса.
- Не делайте инструмент записи повторяемым без идемпотентного ключа и проверки результата.
- Не трактуйте число
retriesкак обязательное количество исправлений: корректный ответ может прийти сразу.
Вопросы и ответы
Что передаёт ModelRetry модели?
Причину отклонения и просьбу исправить аргумент или результат.
Что если код полный, но неизвестен?
Верните отсутствие записи либо запросите уточнение по правилам приложения.
Защитит ли retries от бесконечного цикла?
Бюджет ограничивает повторы; дополнительно ставьте предел модельных запросов.
Официальные источники
Частые вопросы
Что передаёт ModelRetry модели?
Причину отклонения и просьбу исправить аргумент или результат.
Что если код полный, но неизвестен?
Верните отсутствие записи либо запросите уточнение по правилам приложения.
Защитит ли retries от бесконечного цикла?
Бюджет ограничивает повторы; дополнительно ставьте предел модельных запросов.
Читайте также
Как дать агенту Pydantic AI инструмент чтения справки без права записи
Инструмент tool_plain для чтения вымышленной справки: минимальные полномочия, пример вопроса, проверка вызова и защита от ложных ответов.
Как извлечь поля заявки из русского письма через Pydantic AI и output_type
Пошаговое извлечение темы и номера заявки в Pydantic AI: схема BaseModel, конкретное письмо, проверка полей и ошибки, которые не исправит одна валидация.
Как ограничить число обращений агента Pydantic AI к модели через request_limit
Ограничение числа модельных шагов Pydantic AI: UsageLimits(request_limit), обработка исключения и тест на цикл инструмента.
Комментарии
Пока тихо. Скажите первое слово