Гайд · TNWS AI
Как продолжить диалог Pydantic AI через message_history без смешивания пользователей
Два последовательных ответа Pydantic AI: передаём all_messages в message_history, проверяем связность и не путаем истории разных пользователей.
Что решаем и кому подходит
Поисковый вопрос: «как продолжить разговор Pydantic AI через message_history». Сохранить контекст второго вопроса «А когда это происходит?» после первого вопроса о вымышленном расписании. Официальная документация показывает message_history=result1.all_messages() для следующего запуска и отличает все сообщения от новых сообщений текущего запуска. Агент сам по себе не должен считаться контейнером изолированной пользовательской сессии: история передаётся явно. Инструкция опирается на актуальную официальную документацию Pydantic AI, проверенную 20 сентября 2026 года. Примеры предназначены для Python 3.10+ с пакетом pydantic-ai. Используйте модель и учётные данные, доступные именно вашему аккаунту; пример идентификатора из документации не является обещанием доступа. Демонстрационные коды, статусы и суммы вымышлены.
Порядок действий
- Создайте агента с проверенной моделью и двумя фразами, где вторая зависит от первой.
- Выполните первый запрос и сохраните
result1.all_messages()на стороне одной тестовой сессии. - Передайте эту историю во второй вызов как
message_history; не заменяйте её чужим диалогом. - Проверьте связность ответа и различайте
all_messages()иnew_messages()при записи журнала.
До сетевого запуска установите pydantic-ai и настройте ключ провайдера предусмотренным им способом. Примеры не содержат действующих секретов. Для воспроизводимого теста зафиксируйте версии Python, пакета и выбранной модели; после обновления снова выполните как удачный, так и отрицательный сценарий. Вызов run_sync использован для наглядного скрипта вне уже работающего асинхронного цикла. Там, где проект асинхронный, применяйте документированный await agent.run(...) и управляйте ресурсами на стороне приложения.
Готовый шаблон для запуска
from pydantic_ai import Agent
agent = Agent("openai:gpt-5.2",
instructions="Отвечай только по явно заданному расписанию, иначе уточняй.")
first = agent.run_sync("Учебная справка: выдача партии R-7 во вторник. Когда выдача R-7?")
second = agent.run_sync("А в какой день недели это происходит?",
message_history=first.all_messages())
print(first.output)
print(second.output)
print(len(second.all_messages()), len(second.new_messages()))
Конкретный вход и ожидаемый результат
Исходный факт в примере: выдача R-7 — вторник. После первого вопроса пользователь спрашивает: «А в какой день недели это происходит?» Если история передана корректно, второй ответ ссылается на вторник. Без истории местоимение «это» не определяет конкретный объект, и правильнее уточнить предмет вопроса. Для независимого пользователя, который раньше говорил о пятнице, передавать историю R-7 запрещено: это одновременно ошибка качества и риск утечки.
Почему этот способ работает
all_messages() возвращает сообщения диалога с учётом переданной предыдущей истории; new_messages() содержит только шаги текущего запуска. Если во второй вызов требуется полная история, передайте именно подходящую историю первой сессии и проверьте её владельца. Не склеивайте несколько полных историй простым сложением, иначе старые сообщения продублируются и модель может дать неожиданный ответ. Для долговременного хранения документация описывает сериализацию с ModelMessagesTypeAdapter; бесконтрольный JSON пользователя нельзя считать доверенным состоянием сервера. Историю следует ограничивать по объёму и очищать от конфиденциальных данных согласно правилам продукта.
Пограничный случай и предметная проверка
Отдельно проверьте ветвление: одна и та же исходная история может быть использована для двух независимых продолжений, но результаты веток не следует автоматически смешивать. Помечайте историю серверным идентификатором сессии, чтобы после перезагрузки приложения не восстанавливать её по одному лишь введённому тексту. Для долгого диалога размер истории растёт и влияет на контекст, скорость и приватность; определите правило обрезки или суммаризации до достижения ограничений выбранной модели. Даже при корректной передаче прошлых сообщений нельзя предполагать, что модель безошибочно разрешит каждое местоимение: тестируйте неоднозначные вопросы отдельно.
Проверяйте случай потери контекста отдельно от неверного факта: когда модель пишет «пятница», имея историю с «вторник», причина может быть в ошибочном выборе истории или в неверном пересказе корректной истории. Сохраняйте идентификатор сессии рядом с диагностическим безопасным набором сообщений, но не отправляйте содержимое разговоров другому пользователю для отладки. После восстановления серверного хранилища запустите продолжение с тем же учебным примером и убедитесь, что ответ остался привязан к R-7.
Критерии приёмки
- Во втором ответе распознана связь с R-7 и вторником, а не случайной другой записью.
len(second.all_messages())больше либо равноlen(second.new_messages()), но качество проверяют по смыслу, не по одной длине.- История одного пользователя не попадает в вызов другого.
Проверка успешного выполнения Python-программы не равна проверке верности ответа нейросети. Сопоставьте результат с входом и с доверенным источником данных, затем повторите тест на отрицательном примере. Формулировка текста может отличаться от образца; условия приёмки описывают наблюдаемое поведение, которое действительно нужно пользователю. Если один критерий не соблюдён, не скрывайте сбой повтором без ограничения: сохраните минимальный безопасный воспроизводимый пример и исправьте соответствующий слой — данные, схему, инструмент, инструкцию или обработку ошибки.
Частые ошибки и чего не делать
- Не храните единственную глобальную переменную
historyдля всех посетителей веб-сайта. - Не добавляйте
first.all_messages()повторно к уже полной истории второго шага. - Не принимайте историю, присланную браузером, как доказательство личности пользователя.
Вопросы и ответы
Что передать во второй вызов?
message_history=first.all_messages() для этой же сессии.
Чем отличается new_messages?
В нём только сообщения текущего запуска.
Сохраняет ли Agent историю автоматически?
Передачу и изоляцию истории организует приложение.
Официальные источники
Частые вопросы
Что передать во второй вызов?
`message_history=first.all_messages()` для этой же сессии.
Чем отличается new_messages?
В нём только сообщения текущего запуска.
Сохраняет ли Agent историю автоматически?
Передачу и изоляцию истории организует приложение.
Читайте также
Как дать агенту Pydantic AI инструмент чтения справки без права записи
Инструмент tool_plain для чтения вымышленной справки: минимальные полномочия, пример вопроса, проверка вызова и защита от ложных ответов.
Как извлечь поля заявки из русского письма через Pydantic AI и output_type
Пошаговое извлечение темы и номера заявки в Pydantic AI: схема BaseModel, конкретное письмо, проверка полей и ошибки, которые не исправит одна валидация.
Как ограничить число обращений агента Pydantic AI к модели через request_limit
Ограничение числа модельных шагов Pydantic AI: UsageLimits(request_limit), обработка исключения и тест на цикл инструмента.
Комментарии
Пока тихо. Скажите первое слово