问题出现得很突然,日志倒是留得挺全。pydantic-ai 0.0.20 建 Agent("openai:gpt-4o-mini", result_type=Invoice),运行时报 UserError: Unable to generate JSON schema for result_type,Invoice 里有 datetime 和 Decimal 两个字段。

刚开始盯着「result_type 传的是 dataclass,不是 pydantic BaseModel」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。datetime 与 Decimal 不是 JSON 原生类型,schema 生成器不支持。少数情况下是模型里用了自定义 validator,但没有给出对应的 JSON 描述。

不容易想到的是,字段名以下划线开头,被视为私有属性被排除。

单独打印模型的 JSON schema 看卡在哪

python -c "from pydantic import BaseModel;from datetime import datetime;print(BaseModel.model_json_schema())"

然后把时间与金额改成字符串字段,由业务层转换

python -c "print({'issued_at':'str','amount':'str'})"

给字段加 field_serializer 输出 ISO 字符串

python -c "from pydantic import BaseModel,field_serializer;print('serializer ok')"

等前面都确认过,再改成 BaseModel 后重新注册 Agent 再跑一次

python -c "from pydantic_ai import Agent;print(Agent('openai:gpt-4o-mini', result_type=dict))"

改完先别撤,确认这几项。Agent 正常返回 Invoice 实例,issued_at 是 ISO 格式字符串,金额解析成 Decimal 后与原文一致。

提醒一点。结构化输出的类型要先过 JSON 这一关,日期、金额、枚举都以字符串或整数进模型,再在业务侧转成强类型,能少掉一大半 schema 报错。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189