a2a代理验证器
端到端验证A2A协议代理卡。获取众所周知的端点,根据A2A规范验证卡结构,对功能进行分类,包括 谷歌AP2(代理支付协议) 并返回一个包含16个布尔类别和17个条目字段的结构化快照。兼容 erc8004-registry-parser 作为验证插件。
快速启动
git clone https://github.com/agentprobe/a2a-agent-validator.git
cd a2a-agent-validator
npm iimport { A2aAgentValidator } from 'a2a-agent-validator'
const { status, messages, 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, messages: [] }| 密钥 | 类型 | 描述 |
|---|---|---|
| 状态 | 布尔值 | true 如果卡有效 |
| messages | string\[\] | 验证错误消息 |
______________________________________________________________________
.start( { endpoint, timeout } )
对类别和条目进行全面验证。
方法
.start( { endpoint, timeout } )| 密钥 | 类型 | 描述 | 必填 |
|---|---|---|---|
| endpoint | string | A2A代理的基本URL | 是 |
| timeout | number | 请求超时(毫秒)(默认值:10000) | 否 |
退货
{ status: true, messages: [], categories: { ... }, entries: { ... } }| 密钥 | 类型 | 描述 |
|---|---|---|
| 状态 | 布尔值 | true 如果没有验证错误 |
| messages | string\[\] | 验证错误消息 |
| 类别 | 对象 | 16个布尔功能标志 |
| 条目 | 对象 | 17个提取的数据字段 |
______________________________________________________________________
.compare( { before, after } )
比较两个快照并返回结构化差异。
方法
.compare( { before, after } )| 密钥 | 类型 | 描述 | 必填 |
|---|---|---|---|
| before | object | 上一个快照(来自 .start()) | 是 |
| after | object | 当前快照(来自 .start()) | 是 |
退货
{ status: true, messages: [], hasChanges: false, diff: { ... } }| 密钥 | 类型 | 描述 |
|---|---|---|
| status | boolean | 始终 true 验证后 |
| messages | string\[\] | 警告消息(不同服务器,时间戳顺序) |
| 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时间戳 |
验证码
VAL——输入验证
| 代码 | 严重性 | 描述 |
|---|---|---|
| VAL-001 | 警告 | 端点:缺少值 |
| VAL-002 | 警告 | 端点:必须是字符串 |
| VAL-003 | 警告 | 端点:不能为空 |
| VAL-004 | 警告 | 端点:必须是有效的URL |
| VAL-005 | 警告 | 超时:必须是数字 |
| VAL-006 | 警告 | 超时:必须大于0 |
| VAL-007 | 警告 | 之前/之后:缺少值、必须是对象或缺少类别/条目 |
| VAL-008 | 警告 | 之前/之后:缺少值、必须是对象或缺少类别/条目 |
CON-A2A连接
| 代码 | 严重性 | 描述 |
|---|---|---|
| CON-010 | 信息 | 无法访问服务器 |
| CON-011 | 信息 | 找不到代理卡(HTTP 404) |
| CON-012 | 信息 | HTTP错误 |
| CON-013 | 信息 | 响应不是有效的JSON |
| CON-014 | 信息 | 请求超时 |
CSV——卡片结构验证
| 代码 | 严重性 | 描述 |
|---|---|---|
| CSV-020 | 警告 | 缺少必填字段“name” |
| CSV-021 | 警告 | 缺少必填字段“描述” |
| CSV-022 | 警告 | 缺少必填字段“version” |
| CSV-023 | 警告 | 缺少必填字段“supported_interface” |
| CSV-024 | 警告 | supported_interface不能为空 |
| CSV-025 | 警告 | 缺少必填字段“功能” |
| CSV-026 | 警告 | 缺少必填字段“default_input_modes” |
| CSV-027 | 警告 | 缺少必填字段“default_output_modes” |
| CSV-028 | 警告 | 缺少必填字段“技能” |
| CSV-030 | 警告 | 支持的接口:url缺少值 |
| CSV-031 | 警告 | 支持的接口:url必须是有效的HTTPS url |
| CSV-032 | 警告 | 支持的接口:缺少protocol_binding |
| CSV-033 | 警告 | 支持的接口:缺少protocol_version |
| CSV-034 | 警告 | 技能:id缺少值 |
| CSV-035 | 警告 | 技能:名称缺少值 |
| CSV-036 | 警告 | 技能:描述缺少值 |
| CSV-037 | 警告 | 技能:标签缺少值 |
| CSV-038 | 警告 | 技能:标签必须是非空数组 |
| CSV-040 | 警告 | provider.url:缺少值 |
| CSV-041 | 警告 | 提供者组织:缺少值 |
CMP——比较
| 代码 | 严重性 | 描述 |
|---|---|---|
| CMP-001 | 警告 | 快照来自不同的代理 |
| CMP-002 | 警告 | 快照之前没有时间戳 |
| CMP-003 | 警告 | 快照后比以前旧 |
许可证
麻省理工学院
