使用说明
a2a代理验证器
端到端验证A2A协议代理卡。获取众所周知的端点,根据A2A规范验证卡结构,对功能进行分类,包括 谷歌AP2(代理支付协议) 并返回一个包含16个布尔类别和17个条目字段的结构化快照。兼容 erc8004-registry-parser 作为验证插件。
快速入门
git clone https://github.com/agentprobe/a2a-agent-validator.git
cd a2a-agent-validator
npm i
import { A2aAgentValidator } from 'a2a-agent-validator'
const { status, findings, categories, entries } = await A2aAgentValidator.start( {
endpoint: 'https://agent.example.com',
timeout: 15000
} )
特性
- 从获取代理卡
/.well-known/agent-card.json(A2A规范标准) - 验证卡片结构:必填字段、接口、技能、提供者
- 对16个布尔类别进行分类(可达、技能、流、JSONRPC、GRPC、安全、AP2、x402、嵌入式流、ERC-8004)
- 发现 AP2(代理支付协议) 通过
capabilities.extensions阵列和X-A2A-ExtensionsHTTP标头--提取版本和角色 - 发现 x402 付款扩展和版本
- 发现 嵌入式流 (AP2+x402组合)
- 发现 ERC-8004 代理卡中的服务链接
- 提取17个输入字段(姓名、版本、技能、协议、提供者、AP2版本/角色、x402版本、扩展名)
- 比较两个快照并生成结构化差异
- 连接失败时返回包含所有错误类别的空快照
- 兼容
erc8004-registry-parser通过.validate()方法
建筑学
验证管道分四个顺序步骤处理A2A代理卡:
flowchart LR
A[endpoint] --> B[A2aConnector.fetch]
B -->|agent card + X-A2A-Extensions header| C[CardStructureValidator.validate]
C --> D[CapabilityClassifier.classify]
D -->|AP2 / x402 / ERC-8004 detection| E[SnapshotBuilder.build]
方法
所有方法都是静态的,并使用对象参数和对象返回。
.validate( { endpoint } )
与兼容的简单验证 erc8004-registry-parser。仅返回状态和结果。
方法
.validate( { endpoint } )
| 密钥 | 类型 | 描述 | 必填 |
|---|---|---|---|
| endpoint | string | A2A代理的基本URL | 是 |
退货
{ status: true, findings: [] }
| 密钥 | 类型 | 描述 |
|---|---|---|
| 状态 | 布尔值 | true 如果卡有效 |
| 查找结果 | object[] | 查找对象 { code, severity, location, message } |
.start( { endpoint, timeout } )
对类别和条目进行全面验证。
方法
.start( { endpoint, timeout } )
| 密钥 | 类型 | 描述 | 必填 |
|---|---|---|---|
| endpoint | string | A2A代理的基本URL | 是 |
| timeout | number | 请求超时(毫秒)(默认值:10000) | 否 |
退货
{ status: true, findings: [], categories: { ... }, entries: { ... } }
| 密钥 | 类型 | 描述 |
|---|---|---|
| 状态 | 布尔值 | true 如果没有验证错误 |
| 查找结果 | object[] | 查找对象 { code, severity, location, message } |
| 类别 | 对象 | 16个布尔功能标志 |
| 条目 | 对象 | 17个提取的数据字段 |
.compare( { before, after } )
比较两个快照并返回结构化差异。
方法
.compare( { before, after } )
| 密钥 | 类型 | 描述 | 必填 |
|---|---|---|---|
| before | object | 上一个快照(来自 .start()) |
是 |
| after | object | 当前快照(来自 .start()) |
是 |
退货
{ status: true, findings: [], hasChanges: false, diff: { ... } }
| 密钥 | 类型 | 描述 |
|---|---|---|
| status | boolean | 始终 true 验证后 |
| 调查结果 | 对象[] | CMP-* 完整性调查结果 { code, severity, location, message } (不同的服务器,时间戳顺序) |
| hasChanges | 布尔值 | true 如果检测到任何差异 |
| diff | object | 结构化diff,包括部分:身份、能力、技能、界面、安全性、类别 |
类别(16个布尔标志)
| 标志 | 描述 |
|---|---|
isReachable |
从端点收到HTTP响应 |
hasAgentCard |
已找到代理卡,JSON格式有效 |
hasValidStructure |
所有必填字段均已显示 |
hasSkills |
至少定义了一项技能 |
hasSecuritySchemes |
已配置安全方案 |
hasProvider |
提供程序信息 |
supportsStreaming |
capabilities.streaming === true |
supportsPushNotifications |
capabilities.push_notifications === true |
supportsJsonRpc |
接口与 protocol_binding: 'JSONRPC' |
supportsGrpc |
接口与 protocol_binding: 'GRPC' |
supportsExtendedCard |
capabilities.extended_agent_card === true |
hasDocumentation |
documentation_url 目前 |
supportsAp2 |
在中检测到AP2扩展 capabilities.extensions 或 X-A2A-Extensions 头球 |
supportsX402 |
在中检测到x402扩展 capabilities.extensions 或 X-A2A-Extensions 头球 |
supportsEmbeddedFlow |
检测到AP2和x402(代理支持嵌入式支付流) |
hasErc8004ServiceLink |
代理卡中发现ERC-8004服务链接 |
条目(17个数据字段)
| 条目 | 类型 | 描述 |
|---|---|---|
url |
string | 已验证端点 |
agentName |
string | 代理名称 |
agentDescription |
string | 代理描述 |
agentVersion |
string | 代理版本 |
providerOrganization |
string/null | 提供者组织 |
providerUrl |
string/null | 提供程序URL |
skillCount |
number | 技能数量 |
skills |
array | 技能 [{ id, name }] |
protocolBindings |
array | 协议绑定 ['JSONRPC', 'GRPC'] |
protocolVersion |
string | 第一个接口协议版本 |
defaultInputModes |
array | 默认输入模式 |
defaultOutputModes |
array | 默认输出模式 |
ap2Version |
string/null | AP2版本已从扩展URI中提取(例如。 "1.0") |
ap2Roles |
array/null | AP2角色来自 extension.params.roles (例如。 ["buyer", "seller"]) |
x402Version |
string/null | x402版本已从扩展URI中提取 |
extensions |
string/null | 原始 X-A2A-Extensions 标题值 |
timestamp |
string | ISO 8601时间戳 |
验证码
结果以结构化对象的形式发布 { code, severity, location, message } 符合
AgentProbe查找对象规范。 severity 小写(error / warning / info).这
VAL-1xx 和 CON-1xx 波段是a2a拥有的波段(百位数 1); CSV-* 代码是
已经是全球唯一的,并保留其号码。
VAL——输入验证(带 VAL-1xx)
| 代码 | 严重性 | 位置 | 消息 |
|---|---|---|---|
| VAL-101 | 错误 | 端点 | 缺少值 |
| VAL-102 | 错误 | 端点 | 必须是字符串 |
| VAL-103 | 错误 | 端点 | 不能为空 |
| VAL-104 | 错误 | 端点 | 必须是有效的URL |
| VAL-105 | 错误 | 超时 | 必须是数字 |
| VAL-106 | 错误 | 超时 | 必须大于0 |
| VAL-107 | 错误 | 之前 | 缺少值/必须是对象/缺少类别或条目 |
| VAL-108 | 错误 | 之后 | 缺少值/必须是对象/缺少类别或条目 |
CON-A2A连接(频带 CON-1xx)
| 代码 | 严重性 | 位置 | 消息 |
|---|---|---|---|
| CON-110 | 信息 | 空 | 无法访问服务器 |
| CON-111 | 信息 | 空 | 找不到代理卡(HTTP 404) |
| CON-112 | 信息 | 空 | HTTP错误 |
| CON-113 | 信息 | 空 | 响应不是有效的JSON |
| CON-114 | 信息 | 空 | 请求超时 |
CSV——卡片结构验证
| 代码 | 严重性 | 位置 | 消息 |
|---|---|---|---|
| CSV-020 | 警告 | 名称 | 缺少必填字段“名称” |
| CSV-021 | 警告 | 描述 | 缺少必填字段“描述” |
| CSV-022 | 警告 | 版本 | 缺少必填字段“version” |
| CSV-023 | 警告 | 支持的接口 | 缺少必填字段“支持的接口” |
| CSV-024 | 警告 | 支持的接口 | 不能为空 |
| CSV-025 | 警告 | 功能 | 缺少必填字段“功能” |
| CSV-026 | 警告 | 默认输入模式 | 缺少必填字段“默认输入模式” |
| CSV-027 | 警告 | 默认输出模式 | 缺少必填字段“默认输出模式” |
| CSV-028 | 警告 | 技能 | 缺少必填字段“技能” |
| CSV-030 | 警告 | 支持的接口[i].url | 缺少值 |
| CSV-031 | 警告 | 支持的接口[i].url | 必须是有效的HTTPS url |
| CSV-032 | 警告 | 支持的接口[i].procol_binding | 缺少值 |
| CSV-033 | 警告 | 支持的接口[i].procol_version | 缺少值 |
| CSV-034 | 警告 | 技能[i].id | 缺少值 |
| CSV-035 | 警告 | 技能[i].name | 缺少值 |
| CSV-036 | 警告 | 技能[i].description | 缺少值 |
| CSV-037 | 警告 | 技能[i].tags | 缺少值 |
| CSV-038 | 警告 | 技能[i].tags | 必须是非空数组 |
| CSV-040 | 警告 | provider.url | 缺少值 |
| CSV-041 | 警告 | 提供者组织 | 缺少值 |
CMP——比较
CMP-* 代码由发出 .compare() 作为结构化查找对象
{ code, severity, location: 'compare', message } 在其 findings 阵列——均匀 start().
这 diff 和 hasChanges 是结构化的,从不在代码上。
| 代码 | 严重性 | 描述 |
|---|---|---|
| CMP-001 | 警告 | 快照来自不同的代理 |
| CMP-002 | 警告 | 快照之前没有时间戳 |
| CMP-003 | 警告 | 快照后比以前旧 |
许可证
麻省理工学院
