Files
synapse/docs/v1/02_a2a-protocol.md
2026-06-28 03:24:26 +08:00

354 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 消息