# Pydantic AI 联合输出：报价成功与缺字段追问分成两种类型，禁止半成品报价

已用真实Pydantic验证两种互斥类型并拒绝混杂反例，已构造Pydantic AI联合输出Agent；未运行模型分支选择。

## 运行

在本目录使用独立虚拟环境并安装requirements.txt；脚本结果写入results。

```sh
python reference/audit.py
python reference/run_sdk.py
```

fixtures是原创输入与故意失败样本；作者真值、离线合成provider和实际SDK记录各自标明，不是模型正确率。需要真实模型/账号/GPU的步骤按正文另行授权运行。

## 1. 把完整与缺项询价分开

requests.json中Q1有quantity=4和单价12.50，Q2没有数量。不能把缺数量默认成1，更不能只因为模型能输出JSON就当成可报价。

## 2. 定义两种互斥结果

Quote保留kind、quantity和total；NeedsInfo只保留kind与missing。两类都禁止extra字段，防止报价对象同时夹带缺项提示。

## 3. 用Decimal先算作者真值

运行audit.py复算4×12.50=50.00。author-outputs.json明确是作者参考输出，不冒称来自模型；业务算术检查独立于模型。

## 4. 验证联合类型与坏输出

运行run_sdk.py，TypeAdapter应分别接受Quote/NeedsInfo，拒绝negative-mixed-output.json的空数量与混杂字段。保留完整ValidationError原因。

## 5. 把联合类型交给真实Agent

脚本实际构造Agent(output_type=[Quote,NeedsInfo])，但没有运行该Agent。授权使用真实provider时，先确认它的工具或原生结构化输出支持情况。

## 6. 分别运行两种询价路径

在自己的环境给Q1/Q2逐条推理，缺数量必须得到NeedsInfo，完整请求必须满足数量和总价。任何半成品报价都不能因通过语法校验而放行。

## 7. 交付分支和金额验收

保存原始模型输出、最终类型与独立Decimal复算结果。JSON结构合格、分支选对和金额正确是三项验收，本文只实测作者数据与类型契约。

## 官方依据

- Pydantic AI 官方文档或源码：https://raw.githubusercontent.com/pydantic/pydantic-ai/main/docs/output.md
