离线 A2A 合同验证项目
项目目标
构建一个只依赖 Python 标准库的验证器,对教学 fixture 执行三类检查:
- A2A
1.0Agent Card 的必需字段、接口版本与 Part/Skill 基线; - Task 快照序列的 ID、Context、状态转换和完成 Artifact;
- 对
0.3结构混入、终态回退和 Part one-of 错误的失败关闭。
证据边界
本项目只验证课程明确实现的结构和本地状态策略。它没有启动官方 SDK,没有验证 JSON-RPC/gRPC/HTTP+JSON wire 行为、TLS、JWS、OAuth、webhook、流式顺序、真实 TCK 或跨供应商互操作,因此不能称为 A2A conformance test。
项目文件
examples/a2a_contract_validator.py:合同与状态验证器;examples/a2a_cases.json:一组有效与三组故意失败用例;examples/test_a2a_contract_validator.py:离线回归测试。
运行方式
从仓库根目录执行:
python -B "docs\A2A\examples\a2a_contract_validator.py" --cases "docs\A2A\examples\a2a_cases.json" # 用离线场景验证 Agent Card、Task 与 Artifact 合同;-B 不生成缓存
python -B "docs\A2A\examples\test_a2a_contract_validator.py" # 运行 A2A validator 的回归测试,检查正负向合同边界不需要安装依赖、联网、密钥或付费账户。成功时 CLI 会逐项打印 PASS,测试应报告 10 个用例通过。
有效 Agent Card 的本地基线
验证器要求:
name、description、Agentversion非空;supportedInterfaces至少一项,生产 URL 使用 HTTPS;- 每个接口声明
JSONRPC、GRPC、HTTP+JSON,或使用绝对 HTTP(S) URI 标识自定义 binding;后者是本项目为便于安全检查采用的更窄策略,官方规范本身要求使用 URI 标识; - 本课程基线固定
protocolVersion: "1.0"; capabilities为对象;- 默认输入/输出媒体类型和
skills非空; - 每个 skill 具有
id/name/description/tags。
部分要求是 A2A 1.0 必需字段,HTTPS 与固定 1.0 也是本项目的部署/教学策略。验证错误会明确标注是本地基线,避免把项目策略伪装成协议原文。
输入读取还会拒绝重复 JSON 字段与非标准数值;Part 的 raw 成员必须是可解码的 Base64。这样能避免解析器静默覆盖前值,也避免把“非空字符串”误当成已经验证的字节载荷。
Task 快照策略
fixture 使用同一 Task 的连续快照演示状态变化。验证器要求:
- Task ID 和
contextId在序列中不变化; - 状态必须使用 A2A 1.0 枚举;
- 终态不能回到工作态;
COMPLETED至少有一个 Artifact;- Artifact 有 ID 与 Part;
- 每个 Part 只设置
text/raw/url/data之一。
真实协议并不要求客户端把全部状态保存成这类 JSON 数组;这是为了让状态与负向测试可以离线复现。
四类 fixture
| 用例 | 预期 | 验证重点 |
|---|---|---|
valid-v1-contract | 通过 | 1.0 Card、工作→完成、结构化 Artifact |
reject-v03-shape | 失败 | 顶层 URL、旧小写状态和 kind Part |
reject-terminal-regression | 失败 | COMPLETED 后回到 WORKING |
reject-ambiguous-part | 失败 | 同一 Part 同时含 text 与 data |
为什么测试错误信息
只断言“返回失败”容易让实现用错误原因碰巧通过。fixture 还声明 expectedErrors,CLI 与测试会确认相应错误片段确实出现。例如 reject-v03-shape 必须同时暴露接口结构、状态枚举和旧 Part 三类迁移问题。
扩展练习
- 增加
securitySchemes/securityRequirements的本地部署策略,但标明哪些不是协议必需字段; - 增加流事件 one-of、Artifact chunk 聚合和重复事件测试;
- 为 URL Part 增加 scheme、域名、解析 IP 和重定向策略;
- 用两个不同语言的官方 SDK 建立客户端/服务端矩阵,并把结果与本项目离线验证分开报告;
- 接入官方 Inspector/TCK 时,保存工具版本、规范版本、命令与原始结果摘要。
掌握检查
- 能说明本地策略与规范强制要求的差别;
- 能解释每个负向 fixture 阻止了什么迁移或安全问题;
- 能新增错误用例而不放宽已有失败关闭;
- 能列出从本项目升级到真实互操作测试仍缺少的证据。