# A2A 协议(Agent-to-Agent Protocol) > 版本:1.0.0 > 状态:规范 > 层级:子协议层 > 基于:[灵隙原始协议](01_raw-protocol.md) > 前缀:`p2p:` --- ## 1. 定位 A2A 协议定义两个 Agent 之间进行点对点任务协作的规范,包括任务提交、进度同步、信息补全、人类介入、能力发现等核心交互。 **适用场景**: - 单个任务请求与响应 - 任务状态实时同步 - 任务取消 - 信息补全交互 - 人类介入决策 **非适用场景**: - 多 Agent 群组协作(参见 A2N 协议) - 非 Agent 调用方接入(参见 P2A 协议) --- ## 2. 功能定义 ### 2.1 任务管理 | 功能 | 说明 | |-----|------| | 任务提交 | 请求方向执行方提交任务 | | 任务确认 | 执行方接受任务 | | 任务拒绝 | 执行方拒绝任务(附带原因) | | 任务取消 | 请求方中途取消任务 | | 任务进度 | 执行方实时上报进度 | | 任务完成 | 执行方上报成功结果 | | 任务失败 | 执行方上报失败原因 | ### 2.2 信息补全 | 功能 | 说明 | |-----|------| | 信息请求 | 执行方发现缺少必要信息时请求补充 | | 信息提供 | 请求方提供补充信息 | ### 2.3 人类介入(HiL) | 功能 | 说明 | |-----|------| | HiL 请求 | 执行方请求人类决策 | | HiL 响应 | 请求方返回人类决策结果 | ### 2.4 能力发现 | 功能 | 说明 | |-----|------| | 能力查询 | 查询对方支持的任务类型和能力 | | 能力响应 | 返回能力清单 | ### 2.5 保活与确认 | 功能 | 说明 | |-----|------| | 心跳 | 双向心跳保活 | | ACK | 任务级确认 | | 消息 ACK | 消息级确认 | | 消息 NACK | 消息级否定确认(附带错误) | --- ## 3. 消息类型定义 所有消息类型前缀:`p2p:` ### 3.1 任务类消息 | 消息类型 | 方向 | 说明 | |---------|------|------| | `p2p:task_request` | 请求方 → 执行方 | 提交任务请求 | | `p2p:task_confirm` | 执行方 → 请求方 | 确认接受任务 | | `p2p:task_reject` | 执行方 → 请求方 | 拒绝任务 | | `p2p:task_status_update` | 执行方 → 请求方 | 任务进度更新 | | `p2p:task_complete` | 执行方 → 请求方 | 任务完成 | | `p2p:task_failed` | 执行方 → 请求方 | 任务失败 | | `p2p:task_cancel` | 请求方 → 执行方 | 取消任务 | | `p2p:task_ack` | 双向 | 任务级确认 | ### 3.2 信息类消息 | 消息类型 | 方向 | 说明 | |---------|------|------| | `p2p:task_need_info` | 执行方 → 请求方 | 请求补充信息 | | `p2p:task_info_provided` | 请求方 → 执行方 | 提供补充信息 | ### 3.3 HiL 类消息 | 消息类型 | 方向 | 说明 | |---------|------|------| | `p2p:task_need_human` | 执行方 → 请求方 | 请求人类介入 | | `p2p:human_decision` | 请求方 → 执行方 | 人类决策结果 | ### 3.4 能力类消息 | 消息类型 | 方向 | 说明 | |---------|------|------| | `p2p:capability_query` | 双向 | 查询对方能力 | | `p2p:capability_response` | 双向 | 返回能力清单 | ### 3.5 保活与确认类消息 | 消息类型 | 方向 | 说明 | |---------|------|------| | `p2p:heartbeat` | 双向 | 心跳保活 | | `p2p:ack` | 双向 | 通用确认 | | `p2p:nack` | 双向 | 通用否定确认 | --- ## 4. 任务状态机 ### 4.1 状态定义 | 状态 | 说明 | |------|------| | `idle` | 空闲(初始状态) | | `pending` | 待确认(已发送请求) | | `confirmed` | 已确认(执行方接受) | | `executing` | 执行中 | | `info_needed` | 需要信息 | | `info_provided` | 信息已提供 | | `need_human` | 需要人类介入 | | `human_deciding` | 人类决策中 | | `human_approved` | 人类已批准 | | `human_rejected` | 人类已拒绝 | | `completed` | 已完成(终态) | | `failed` | 已失败(终态) | | `cancelled` | 已取消(终态) | | `rejected` | 已拒绝(终态) | ### 4.2 状态流转 请求方视角: ``` idle → pending → confirmed → executing → completed ↓ ↓ → failed rejected info_needed → cancelled ↑↓ info_provided ↓ need_human ↑↓ human_deciding ↓ human_approved / human_rejected ``` --- ## 5. 交互流程 ### 5.1 正常任务流程 ``` 请求方 执行方 | | |---- p2p:task_request ------------>| 提交任务 | | |<--- p2p:task_confirm -------------| 确认接受 | | |<--- p2p:task_status_update (多次) --| 进度更新 | | |<--- p2p:task_complete ------------| 完成通知 | | |---- p2p:task_ack ---------------->| 确认收到 ``` ### 5.2 信息补全流程 ``` 请求方 执行方 | | |---- p2p:task_request ------------>| | | |<--- p2p:task_need_info -----------| 发现信息缺失 | | |---- p2p:task_info_provided ------->| 补充信息 | | |<--- p2p:task_status_update -------| 继续执行 ``` ### 5.3 人类介入流程 ``` 请求方 执行方 | | |---- p2p:task_request ------------>| | | |<--- p2p:task_need_human ----------| 需要人类决策 | | | [人类做出决策] | | | |---- p2p:human_decision ---------->| 决策结果 | | |<--- p2p:task_status_update -------| 继续执行 ``` ### 5.4 任务取消流程 ``` 请求方 执行方 | | |---- p2p:task_request ------------>| | | |---- p2p:task_cancel ------------->| 取消任务 | | |<--- p2p:task_ack -----------------| 确认取消 ``` ### 5.5 任务拒绝流程 ``` 请求方 执行方 | | |---- p2p:task_request ------------>| | | |<--- p2p:task_reject --------------| 拒绝(附带原因) ``` --- ## 6. 载荷结构定义 ### 6.1 task_request 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务唯一标识(请求方生成) | | `task_type` | string | ✓ | 任务类型 | | `payload` | object | ✓ | 任务参数(结构由 task_type 决定) | | `priority` | string | - | 优先级:`low`/`normal`/`high`/`urgent` | | `transport_preferences` | object | - | 传输偏好(回调/轮询等) | ### 6.2 task_confirm 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `estimated_time` | string | - | 预估耗时(如 "30s-2min") | ### 6.3 task_reject 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `reason` | object | ✓ | 拒绝原因(含错误码和描述) | ### 6.4 task_status_update 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `status` | string | ✓ | 当前状态 | | `progress` | integer | - | 进度百分比(0-100) | | `message` | string | - | 状态说明 | | `eta` | string | - | 预估完成时间 | ### 6.5 task_complete 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `result` | object | ✓ | 任务结果(结构由 task_type 决定) | | `summary` | string | - | 结果摘要 | | `metadata` | object | - | 结果元数据 | ### 6.6 task_failed 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `error` | object | ✓ | 错误信息(错误码 + 描述 + 详情) | ### 6.7 task_need_info 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `missing_fields` | array | ✓ | 缺失的字段列表 | | `reason` | string | ✓ | 缺失原因 | ### 6.8 task_info_provided 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `provided_info` | object | ✓ | 补充的信息 | ### 6.9 task_need_human 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `escalation_level` | integer | ✓ | 升级级别(1/2/3) | | `reason` | object | ✓ | 介入原因 | | `options` | array | - | 可选方案列表 | | `suggested_value` | object | - | Agent 建议值 | ### 6.10 human_decision 载荷 | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `task_id` | string | ✓ | 任务标识 | | `decision` | object | ✓ | 决策内容 | | `decided_by` | object | ✓ | 决策者信息(用户 ID + 角色) | --- ## 7. 错误处理 参见数字分段错误码系统(1000-9999): | 分段 | 类别 | |------|------| | 1000-1999 | 系统错误 | | 2000-2999 | 任务错误 | | 3000-3999 | 信息错误 | | 4000-4999 | 能力错误 | | 5000-5999 | 安全错误 | | 6000-6999 | 通信错误 | --- ## 8. 接口要求 Agent 实现 A2A 协议时必须提供: | 接口 | 说明 | |------|------| | 消息处理器 | 接收并处理 p2p:* 类型消息 | | 任务处理器 | 执行具体任务逻辑 | | 回调发送器 | 发送进度、完成、失败等回调 | | 状态查询 | 支持任务状态查询 | --- ## 9. 与其他协议的关系 - **依赖原始协议**:使用统一消息信封、签名机制 - **被 A2N 协议依赖**:群组内单播通信复用 A2A - **被 P2A 协议封装**:外部调用最终转换为 A2A 消息