跳转到内容

PydanticAI 的多轮对话消息管理

PydanticAI 的多轮对话消息管理

学习目标

补充理解:

  • ModelRequest / ModelResponse 统一消息类型系统
  • Part 模型(而非原始消息)的设计
  • 多模态内容与消息序列化的实现

前置知识


1. 统一消息类型系统

PydanticAI 将所有消息统一为两种类型:

请求侧(ModelRequestPart)

SystemPromptPart # 开发者编写的系统提示
UserPromptPart # 用户输入(文本或多模态)
ToolReturnPart # 工具执行结果(success/failed/denied 三种 outcome)
RetryPromptPart # 反馈给模型的重试提示(包含错误详情列表或字符串)

响应侧(ModelResponsePart)

TextPart # 纯文本回复
ThinkingPart # 模型思考/推理内容
ToolCallPart # 函数工具调用
NativeToolCallPart # 原生工具调用(提供商内置工具)
FilePart # 文件/二进制响应
CompactionPart # 对话历史压缩摘要

与通用消息系统的差异

  • 通用 Agent 框架通常使用原始消息类型(如 OpenAI 的 system/user/assistant/tool 角色)
  • PydanticAI 使用Part 序列——一个 ModelRequest 可以包含多个 Part(系统提示 + 用户提示 + 工具结果)
  • Part 是更细粒度的——支持更灵活的消息组合(如动态指令作为单独的 InstructionPart

2. 多模态内容

PydanticAI 支持多种多模态内容类型:

FileUrl (抽象) → ImageUrl, AudioUrl, DocumentUrl, VideoUrl
BinaryContent → 内联二进制数据(data: bytes, media_type, base64, data_uri)
UploadedFile → 提供商上传的文件引用(file_id, provider_name)

每种类型都有对应的媒体类型枚举和格式枚举——确保类型安全。

3. 消息序列化

ModelMessagesTypeAdapter 使用 Pydantic TypeAdapter 实现完整的 JSON 序列化/反序列化:

ModelMessagesTypeAdapter.dump_json(messages) # → bytes
ModelMessagesTypeAdapter.validate_json(data) # → list[ModelMessage]

关键点:消息携带 run_idconversation_id——支持跨运行的消息追踪。多轮对话中,消息历史可以在不同 agent run 间传递。

4. CompactionPart

当对话上下文过长时,CompactionPart 用于压缩早期消息为摘要——类似于通用记忆系统中的上下文压缩策略。

5. Delta 流式类型

用于流式更新的增量类型:

TextPartDelta # content_delta — 追加的文本片段
ThinkingPartDelta # content_delta, signature_delta — 思考增量
ToolCallPartDelta # tool_name_delta, args_delta, tool_call_id — 工具调用增量

这使得流式更新可以高效地传输增量而非完整快照。