灵隙(synapse) v1.0.0 版本

This commit is contained in:
lychang
2026-06-29 02:12:44 +08:00
parent 2c59efe0ca
commit 65710a4536
27 changed files with 1819 additions and 760 deletions

View File

@@ -1,6 +1,6 @@
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/poster/poster-aurora.svg">
<img src="docs/poster/poster-aurora.svg" alt="灵隙 Synapse" width="100%">
<source media="(prefers-color-scheme: dark)" srcset="docs/03-asset/poster-aurora.svg">
<img src="docs/03-asset/poster-aurora.svg" alt="灵隙 Synapse" width="100%">
</picture>
# 灵隙(Synapse)— 智能体协作协议栈
@@ -228,14 +228,14 @@ func main() {
| [docs/v1/03_a2n-protocol.md](docs/v1/03_a2n-protocol.md) | A2N 协议(群组协作) |
| [docs/v1/04_p2a-protocol.md](docs/v1/04_p2a-protocol.md) | P2A 协议(外部调用) |
| [docs/v1/05_identity-protocol-draft.md](docs/v1/05_identity-protocol-draft.md) | 去中心化身份与寻址(草案) |
| [docs/v1/components.md](docs/implement/components.md) | 七大组件层规范 |
| [docs/v1/content-system.md](docs/implement/content-system.md) | 内容类型系统 |
| [docs/v1/capabilities-system.md](docs/implement/capabilities-system.md) | 能力发现系统 |
| [docs/v1/error-codes.md](docs/implement/error-codes.md) | 数字分段错误码 |
| [docs/v1/hil-mechanism.md](docs/implement/hil-mechanism.md) | 人工干预机制 (HiL) |
| [docs/v1/grpc-transport.md](docs/implement/grpc-transport.md) | gRPC 传输规范 |
| [docs/v1/transport-modes.md](docs/implement/transport-modes.md) | 传输模式说明 |
| [docs/v1/message-extensions.md](docs/implement/message-extensions.md) | 消息扩展机制 |
| [docs/v1/components.md](docs/02-guide/components.md) | 七大组件层规范 |
| [docs/v1/content-system.md](docs/02-guide/content-system.md) | 内容类型系统 |
| [docs/v1/capabilities-system.md](docs/02-guide/capabilities-system.md) | 能力发现系统 |
| [docs/v1/error-codes.md](docs/02-guide/error-codes.md) | 数字分段错误码 |
| [docs/v1/hil-mechanism.md](docs/02-guide/hil-mechanism.md) | 人工干预机制 (HiL) |
| [docs/v1/grpc-transport.md](docs/02-guide/grpc-transport.md) | gRPC 传输规范 |
| [docs/v1/transport-modes.md](docs/02-guide/transport-modes.md) | 传输模式说明 |
| [docs/v1/message-extensions.md](docs/02-guide/message-extensions.md) | 消息扩展机制 |
---
@@ -246,9 +246,12 @@ synapse/
├── cmd/ # 命令行入口(待实现)
├── configs/ # 配置文件目录
├── docs/ # 文档
│ ├── v0/ # v0 版本协议文档
│ ├── v1/ # v1 版本协议文档
│ └── poster*.svg # 宣传海报(多种配色)
│ ├── v0/ # v0 协议规范
│ ├── v1/ # v1 协议规范
│ ├── 00-record/ # 会议与决策记录
│ ├── 01-draft/ # 草案与方案提议
│ ├── 02-guide/ # 实现指南参考
│ └── 03-asset/ # 资源附件(海报等)
├── internal/ # 内部实现代码
│ ├── agent/ # Agent 协议实现
│ │ ├── group/ # A2N 群组协议

View File

@@ -0,0 +1,452 @@
# 灵隙协议协作工作流程
> 版本:1.0.0
> 状态:生效
> 适用范围:docs/ 下所有协议文档的评审与修订
---
## 1. 文档角色体系
docs/ 下的文档按 **内容成熟度** 分为以下目录,每个目录有明确的角色边界:
```
docs/
├── v{数字}/ 协议规范 — 已定稿的协议定义,只增不改
├── 00-record/ 会议记录 — 协作过程中的决策记录
├── 01-draft/ 草案 — 待评审的技术方案提议
├── 02-guide/ 实现指南 — 已确认的实现参考和示例
└── 03-asset/ 资源附件 — 海报、图表等非文本资产
```
| 角色 | 目录 | 内容定位 | 可修改性 |
|------|------|---------|:--------:|
| **协议规范** | `v{数字}/` | 已确认的协议定义 | ❌ 锁定(仅通过新版本覆盖) |
| **会议记录** | `00-record/` | 协作中的决策记录 | ✅ 补充(不可推翻已确认条目) |
| **草案** | `01-draft/` | 待评审的技术提案 | ✅ 自由编辑 |
| **实现指南** | `02-guide/` | 参考实现的技术指南 | ✅ 更新 |
| **资源附件** | `03-asset/` | 海报、图表、图片等 | ✅ 更新 |
| **索引** | 各目录的 `00_index.md` | 目录清单和版本说明 | ✅ 同步更新 |
---
## 2. 文档版本独立规则
每一份文档独立维护版本号,不依赖目录版本:
### 2.1 版本号格式
```
{v1}.{v2}.{v3}
示例:
0.1 = 初始草案
0.2 = 草案修订
1.0.0 = 首次定稿
1.1.0 = 兼容性修订
2.0.0 = 不兼容修订
```
### 2.2 版本段含义
| 段位 | 含义 | 变更条件 |
|:---:|------|---------|
| **v1** | 主版本 | 不兼容的协议变更(如签名算法替换) |
| **v2** | 次版本 | 兼容的功能增补(如新增消息类型) |
| **v3** | 补丁 | 勘误、措辞澄清、格式调整 |
### 2.3 状态标签
每个文档元信息头必须有版本和状态:
```markdown
> 版本:0.3
> 状态:草案
```
```markdown
> 版本:1.0.0
> 状态:生效
```
```markdown
> 版本:1.0.0
> 状态:作废
> 作废原因:被 v2.0.0 替代
```
| 状态 | 说明 | 出现位置 |
|------|------|---------|
| `草案` | 待评审的内容 | `01-draft/` |
| `生效` | 已确认的规范 | `v{数字}/` |
| `作废` | 已被替代的旧版本 | `v{数字}/`(保留历史) |
### 2.4 版本与目录的对应关系
| 目录 | 文档版本范围 | 说明 |
|:----:|------------|------|
| `01-draft/` | `0.x` | 草案阶段,版本号从 0.1 起跳 |
| `v{数字}/` | `>= 1.0.0` | 定稿后从 1.0.0 开始,移入 v{数字} 目录 |
| `00-record/` | `1.0.0`(固定) | 会议记录不增量版本,日期区分 |
| `02-guide/` | `>= 1.0.0` | 实现指南跟随对应的协议版本 |
---
## 3. 协作场景
定义三种协作场景,覆盖不同粒度的决策:
### 3.1 方案讨论
| 项目 | 内容 |
|------|------|
| **触发条件** | 你对某个技术方向有想法,想讨论可行性 |
| **你的输入** | 一句话想法、一个疑问、一个未解决的问题 |
| **AI 产出** | 结构化分析(影响范围、可行方案、利弊对比) |
| **你的输出** | 决定方向:继续、换方案、搁置 |
### 3.2 草案评审
| 项目 | 内容 |
|------|------|
| **触发条件** | `01-draft/` 下有草案需要评审 |
| **AI 准备** | 提取草案的变更摘要、与现有规范的冲突点、待决议问题列表 |
| **你的输入** | 逐条拍板:通过 / 驳回(说明方向)/ 搁置 |
| **AI 产出** | 按决议更新草案、生成会议记录、更新索引 |
### 3.3 快速裁定
| 项目 | 内容 |
|------|------|
| **触发条件** | 发现现有规范中的歧义、矛盾或遗漏 |
| **AI 分析** | 指出问题所在、给出修正提案、标注影响范围 |
| **你的输入** | 一分钟内拍板 |
| **AI 产出** | 记录裁定到 `00-record/`,更新关联文档 |
---
## 4. 协作前准备
### 4.1 你需要准备的
| 场景 | 你需要提供 |
|------|-----------|
| **方案讨论** | 一句话描述你想讨论的方向或问题 |
| **草案评审** | 指定要评审的草案文件路径(`01-draft/` 下) |
| **快速裁定** | 指出有疑问的协议条款(文件+行号/章节) |
你不需要准备格式化的文档——AI 会将你的口语化表达转化为结构化内容。
### 4.2 AI 会准备的
根据你的输入,AI 自动准备以下内容:
| 场景 | AI 准备的内容 |
|------|-------------|
| **方案讨论** | 关联文档引用、影响范围分析、多个可选方案对比 |
| **草案评审** | 变更摘要(如是修订版)、与现有规范的冲突矩阵、待决议问题列表 |
| **快速裁定** | 问题定位、修正提案、受影响的文档列表 |
---
## 5. 协作流程
### 5.1 角色定义
整个协作中只有两个角色:
| 角色 | 你是谁 | 你的职责 |
|------|--------|---------|
| **你** | 决策者 | 提出方向、拍板决议、确认产出 |
| **AI 助理** | 执行者 | 分析方案、生成文档、记录决策、管理文件 |
AI 不做决策,只做**分析、建议和执行**。所有决议由你最终拍板。
### 5.2 标准交互流程
一次协作的通用交互步骤:
```
步骤 1 — 你提出问题
你说出想法、疑问或需求(可以是口语化的)
步骤 2 — AI 结构化回应
AI 提取关键信息,形成结构化内容供你评判:
├── □ 问题重述(确认理解正确)
├── □ 关联文档引用
├── □ 可选方案(如有)
├── □ 影响范围评估
└── □ 待确认事项(你需要拍板的问题)
步骤 3 — 你给出决议
你对 AI 提出的选项拍板,或提出修改方向
步骤 4 — AI 执行
AI 根据决议:
├── □ 更新或创建文档
├── □ 生成会议记录
└── □ 更新索引文件
步骤 5 — 你确认(可选)
你可以要求 AI 展示变更摘要,确认无误后结束
```
### 5.3 决议输入方式
你通过以下方式给出决议,AI 根据不同的输入方式执行相应操作:
| 你的输入 | AI 理解方式 | AI 执行 |
|---------|-----------|---------|
| 直接说结论(如"用方案一") | 明确选择 | 按选定方案执行 |
| 给出修改方向(如"把 X 改为 Y") | 指令式修改 | 执行具体修改 |
| 提供替代方案(如"试试这样...") | 新提议 | 分析后返回步骤 2 |
| 保留意见(如"先放一放") | 搁置 | 记录到待决议问题列表,不生成文件 |
| 要求更多信息(如"展开说说 DHT 的缺点") | 追问 | 深入分析后返回步骤 2 |
### 5.4 记录方式
每一轮交互结束后,AI 自动将决议记录到会议文件 `00-record/`,你不需要手动记录。
| AI 自动记录的内容 | 存放位置 |
|-------------------|---------|
| 决议结论 | `00-record/{日期}-{主题}.md` 的"决议事项"章节 |
| 决议理由 | 同上 |
| 影响范围 | 同上 |
| 后续行动项 | 同上 |
| 新生成/更新的草案 | `01-draft/{日期}-{草案名}-v{次}.md` |
### 5.5 一次协作中允许的操作
| 操作 | 规则 | 示例 |
|------|------|------|
| 切换话题 | 随时可以 | "不说签名了,聊聊 DHT" |
| 推翻之前的决议 | 可以,但需说明理由 | "刚才说的方案一我想了想还是不行,因为..." |
| 要求回滚 | 可以,AI 会从 git 历史恢复 | "把刚才生成的 draft 删掉" |
| 问多个问题 | 一个一个来,AI 会逐个回应 | 建议一个问题讨论完再提下一个 |
| 中途中断 | 随时可以,AI 会保存当前进度 | 下次继续时会提供断点摘要 |
---
## 6. 协作产出
### 6.1 AI 实时产出的文件
协作过程中,AI 实时生成以下文件,你无需等待:
```
产出文件清单:
├── □ 会议记录 → 00-record/{日期}-{主题}.md
├── □ 更新后的草案 → 01-draft/{日期}-{草案名}-v{次}.md
└── □ 索引更新 → 各目录的 00_index.md(如有变动)
```
### 6.2 会议记录模板
```markdown
# 会议记录:{主题}
> 日期:{YYYY-MM-DD}
> 类型:方案讨论 / 草案评审 / 快速裁定
---
## 议题
{一句话描述本次讨论的内容}
---
## 决议事项
### 决议一:{决议标题}
| 项目 | 内容 |
|------|------|
| **结论** | {结论简述} |
| **理由** | {决策理由} |
| **影响范围** | {影响的文档/模块列表} |
### 决议二:{决议标题}
...
---
## 补充讨论要点
{讨论中出现的值得记录的信息}
---
## 附录:关联文档
| 文档 | 说明 | 关系 |
|------|------|------|
| [{文档路径}](../path/to/doc.md) | {文档简述} | 本次讨论的基础/产出 |
---
## 后续行动
| 事项 | 目标版本 | 状态 |
|------|---------|:----:|
| {事项} | v{数字} | 待办 / 进行中 / 完成 |
```
### 6.3 文件命名规范
```
会议记录: {YYYY-MM-DD}-{英文短名}.md → 00-record/
草案: {YYYY-MM-DD}-{草案名}-v{次}.md → 01-draft/
协议规范文档: {编号}_{英文短名}.md → v{数字}/
实现指南文档: {英文短名}.md → 02-guide/
索引文件: 00_index.md → 各目录根目录
资源文件: {英文短名}.{后缀} → 03-asset/
```
---
## 7. 决议覆盖范围
在一次协作中,决议的影响范围按以下层次递进:
```
┌─────────────────────────────────────────┐
│ 单文件内的问题 │
│ 范围:措辞澄清 / 勘误 / 歧义裁定 │
│ 你的输入:一句拍板 │
│ AI 产出:修改文件 + 记录到 00-record │
└────────────────┬────────────────────────┘
│ 涉及跨文件/跨协议
▼
┌─────────────────────────────────────────┐
│ 跨文件的方案变更 │
│ 范围:涉及多个协议文档的技术决策 │
│ 你的输入:选择方案 + 确认影响范围 │
│ AI 产出:更新多份文档 + 更新/生成草案 │
└────────────────┬────────────────────────┘
│ 涉及版本范围/兼容性
▼
┌─────────────────────────────────────────┐
│ 版本级规划变更 │
│ 范围:决定 v1.0 / v1.1 / v2.0 的内容 │
│ 你的输入:指定版本范围和分工 │
│ AI 产出:更新 00_index.md + 记录到 00-record │
└─────────────────────────────────────────┘
```
你可以在任何层次上拍板,AI 会自动跟进所有下游影响。
---
## 8. 草案晋升路径
一份草案从创建到定稿的标准路径:
```
┌──────────┐
│ 想法 │
└────┬─────┘
│ 你说出想法,AI 写出草案
▼
┌───────────┐
│ 01-draft/ │ ←── 可任意修改
│ v0.1 │
└─────┬─────┘
│ 你评审 + 拍板修改方向
▼
┌───────────┐
│ 01-draft/ │ ←── 可修改
│ v0.2 │
└─────┬─────┘
│ 你确认定稿
▼
┌───────────┐
│ v{数字}/ │ ←── 锁定,只增不改
│ v1.0.0 │
└───────────┘
│ 后续修订
▼
┌───────────┐
│ v{数字}/ │
│ v2.0.0 │ ←── 不兼容修订另开新版本
└───────────┘
```
| 阶段 | 版本号范围 | 目录 | 修改权限 |
|:----:|:----------:|:----:|:--------:|
| 初始创建 | 0.1 | `01-draft/` | 自由编辑 |
| 修订中 | 0.2, 0.3... | `01-draft/` | 自由编辑 |
| 评审通过 | 1.0.0 | 移入 `v{数字}/` | 锁定 |
| 兼容修订 | 1.1.0, 1.2.0... | `v{数字}/` | 仅追加,不修改已有内容 |
| 不兼容修订 | 2.0.0 | 新建 `v{数字+1}/` | 旧版本作废,新版本重新锁定 |
---
## 9. 目录与文件命名规范
### 9.1 目录命名规则
| 规则 | 说明 |
|------|------|
| 协议规范目录 | 固定格式 `v{数字}`,数字表示协议主版本 |
| 其他内容目录 | 格式 `{两位数字}-{英文短名}`,数字按内容成熟度/使用频率排序 |
**已定义目录**:
```
docs/
├── v0/ v0 协议规范
├── v1/ v1 协议规范
├── 00-record/ 会议与决策记录
├── 01-draft/ 草案与方案提议
├── 02-guide/ 实现指南参考
└── 03-asset/ 资源附件(海报、图表等)
```
如需新增目录,新目录的编号插在末尾(当前为 03),待下次整理时统一重排。
### 9.2 文件命名规则
```
协议规范层(v{数字}/):
{两位数字}_{英文短名}.md
示例:01_raw-protocol.md
会议记录层(00-record/):
{YYYY-MM-DD}-{英文短名}.md
示例:2026-06-29-v1-draft-discussion.md
草案层(01-draft/):
{YYYY-MM-DD}-{草案名}-v{次}.md
示例:2026-06-29-identity-protocol-v2.md
实现指南层(02-guide/):
{英文短名}.md
示例:components.md
资源附件层(03-asset/):
{英文短名}.{后缀}
示例:poster.svg
索引文件:
00_index.md(各目录的根目录)
```
---
## 10. 免交互操作
以下情况不需要你开口,AI 直接执行:
| 场景 | AI 自行操作 | 例外 |
|------|-----------|------|
| 草案内的措辞修正 | 直接修改 `01-draft/` 文件 | 涉及技术含义的措辞变化需先问你 |
| 漏洞/矛盾自查 | 发现后指出并给出修复提案,等你确认后执行 | - |
| 会议记录遗漏补充 | 直接追加,标注 `[后补]` | 不能推翻已记录的决议 |
| 实现指南更新 | 直接修改 `02-guide/` 文件 | 引用到协议层规范时需通知你 |
| 索引文件同步 | 直接修改 `00_index.md` | 版本号变更必须与你确认一致 |
---
> *本文件本身遵循上述规范,如内容与实际操作不一致,以实际操作为准并及时修正本文件。*

View File

@@ -0,0 +1,111 @@
# 会议记录:v1 草案讨论会
> 日期:2026-06-29
> 时长:1 session
> 主题:灵隙 v1 版本身份协议草案讨论 & 版本规划
---
## 会议议题
围绕 [v1 身份协议草案](../v1/05_identity-protocol-draft.md) 的技术方案与版本规划进行讨论。
---
## 决议事项
### 决议一:签名机制统一为非对称签名
| 项目 | 内容 |
|------|------|
| **结论** | 直接统一到非对称签名体系 |
| **默认算法** | Ed25519(高效、安全) |
| **兼容算法** | ECDSA-P256(跨链互操作)、ECDSA-secp256k1(兼容以太坊系) |
| **HMAC 定位** | 降级为可信内网链路的可选优化,不作为协议层的签名方案 |
| **影响范围** | [Raw协议](../v1/01_raw-protocol.md) 第4章签名机制需重写,统一为公钥签名;`signature` 字段含义从 HMAC 变更为 Ed25519/ECDSA 签名值;`signature_algorithm` 字段保留,默认值改为 `Ed25519` |
### 决议二:区块链作为身份协议的核心组成部分
| 项目 | 内容 |
|------|------|
| **结论** | 区块链不是可选插件,而是身份协议的核心层 |
| **定位** | 三层发现架构中,区块链作为"最终一致性源"(Source of Truth) |
| **默认基础设施** | 每个 Synapse 网络应至少有一个链上注册表,作为 Agent 身份的最终存证 |
| **兼容性** | 支持多链:Ethereum(高价值)、Polygon(高频)、联盟链(企业) |
| **混合模式** | 本地缓存 + DHT 做快速查找,区块链做最终验证和仲裁 |
### 决议三:DHT 分阶段实现
| 阶段 | 范围 | 说明 |
|------|------|------|
| **Phase 1(v1.0)** | 广播查询 + 中心目录 | 小型网络(<100 Agent),用灵脉 Meridian 作为可选目录,无 DHT |
| **Phase 2(v1.1)** | 分层 DHT | 中等规模(100-10000 Agent),引入分层路由 |
| **Phase 3(v1.2)** | 完整 Kademlia + 隐私保护 + 密钥轮换 | 大规模网络(>10000 Agent),支持密钥轮换和隐私保护 |
### 决议四:七大组件实现推迟到 v1.1
| 项目 | 内容 |
|------|------|
| **结论** | v1 版本聚焦协议层定义(数据格式、消息类型、行为约束),不做具体落地实现 |
| **v1 范围** | Raw / A2A / A2N / P2A 四个协议规范 + 去中心化身份草案 |
| **v1.1 范围** | 七大组件(灵脉/灵玺/灵鉴/灵泊/灵瞰/灵衡/灵枢)的具体落地实现 |
| **v1.2 范围** | 完整 Kademlia DHT、隐私保护机制、密钥轮换、跨链互操作 |
---
## 补充讨论要点
### 1. 协议层与实现层的明确边界
v1 的身份草案目前包含部分实现细节(如 Solidity 合约代码),需要在 v2 版本中剥离:
- **协议层(v1)**:只定义 AgentID 格式、签名算法、消息类型、生命周期状态机
- **实现层(v1.1+)**:具体的区块链合约实现、DHT 协议栈、缓存策略
### 2. AgentID 命名空间治理
| 问题 | 方案 |
|------|------|
| namespace 的分配 | 官方保留 `synapse:` 前缀;企业自定义采用反向域名(如 `com.mycompany.agent:`) |
| alias 全局唯一性 | 不要求全局唯一,仅在本地或联盟内有效 |
| DID 兼容 | `did:synapse:` 独立成体系,与 `namespace:key_hash:alias` 格式并存 |
### 3. 签名算法选择理由
选择 Ed25519 作为默认算法的原因:
- 比 ECDSA-P256 快 2-3 倍
- 固定长度签名(64 字节),便于编码和存储
- 抗侧信道攻击,实现简单
- 所有主流语言均有成熟实现
### 4. 区块链选择建议
| 场景 | 推荐 | 理由 |
|------|------|------|
| 开发/测试 | 本地 Hardhat 私链 | 零成本、完全可控 |
| 企业联盟 | Hyperledger Fabric / 联盟链 | 隐私、可审计 |
| 公网生产 | Ethereum L2(Arbitrum/Optimism) | 低 Gas 成本、继承 L1 安全 |
| 高频场景 | Polygon / Solana | 确认快、成本低 |
---
## 附录:关联文档
| 文档 | 说明 | 关系 |
|------|------|------|
| [v1 身份草案](../v1/05_identity-protocol-draft.md) | 现有 v1 身份协议草案 | 本次讨论的基础文档 |
| [身份草案 v2](../01-draft/2026-06-29-identity-protocol-v2.md) | 根据本次决议更新的草案 | 基于本次决议生成 |
| [Raw协议](../v1/01_raw-protocol.md) | 原始协议定义 | 签名方案受影响需更新 |
| [v1 索引](../v1/00_index.md) | v1 版本索引 | 版本范围需更新 |
---
## 后续行动
| 事项 | 负责人 | 目标版本 | 状态 |
|------|--------|---------|------|
| 更新 Raw 协议签名方案 | - | v1.0 | 待办 |
| 更新身份草案为 v2 版本 | ✅ 已完成 | v1.0 | 完成 |
| 更新 v1 索引文件版本范围 | - | v1.0 | 待办 |
| 起草七大组件规范 | - | v1.1 | 待启动 |
| 起草 DHT 实现规范 | - | v1.1 | 待启动 |
| 链上合约实现 | - | v1.1 | 待启动 |

View File

@@ -0,0 +1,468 @@
# 灵隙去中心化身份与寻址协议 v2(草案)
> 版本:0.2(草案)
> 状态:草案
> 层级:基础设施层
> 依赖:[灵隙原始协议 v1](../v1/01_raw-protocol.md)
> 关联会议:[2026-06-29 v1草案讨论会](../00-record/2026-06-29-v1-draft-discussion.md)
---
## 摘要
本草案定义了灵隙协议栈中去中心化场景下的 Agent 身份认证与发现机制。v2 版本在 v1 草案基础上,根据 [2026-06-29 会议决议](../00-record/2026-06-29-v1-draft-discussion.md) 进行了以下核心调整:
1. **签名机制**:统一为非对称签名(Ed25519 默认)
2. **区块链定位**:从可选方案提升为身份协议的核心组成部分
3. **分层规范**:严格区分协议层(v1 本文件)与实现层(v1.1 的组件规范)
4. **版本规划**:DHT 实现按 Phase 分阶段推进
---
## 1. 协议层定义范围
本文件**仅定义**以下协议层内容:
- AgentID 的生成规则与格式
- 签名算法选择与验证流程
- 身份生命周期状态机
- 消息类型与载荷格式
- 发现协议的行为约束
**不包含**(移入实现层文档):
- Solidity / 智能合约实现代码 → 移入 `v1.1 链上注册表实现规范`
- DHT 协议栈实现细节 → 移入 `v1.1 DHT 实现规范`
- 缓存策略与具体数据结构 → 移入 `v1.1 灵脉 Meridian 组件规范`
---
## 2. AgentID 生成规则
### 2.1 ID 结构
```
AgentID = {namespace}:{key_hash}[:{alias}]
示例:
synapse:7hJ4x9K2mNpQ (无别名,官方命名空间)
synapse:7hJ4x9K2mNpQ:llm-agent-01 (带别名)
com.mycompany.agent:aB3dEfGhIjK (企业自定义命名空间)
did:synapse:ethereum:0x1234... (DID 格式)
```
| 部分 | 格式 | 必填 | 说明 |
|------|------|:----:|------|
| namespace | string | ✓ | 命名空间标识 |
| key_hash | base58 | ✓ | 公钥哈希的前 16 字节 |
| alias | string | - | 人类可读别名(可选,不要求全局唯一) |
### 2.2 命名空间治理
| 命名空间 | 所有者 | 说明 |
|---------|--------|------|
| `synapse:` | 灵隙协议官方 | 官方保留前缀,推荐所有 Agent 使用 |
| `did:synapse:` | 灵隙协议官方 | W3C DID 兼容格式,使用独立体系 |
| `{反向域名}:` | 企业/组织 | 如 `com.mycompany.agent:`,无需注册 |
| `test:` | 本地测试 | 仅用于开发测试环境 |
### 2.3 生成算法
```go
func GenerateAgentID(privateKey []byte, namespace string, alias string) string {
// 1. 从私钥派生公钥(Ed25519)
publicKey := ed25519.PrivateKey(privateKey).Public()
// 2. 计算公钥哈希
hash := sha3.Sum256(publicKey)
// 3. 取前 16 字节,Base58 编码
keyHash := base58.Encode(hash[:16])
// 4. 组装完整 ID
if alias != "" {
return fmt.Sprintf("%s:%s:%s", namespace, keyHash, alias)
}
return fmt.Sprintf("%s:%s", namespace, keyHash)
}
```
### 2.4 ID 特性
| 特性 | 说明 |
|------|------|
| 唯一性 | 相同公钥 → 相同 key_hash → 相同 AgentID |
| 不可伪造 | 无法在没有私钥的情况下生成有效 AgentID |
| 可验证 | 任何人都可以用公钥验证 AgentID 真实性 |
| 不可预测 | 私钥随机生成,key_hash 不可预测 |
---
## 3. 签名机制
### 3.1 签名算法栈
| 层级 | 算法 | 定位 | 说明 |
|------|------|------|------|
| **协议层(默认)** | **Ed25519** | 标准签名 | 所有消息的默认签名算法,64 字节签名值 |
| **协议层(兼容)** | ECDSA-P256 | 跨链互操作 | 与支持 P256 的链(如 Solana)互操作 |
| **协议层(兼容)** | ECDSA-secp256k1 | 以太坊系兼容 | 兼容以太坊、Polygon 等链 |
| **传输层(可选)** | HMAC-SHA256 | 内网优化 | 仅在可信内网链路中使用,不作为消息签名的替代 |
### 3.2 签名内容
签名覆盖的字段(UTF-8 编码后签名):
```
signature_content = sender.agent_id | receiver.agent_id | timestamp | payload
```
其中:
- `sender.agent_id`:发送方完整 AgentID(字符串)
- `receiver.agent_id`:接收方完整 AgentID(字符串,广播消息可省略)
- `timestamp`:RFC3339 时间戳字符串
- `payload`:消息载荷的 JSON 序列化字符串
- 分隔符 `|` 为竖线字符(0x7C)
### 3.3 签名验证流程
```
发送方:
1. 用私钥对 signature_content 签名
2. 将签名值写入消息的 signature 字段
3. 将公钥 / 算法标识随消息一起发送
接收方:
1. 从消息中提取 sender.agent_id 和 sender.public_key
2. 用 public_key 重新计算 agent_id 的 key_hash
3. 与消息中 sender.agent_id 的 key_hash 部分比对
4. 如匹配,用公钥验证签名
5. 如验证通过,确认消息来源可信
```
### 3.4 消息签名格式
消息信封中与签名相关的字段定义:
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|:----:|--------|------|
| `signature` | string | ✓ | - | Ed25519 签名值(Base64 编码) |
| `signature_algorithm` | string | ✓ | `Ed25519` | 签名算法标识 |
| `public_key` | string | ✓ | - | 发送方公钥(Base64 编码) |
### 3.5 算法标识枚举
| 标识值 | 算法 | 签名长度 |
|--------|------|---------|
| `Ed25519` | Ed25519 | 64 字节 |
| `ECDSA-P256` | ECDSA P-256 | 64-72 字节(DER 编码) |
| `ECDSA-secp256k1` | ECDSA secp256k1 | 64-72 字节(DER 编码) |
| `HMAC-SHA256` | HMAC SHA-256 | 32 字节(仅内网) |
### 3.6 公钥派生 AgentID 校验
接收方必须执行以下检查以验证消息来源的真实性:
```
1. 从 signature_algorithm 字段获取算法标识
2. 对 public_key 字段中的公钥进行哈希(算法依赖公钥类型)
3. 取哈希值前 16 字节,Base58 编码
4. 与 sender.agent_id 中的 key_hash 部分比对
5. 不一致 → 丢弃消息,返回 identity:validation_failed 错误
6. 一致 → 用 public_key 验证 signature
7. 签名无效 → 丢弃消息,返回 identity:signature_mismatch 错误
```
---
## 4. 发现协议
### 4.1 三层发现架构
```
查询优先级:本地缓存(快) → DHT(中) → 区块链(慢,最终源)
┌──────────────┐
│ Agent A │
│ (查询方) │
└──────┬───────┘
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ L1: │ │ L2: │ │ L3: │
│ 本地缓存 │ │ DHT │ │ 区块链 │
│ (内存) │ │ (网络) │ │ (链上合约) │
│ 微秒级 │ │ 毫秒级 │ │ 秒~分钟级 │
│ TTL 1min │ │ 弱一致 │ │ 最终一致性源 │
└──────────┘ └──────────┘ └──────────────┘
```
| 层级 | 组件 | 延迟 | 一致性 | v1.0 支持 | v1.1 支持 | v1.2 支持 |
|------|------|------|--------|:---------:|:---------:|:---------:|
| L1 | 本地缓存 | 微秒 | 最终(TTL) | ✓ | ✓ | ✓ |
| L2 | 广播查询 | 毫秒 | 弱 | ✓ | - | - |
| L2 | 分层 DHT | 毫秒~秒 | 最终 | - | ✓ | - |
| L2 | 完整 Kademlia | 毫秒 | 强 | - | - | ✓ |
| L3 | 区块链注册表 | 秒~分钟 | 最终一致性源 | ✓ | ✓ | ✓ |
### 4.2 L2 发现 — 广播查询(v1.0)
适用于小型网络,无需复杂路由:
```
请求(广播):
type: "identity:lookup"
target_id: "目标 AgentID"
requester_id: "查询方 AgentID"
timestamp: "2026-06-29T12:00:00Z"
响应(单播给查询方):
type: "identity:lookup_response"
target_id: "目标 AgentID"
endpoint: "http://target:8080"
public_key: "Base64 编码的公钥"
signature: "目标 Agent 对该端点的签名"
```
### 4.3 L3 发现 — 区块链注册表(v1.0+,核心层)
区块链作为最终一致性源,所有 Agent 身份以链上记录为权威来源。
#### 4.3.1 链上记录结构(协议层定义,实现见 v1.1)
```go
type OnChainAgentRecord struct {
AgentID string // Agent 唯一标识
Endpoint string // 当前网络地址
PublicKey []byte // 公钥
Status string // 状态:registered/active/suspended/revoked
RegisteredAt int64 // 注册时间戳
LastHeartbeat int64 // 最后心跳时间戳
}
```
#### 4.3.2 查询行为
```
1. 查询方构造 lookup 请求(可先查本地缓存,再查 DHT)
2. 本地和 DHT 均未命中 → 查询链上注册表
3. 收到链上记录后:
a. 验证链上记录的签名(已在合约级别验证过)
b. 更新本地缓存(设置 TTL)
c. 可选:广播到 DHT 加速后续查询
4. 链上记录缺失 → 返回 Agent 不存在
```
### 4.4 发现消息类型
| 消息类型 | 方向 | 说明 | v1.0 |
|---------|------|------|:----:|
| `identity:lookup` | 广播 | 查询 Agent 信息 | ✓ |
| `identity:lookup_response` | 单播 | 查询响应 | ✓ |
| `identity:register` | → 链 | 注册 Agent 身份 | ✓ |
| `identity:heartbeat` | → 链 | 心跳保活 | ✓ |
| `identity:revoke` | → 链 | 注销身份 | ✓ |
| `identity:challenge` | 双向 | Endpoint 验证挑战 | ✓ |
| `identity:challenge_response` | 双向 | 挑战响应 | ✓ |
| `dht:ping` | DHT | 节点探测 | v1.1 |
| `dht:store` | DHT | 存储记录 | v1.1 |
| `dht:find_value` | DHT | 查找 Agent 记录 | v1.1 |
| `dht:find_node` | DHT | 查找附近节点 | v1.2 |
| `dht:notify` | DHT | 通知记录更新 | v1.2 |
---
## 5. 身份生命周期
### 5.1 状态机
```
┌──────────────┐
│ 离线 │
│ (offline) │
└──────┬───────┘
│ 链上注册成功
▼
┌──────────────┐
┌─────────│ 活跃 │─────────┐
│ │ (active) │ │
│ └──────┬───────┘ │
│ │ 心跳刷新 │ 心跳超时
│ ▼ │
│ ┌──────────────┐ │
│ │ 待验证 │ │
│ │ (pending) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌─────────┴─────────┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 正常 │ │ 挂起 │ │
│ │ (active) │ │(suspended)│ │
│ └────┬─────┘ └────┬─────┘ │
└──────┴──────────────────┴───────┘
│
▼
┌──────────────┐
│ 已注销 │
│ (revoked) │
└──────────────┘
```
### 5.2 状态说明
| 状态 | 说明 | 链上状态 | DHT 可发现 |
|------|------|:--------:|:----------:|
| offline | 初始状态,未注册 | 无 | 否 |
| active | 已注册,心跳正常 | Registered | 是 |
| pending | 已注册,Endpoint 待验证 | Registered | 否 |
| suspended | 心跳超时(3 倍间隔) | Registered | 否 |
| revoked | 主动注销 | Revoked | 否 |
### 5.3 关键约束
| 行为 | 约束 |
|------|------|
| 注册 | 必须同时完成链上交易和本地签名验证 |
| 心跳 | 默认间隔 1 小时,可配置 |
| 挂起 | 超过 3 次心跳间隔未更新 → 自动挂起 |
| 注销 | 链上 revoke 交易 → 状态切换为 revoked |
| Endpoint 变更 | 必须通过心跳或更新交易声明新地址 |
---
## 6. Endpoint 验证
### 6.1 挑战-响应协议
为防止 Endpoint 欺骗,引入双向认证:
```
1. Agent A 声称自己是 "synapse:abc123:agent-A"
并声称其 Endpoint 是 "http://A:8080"
2. Agent B 收到声明后:
a. 用 A 的公钥验证 AgentID 合法
b. 向 Endpoint 发送挑战(包含随机 Nonce)
c. A 必须用私钥对 Nonce 签名响应
d. 响应通过 → Endpoint 绑定确认
```
### 6.2 消息载荷
```go
// 挑战消息(type: "identity:challenge")
type ChallengePayload struct {
ChallengeID string // 挑战唯一标识
Nonce []byte // 随机数(32 字节)
Timestamp string // 发送时间(RFC3339)
}
// 响应消息(type: "identity:challenge_response")
type ChallengeResponsePayload struct {
ChallengeID string // 对应挑战 ID
Nonce []byte // 原样返回的 Nonce
Signature []byte // 对 Nonce 的 Ed25519 签名
}
```
---
## 7. 安全考虑
### 7.1 威胁模型
| 威胁 | 防护措施 |
|------|---------|
| 身份伪造 | 公钥派生 ID + 签名验证(公钥不匹配 → 丢弃) |
| Endpoint 欺骗 | 挑战-响应协议(需私钥签名响应) |
| 重放攻击 | 时间戳窗口(±5min)+ Nonce 去重 |
| 中间人攻击 | TLS + 消息级签名验证 |
| 女巫攻击 | 链上质押(可选,由实现层控制) |
| 日食攻击 | 多路径查询(L1 → L2 → L3 多条路径) |
### 7.2 反重放机制
```go
type AntiReplayConfig struct {
Window time.Duration // 时间窗口(默认 5 分钟)
}
// 接收消息时必须执行:
// 1. 检查 timestamp 是否在 [now - Window, now + Window] 范围内
// 2. 检查 Nonce/CorrelationID 是否已处理过(内存去重集合)
// 3. 以上任一不通过 → 丢弃并返回 identity:replay_detected 错误
```
---
## 8. 版本规划
| 版本 | 身份相关功能 | 签名方案 | 发现机制 | 组件实现 |
|------|------------|---------|---------|---------|
| **v1.0** | AgentID 生成、签名验证、生命周期定义 | Ed25519(默认)+ ECDSA(兼容) | 广播 + 区块链注册表(协议层定义) | 仅协议层定义 |
| **v1.1** | 分层 DHT、缓存策略、链上合约实现 | 同上 + HMAC 内网优化 | 分层 DHT + 完整合约实现 | 七大组件落地 |
| **v1.2** | 密钥轮换、隐私保护、跨链互操作 | 同上 + 零知识证明(可选) | 完整 Kademlia | DID 方法注册 |
---
## 9. 与现有协议的关系
### 9.1 与 Raw 协议的关系
本草案扩展 [Raw 协议](../v1/01_raw-protocol.md) 的签名机制和 AgentEndpoint 定义:
| Raw 协议字段 | 变更 |
|-------------|------|
| `signature` | 从 HMAC 变更为 Ed25519 签名 |
| `signature_algorithm` | 默认值从 `HMAC-SHA256` 变更为 `Ed25519` |
| `sender` | 新增 `public_key` 字段(可选携带) |
### 9.2 与灵脉(Meridian)的关系
| 模式 | 行为 |
|------|------|
| **中心化可用**(v1.0) | 灵脉作为可选中心目录,本草案的身份验证机制仍然生效 |
| **去中心化**(v1.1) | 灵脉作为 DHT 引导节点(Bootstrap Node),不存储全量路由 |
| **纯 Web3**(v1.2) | 完全去中心化,灵脉退化为本地路由缓存 |
### 9.3 与灵玺(Sigil)的关系
| 组件 | 职责边界 |
|------|---------|
| **本草案(协议层)** | 定义签名算法、验证流程、ID 生成规则 |
| **灵玺 Sigil(v1.1 实现层)** | 密钥管理、签名/验证的 API 封装、密钥轮换逻辑 |
---
## 10. 待解决问题(Open Issues)
| 问题 | 说明 | 优先级 | 目标版本 |
|------|------|--------|:--------:|
| 密钥轮换 | 更换私钥后 AgentID 会改变,如何保持身份连续性 | 高 | v1.2 |
| 隐私保护 | 公钥哈希是否能追踪 Agent 行为 | 高 | v1.2 |
| 名称冲突 | 人类可读别名可能重复 | 中 | v1.1 |
| 链上 Gas 成本 | 频繁心跳会导致高额交易费用 | 中 | v1.1 |
| DID 方法注册 | W3C 标准 DID 方法注册流程 | 低 | v1.2 |
| 跨链互操作 | 不同链上的 Agent 如何互相发现 | 低 | v1.2 |
---
## 11. 参考资料
- [RFC 8032: Ed25519 Edwards-Curve Digital Signature Algorithm](https://datatracker.ietf.org/doc/html/rfc8032)
- [Decentralized Identifiers (DIDs) v1.0](https://www.w3.org/TR/did-core/)
- [Kademlia: A Peer-to-peer Information System Based on the XOR Metric](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf)
---
## 附录:本次版本变更记录
| 章节 | 变更内容 | 变更理由 |
|------|---------|---------|
| 整体 | 剥离 Solidity 合约实现、DHT 实现细节 | 遵循"协议层不包含实现细节"原则 |
| 第3章 | 签名机制重写:Ed25519 默认,HMAC 降级 | [会议决议一](../00-record/2026-06-29-v1-draft-discussion.md#决议一签名机制统一为非对称签名) |
| 第4章 | 区块链从"可选方案"提升为"核心组成部分" | [会议决议二](../00-record/2026-06-29-v1-draft-discussion.md#决议二区块链作为身份协议的核心组成部分) |
| 第4章 | DHT 分阶段定义(v1.0 / v1.1 / v1.2) | [会议决议三](../00-record/2026-06-29-v1-draft-discussion.md#决议三dht-分阶段实现) |
| 第8章 | 新增版本规划表 | [会议决议四](../00-record/2026-06-29-v1-draft-discussion.md#决议四七大组件实现推迟到-v11) |
| 全文 | solidity 合约代码、完整 DHT 实现移至 v1.1 规范 | 协议层/实现层分离 |

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

View File

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 167 KiB

View File

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

View File

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -51,16 +51,16 @@ v1 版本文档分为三层:
每个文档对应一个独立的功能模块:
| 文档 | 对应模块 |
|--------------------------------------------------|-----------------------------|
| [components.md](../implement/components.md) | 七大组件层(灵脉/灵玺/灵鉴/灵泊/灵瞰/灵衡/灵枢) |
| [content-system.md](../implement/content-system.md) | 内容类型系统 |
| [capabilities-system.md](../implement/capabilities-system.md) | 能力声明系统 |
| [grpc-transport.md](../implement/grpc-transport.md) | gRPC 传输协议 |
| [hil-mechanism.md](../implement/hil-mechanism.md) | HiL 三级升级机制 |
| [error-codes.md](../implement/error-codes.md) | 数字分段错误码系统 |
| [message-extensions.md](../implement/message-extensions.md) | 消息扩展字段 |
| [transport-modes.md](../implement/transport-modes.md) | 传输模式定义 |
| 文档 | 对应模块 |
|--------------------------------------------------------------|-----------------------------|
| [components.md](../02-guide/components.md) | 七大组件层(灵脉/灵玺/灵鉴/灵泊/灵瞰/灵衡/灵枢) |
| [content-system.md](../02-guide/content-system.md) | 内容类型系统 |
| [capabilities-system.md](../02-guide/capabilities-system.md) | 能力声明系统 |
| [grpc-transport.md](../02-guide/grpc-transport.md) | gRPC 传输协议 |
| [hil-mechanism.md](../02-guide/hil-mechanism.md) | HiL 三级升级机制 |
| [error-codes.md](../02-guide/error-codes.md) | 数字分段错误码系统 |
| [message-extensions.md](../02-guide/message-extensions.md) | 消息扩展字段 |
| [transport-modes.md](../02-guide/transport-modes.md) | 传输模式定义 |
---

View File

@@ -16,23 +16,23 @@
### 2.1 核心功能
| 功能 | 说明 |
|-----|------|
| 统一消息信封 | 所有协议共用的消息格式 |
| 身份标识 | Agent 端点定义 |
| 时间戳 | 统一时间格式(RFC3339) |
| 消息签名 | HMAC 签名验证机制 |
| 关联机制 | correlation_id / reply_to 消息关联 |
| 协议版本 | 版本标识与兼容性 |
| 功能 | 说明 |
|--------|--------------------------------|
| 统一消息信封 | 所有协议共用的消息格式 |
| 身份标识 | Agent 端点定义 |
| 时间戳 | 统一时间格式(RFC3339) |
| 消息签名 | HMAC 签名验证机制 |
| 关联机制 | correlation_id / reply_to 消息关联 |
| 协议版本 | 版本标识与兼容性 |
### 2.2 扩展功能
| 功能 | 说明 |
|-----|------|
| 会话关联 | conversation_id 多轮对话关联 |
| 消息存活 | TTL 消息过期机制 |
| 广播标识 | broadcast 广播消息标记 |
| 加密标识 | encrypt 消息加密标记 |
| 功能 | 说明 |
|------|----------------------------|
| 会话关联 | conversation_id 多轮对话关联 |
| 消息存活 | TTL 消息过期机制 |
| 广播标识 | broadcast 广播消息标记 |
| 加密标识 | encrypt 消息加密标记 |
| 签名算法 | signature_algorithm 签名算法声明 |
---
@@ -43,51 +43,51 @@
所有协议消息必须使用统一信封格式:
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `id` | string | ✓ | 消息唯一标识(UUID) |
| `version` | string | ✓ | 协议版本(如 "1.0.0") |
| `type` | string | ✓ | 消息类型(格式:`协议:类型`,如 `p2p:task_request`) |
| `sender` | AgentEndpoint | ✓ | 发送方端点 |
| `receiver` | AgentEndpoint | - | 接收方端点(广播时可为空) |
| `payload` | object | ✓ | 消息载荷(具体结构由消息类型定义) |
| `timestamp` | string | ✓ | 时间戳(RFC3339 格式) |
| 字段 | 类型 | 必填 | 说明 |
|-------------|---------------|:--:|---------------------------------------|
| `id` | string | ✓ | 消息唯一标识(UUID) |
| `version` | string | ✓ | 协议版本(如 "1.0.0") |
| `type` | string | ✓ | 消息类型(格式:`协议:类型`,如 `p2p:task_request`) |
| `sender` | AgentEndpoint | ✓ | 发送方端点 |
| `receiver` | AgentEndpoint | - | 接收方端点(广播时可为空) |
| `payload` | object | ✓ | 消息载荷(具体结构由消息类型定义) |
| `timestamp` | string | ✓ | 时间戳(RFC3339 格式) |
### 3.2 关联字段
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `correlation_id` | string | - | 关联 ID(用于请求-响应关联) |
| `reply_to` | string | - | 回复的消息 ID |
| `group_id` | string | - | 群组 ID(群组消息必填) |
| 字段 | 类型 | 必填 | 说明 |
|------------------|--------|:--:|------------------|
| `correlation_id` | string | - | 关联 ID(用于请求-响应关联) |
| `reply_to` | string | - | 回复的消息 ID |
| `group_id` | string | - | 群组 ID(群组消息必填) |
### 3.3 安全字段
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `signature` | string | - | HMAC 签名(签名算法由 signature_algorithm 指定) |
| `signature_algorithm` | string | - | 签名算法(默认 "HMAC-SHA256") |
| 字段 | 类型 | 必填 | 说明 |
|-----------------------|--------|:--:|---------------------------------------|
| `signature` | string | - | HMAC 签名(签名算法由 signature_algorithm 指定) |
| `signature_algorithm` | string | - | 签名算法(默认 "HMAC-SHA256") |
### 3.4 扩展字段
| 字段 | 类型 | 说明 |
|------|------|------|
| `conversation_id` | string | 会话 ID(多轮对话关联) |
| `ttl` | integer | 消息存活时间(秒) |
| `broadcast` | boolean | 是否广播消息 |
| `encrypt` | boolean | payload 是否加密 |
| 字段 | 类型 | 说明 |
|-------------------|---------|---------------|
| `conversation_id` | string | 会话 ID(多轮对话关联) |
| `ttl` | integer | 消息存活时间(秒) |
| `broadcast` | boolean | 是否广播消息 |
| `encrypt` | boolean | payload 是否加密 |
### 3.5 Agent 端点
Agent 身份标识结构:
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `agent_id` | string | ✓ | Agent 唯一标识 |
| `agent_name` | string | - | Agent 名称 |
| `system_id` | string | ✓ | 所属系统标识 |
| `endpoint` | string | ✓ | 回调端点 URL |
| `version` | string | - | Agent 版本 |
| 字段 | 类型 | 必填 | 说明 |
|--------------|--------|:--:|------------|
| `agent_id` | string | ✓ | Agent 唯一标识 |
| `agent_name` | string | - | Agent 名称 |
| `system_id` | string | ✓ | 所属系统标识 |
| `endpoint` | string | ✓ | 回调端点 URL |
| `version` | string | - | Agent 版本 |
---
@@ -96,6 +96,7 @@ Agent 身份标识结构:
### 4.1 签名算法
支持算法:
- `HMAC-SHA256`(默认)
- `HMAC-SHA512`
@@ -112,6 +113,7 @@ signature_content = sender_id | receiver_id | timestamp | payload_json
### 4.3 签名验证
接收方必须:
1. 提取 sender 的认证密钥
2. 使用相同算法重新计算签名
3. 比对签名是否一致
@@ -120,12 +122,12 @@ signature_content = sender_id | receiver_id | timestamp | payload_json
## 5. 协议类型前缀
| 前缀 | 协议 | 说明 |
|------|------|------|
| `p2p:` | A2A 协议 | 点对点消息 |
| `group:` | A2N 协议 | 群组内消息 |
| `inter_group:` | A2N 协议 | 跨群组消息 |
| `caller:` | P2A 协议 | 外部调用消息 |
| 前缀 | 协议 | 说明 |
|----------------|--------|--------|
| `p2p:` | A2A 协议 | 点对点消息 |
| `group:` | A2N 协议 | 群组内消息 |
| `inter_group:` | A2N 协议 | 跨群组消息 |
| `caller:` | P2A 协议 | 外部调用消息 |
---
@@ -134,6 +136,7 @@ signature_content = sender_id | receiver_id | timestamp | payload_json
格式:`协议前缀:消息类型`
示例:
- `p2p:task_request` - A2A 协议的任务请求
- `group:vote` - A2N 协议的投票消息
- `inter_group:escalate` - A2N 协议的跨群组升级

View File

@@ -13,6 +13,7 @@
A2A 协议定义两个 Agent 之间进行点对点任务协作的规范,包括任务提交、进度同步、信息补全、人类介入、能力发现等核心交互。
**适用场景**:
- 单个任务请求与响应
- 任务状态实时同步
- 任务取消
@@ -20,6 +21,7 @@ A2A 协议定义两个 Agent 之间进行点对点任务协作的规范,包括
- 人类介入决策
**非适用场景**:
- 多 Agent 群组协作(参见 A2N 协议)
- 非 Agent 调用方接入(参见 P2A 协议)
@@ -29,44 +31,44 @@ A2A 协议定义两个 Agent 之间进行点对点任务协作的规范,包括
### 2.1 任务管理
| 功能 | 说明 |
|-----|------|
| 任务提交 | 请求方向执行方提交任务 |
| 任务确认 | 执行方接受任务 |
| 功能 | 说明 |
|------|---------------|
| 任务提交 | 请求方向执行方提交任务 |
| 任务确认 | 执行方接受任务 |
| 任务拒绝 | 执行方拒绝任务(附带原因) |
| 任务取消 | 请求方中途取消任务 |
| 任务进度 | 执行方实时上报进度 |
| 任务完成 | 执行方上报成功结果 |
| 任务失败 | 执行方上报失败原因 |
| 任务取消 | 请求方中途取消任务 |
| 任务进度 | 执行方实时上报进度 |
| 任务完成 | 执行方上报成功结果 |
| 任务失败 | 执行方上报失败原因 |
### 2.2 信息补全
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|------------------|
| 信息请求 | 执行方发现缺少必要信息时请求补充 |
| 信息提供 | 请求方提供补充信息 |
| 信息提供 | 请求方提供补充信息 |
### 2.3 人类介入(HiL)
| 功能 | 说明 |
|-----|------|
| HiL 请求 | 执行方请求人类决策 |
| 功能 | 说明 |
|--------|-------------|
| HiL 请求 | 执行方请求人类决策 |
| HiL 响应 | 请求方返回人类决策结果 |
### 2.4 能力发现
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|----------------|
| 能力查询 | 查询对方支持的任务类型和能力 |
| 能力响应 | 返回能力清单 |
| 能力响应 | 返回能力清单 |
### 2.5 保活与确认
| 功能 | 说明 |
|-----|------|
| 心跳 | 双向心跳保活 |
| ACK | 任务级确认 |
| 消息 ACK | 消息级确认 |
| 功能 | 说明 |
|---------|---------------|
| 心跳 | 双向心跳保活 |
| ACK | 任务级确认 |
| 消息 ACK | 消息级确认 |
| 消息 NACK | 消息级否定确认(附带错误) |
---
@@ -77,45 +79,45 @@ A2A 协议定义两个 Agent 之间进行点对点任务协作的规范,包括
### 3.1 任务类消息
| 消息类型 | 方向 | 说明 |
|---------|------|------|
| `p2p:task_request` | 请求方 → 执行方 | 提交任务请求 |
| `p2p:task_confirm` | 执行方 → 请求方 | 确认接受任务 |
| `p2p:task_reject` | 执行方 → 请求方 | 拒绝任务 |
| 消息类型 | 方向 | 说明 |
|--------------------------|-----------|--------|
| `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` | 双向 | 任务级确认 |
| `p2p:task_complete` | 执行方 → 请求方 | 任务完成 |
| `p2p:task_failed` | 执行方 → 请求方 | 任务失败 |
| `p2p:task_cancel` | 请求方 → 执行方 | 取消任务 |
| `p2p:task_ack` | 双向 | 任务级确认 |
### 3.2 信息类消息
| 消息类型 | 方向 | 说明 |
|---------|------|------|
| `p2p:task_need_info` | 执行方 → 请求方 | 请求补充信息 |
| 消息类型 | 方向 | 说明 |
|--------------------------|-----------|--------|
| `p2p:task_need_info` | 执行方 → 请求方 | 请求补充信息 |
| `p2p:task_info_provided` | 请求方 → 执行方 | 提供补充信息 |
### 3.3 HiL 类消息
| 消息类型 | 方向 | 说明 |
|---------|------|------|
| 消息类型 | 方向 | 说明 |
|-----------------------|-----------|--------|
| `p2p:task_need_human` | 执行方 → 请求方 | 请求人类介入 |
| `p2p:human_decision` | 请求方 → 执行方 | 人类决策结果 |
| `p2p:human_decision` | 请求方 → 执行方 | 人类决策结果 |
### 3.4 能力类消息
| 消息类型 | 方向 | 说明 |
|---------|------|------|
| `p2p:capability_query` | 双向 | 查询对方能力 |
| 消息类型 | 方向 | 说明 |
|---------------------------|----|--------|
| `p2p:capability_query` | 双向 | 查询对方能力 |
| `p2p:capability_response` | 双向 | 返回能力清单 |
### 3.5 保活与确认类消息
| 消息类型 | 方向 | 说明 |
|---------|------|------|
| `p2p:heartbeat` | 双向 | 心跳保活 |
| `p2p:ack` | 双向 | 通用确认 |
| `p2p:nack` | 双向 | 通用否定确认 |
| 消息类型 | 方向 | 说明 |
|-----------------|----|--------|
| `p2p:heartbeat` | 双向 | 心跳保活 |
| `p2p:ack` | 双向 | 通用确认 |
| `p2p:nack` | 双向 | 通用否定确认 |
---
@@ -123,22 +125,22 @@ A2A 协议定义两个 Agent 之间进行点对点任务协作的规范,包括
### 4.1 状态定义
| 状态 | 说明 |
|------|------|
| `idle` | 空闲(初始状态) |
| `pending` | 待确认(已发送请求) |
| `confirmed` | 已确认(执行方接受) |
| `executing` | 执行中 |
| `info_needed` | 需要信息 |
| `info_provided` | 信息已提供 |
| `need_human` | 需要人类介入 |
| `human_deciding` | 人类决策中 |
| `human_approved` | 人类已批准 |
| `human_rejected` | 人类已拒绝 |
| `completed` | 已完成(终态) |
| `failed` | 已失败(终态) |
| `cancelled` | 已取消(终态) |
| `rejected` | 已拒绝(终态) |
| 状态 | 说明 |
|------------------|------------|
| `idle` | 空闲(初始状态) |
| `pending` | 待确认(已发送请求) |
| `confirmed` | 已确认(执行方接受) |
| `executing` | 执行中 |
| `info_needed` | 需要信息 |
| `info_provided` | 信息已提供 |
| `need_human` | 需要人类介入 |
| `human_deciding` | 人类决策中 |
| `human_approved` | 人类已批准 |
| `human_rejected` | 人类已拒绝 |
| `completed` | 已完成(终态) |
| `failed` | 已失败(终态) |
| `cancelled` | 已取消(终态) |
| `rejected` | 已拒绝(终态) |
### 4.2 状态流转
@@ -236,86 +238,86 @@ idle → pending → confirmed → executing → completed
### 6.1 task_request 载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_id` | string | ✓ | 任务唯一标识(请求方生成) |
| `task_type` | string | ✓ | 任务类型 |
| `payload` | object | ✓ | 任务参数(结构由 task_type 决定) |
| `priority` | string | - | 优先级:`low`/`normal`/`high`/`urgent` |
| `transport_preferences` | object | - | 传输偏好(回调/轮询等) |
| 字段 | 类型 | 必填 | 说明 |
|-------------------------|--------|:--:|------------------------------------|
| `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") |
| 字段 | 类型 | 必填 | 说明 |
|------------------|--------|:--:|--------------------|
| `task_id` | string | ✓ | 任务标识 |
| `estimated_time` | string | - | 预估耗时(如 "30s-2min") |
### 6.3 task_reject 载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_id` | string | ✓ | 任务标识 |
| `reason` | object | ✓ | 拒绝原因(含错误码和描述) |
| 字段 | 类型 | 必填 | 说明 |
|-----------|--------|:--:|---------------|
| `task_id` | string | ✓ | 任务标识 |
| `reason` | object | ✓ | 拒绝原因(含错误码和描述) |
### 6.4 task_status_update 载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_id` | string | ✓ | 任务标识 |
| `status` | string | ✓ | 当前状态 |
| `progress` | integer | - | 进度百分比(0-100) |
| `message` | string | - | 状态说明 |
| `eta` | string | - | 预估完成时间 |
| 字段 | 类型 | 必填 | 说明 |
|------------|---------|:--:|--------------|
| `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 | - | 结果元数据 |
| 字段 | 类型 | 必填 | 说明 |
|------------|--------|:--:|------------------------|
| `task_id` | string | ✓ | 任务标识 |
| `result` | object | ✓ | 任务结果(结构由 task_type 决定) |
| `summary` | string | - | 结果摘要 |
| `metadata` | object | - | 结果元数据 |
### 6.6 task_failed 载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_id` | string | ✓ | 任务标识 |
| `error` | object | ✓ | 错误信息(错误码 + 描述 + 详情) |
| 字段 | 类型 | 必填 | 说明 |
|-----------|--------|:--:|---------------------|
| `task_id` | string | ✓ | 任务标识 |
| `error` | object | ✓ | 错误信息(错误码 + 描述 + 详情) |
### 6.7 task_need_info 载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_id` | string | ✓ | 任务标识 |
| `missing_fields` | array | ✓ | 缺失的字段列表 |
| `reason` | string | ✓ | 缺失原因 |
| 字段 | 类型 | 必填 | 说明 |
|------------------|--------|:--:|---------|
| `task_id` | string | ✓ | 任务标识 |
| `missing_fields` | array | ✓ | 缺失的字段列表 |
| `reason` | string | ✓ | 缺失原因 |
### 6.8 task_info_provided 载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_id` | string | ✓ | 任务标识 |
| `provided_info` | object | ✓ | 补充的信息 |
| 字段 | 类型 | 必填 | 说明 |
|-----------------|--------|:--:|-------|
| `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 建议值 |
| 字段 | 类型 | 必填 | 说明 |
|--------------------|---------|:--:|-------------|
| `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 + 角色) |
| 字段 | 类型 | 必填 | 说明 |
|--------------|--------|:--:|-------------------|
| `task_id` | string | ✓ | 任务标识 |
| `decision` | object | ✓ | 决策内容 |
| `decided_by` | object | ✓ | 决策者信息(用户 ID + 角色) |
---
@@ -323,8 +325,8 @@ idle → pending → confirmed → executing → completed
参见数字分段错误码系统(1000-9999):
| 分段 | 类别 |
|------|------|
| 分段 | 类别 |
|-----------|------|
| 1000-1999 | 系统错误 |
| 2000-2999 | 任务错误 |
| 3000-3999 | 信息错误 |
@@ -338,12 +340,12 @@ idle → pending → confirmed → executing → completed
Agent 实现 A2A 协议时必须提供:
| 接口 | 说明 |
|------|------|
| 接口 | 说明 |
|-------|------------------|
| 消息处理器 | 接收并处理 p2p:* 类型消息 |
| 任务处理器 | 执行具体任务逻辑 |
| 回调发送器 | 发送进度、完成、失败等回调 |
| 状态查询 | 支持任务状态查询 |
| 任务处理器 | 执行具体任务逻辑 |
| 回调发送器 | 发送进度、完成、失败等回调 |
| 状态查询 | 支持任务状态查询 |
---

View File

@@ -13,6 +13,7 @@
A2N 协议定义多个 Agent 组成群组进行协同工作的规范,包括群组管理、任务拆分与合并、群体决策、角色与权限、升级机制等。
**适用场景**:
- 复杂任务的拆分与并行执行(MapReduce 模式)
- 多 Agent 协同完成单一目标
- 群体投票与共识决策
@@ -20,6 +21,7 @@ A2N 协议定义多个 Agent 组成群组进行协同工作的规范,包括群
- 分级升级机制
**依赖关系**:
- 群组内成员间的单播通信复用 A2A 协议
---
@@ -28,53 +30,53 @@ A2N 协议定义多个 Agent 组成群组进行协同工作的规范,包括群
### 2.1 群组管理
| 功能 | 说明 |
|-----|------|
| 群组创建 | Coordinator 创建群组,定义拓扑结构 |
| 群组解散 | Coordinator 解散群组 |
| 加入群组 | Agent 主动申请加入 |
| 离开群组 | 成员主动离开 |
| 邀请加入 | Coordinator 或成员邀请其他 Agent |
| 接受邀请 | 被邀请者接受邀请 |
| 拒绝邀请 | 被邀请者拒绝邀请 |
| 成员更新通知 | 成员变动时广播通知 |
| 角色变更 | Coordinator 调整成员角色 |
| 群组冻结 | 暂停群组活动 |
| 群组解冻 | 恢复群组活动 |
| 功能 | 说明 |
|--------|---------------------------|
| 群组创建 | Coordinator 创建群组,定义拓扑结构 |
| 群组解散 | Coordinator 解散群组 |
| 加入群组 | Agent 主动申请加入 |
| 离开群组 | 成员主动离开 |
| 邀请加入 | Coordinator 或成员邀请其他 Agent |
| 接受邀请 | 被邀请者接受邀请 |
| 拒绝邀请 | 被邀请者拒绝邀请 |
| 成员更新通知 | 成员变动时广播通知 |
| 角色变更 | Coordinator 调整成员角色 |
| 群组冻结 | 暂停群组活动 |
| 群组解冻 | 恢复群组活动 |
### 2.2 群组通信
| 功能 | 说明 |
|-----|------|
| 广播 | 发送给所有成员 |
| 组播 | 发送给指定成员列表 |
| 单播 | 群内点对点(复用 A2A) |
| 消息中继 | 通过其他成员转发消息 |
| 功能 | 说明 |
|------|---------------|
| 广播 | 发送给所有成员 |
| 组播 | 发送给指定成员列表 |
| 单播 | 群内点对点(复用 A2A) |
| 消息中继 | 通过其他成员转发消息 |
### 2.3 任务协作
| 功能 | 说明 |
|-----|------|
| 任务拆分 | Coordinator 将大任务拆分为子任务 |
| 任务分配 | 子任务分配给指定 Worker |
| 子任务进度 | Worker 上报子任务进度 |
| 结果合并 | Coordinator 合并子任务结果 |
| 功能 | 说明 |
|-------|------------------------|
| 任务拆分 | Coordinator 将大任务拆分为子任务 |
| 任务分配 | 子任务分配给指定 Worker |
| 子任务进度 | Worker 上报子任务进度 |
| 结果合并 | Coordinator 合并子任务结果 |
### 2.4 共识投票
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|-----------------------------|
| 发起投票 | Coordinator 或 Reviewer 发起投票 |
| 提交投票 | 成员提交选项及理由 |
| 达成共识 | 公布投票结果 |
| 提交投票 | 成员提交选项及理由 |
| 达成共识 | 公布投票结果 |
### 2.5 升级机制
| 功能 | 说明 |
|-----|------|
| 共识僵局升级 | 投票无法达成共识时升级给人类 |
| 子任务阻塞升级 | 子任务阻塞时升级给人类 |
| 跨群组升级 | 升级到更高层级群组 |
| 功能 | 说明 |
|---------|----------------|
| 共识僵局升级 | 投票无法达成共识时升级给人类 |
| 子任务阻塞升级 | 子任务阻塞时升级给人类 |
| 跨群组升级 | 升级到更高层级群组 |
---
@@ -82,52 +84,52 @@ A2N 协议定义多个 Agent 组成群组进行协同工作的规范,包括群
### 3.1 群组管理消息(前缀 `group:`)
| 消息类型 | 说明 |
|---------|------|
| `group:create` | 创建群组 |
| `group:disband` | 解散群组 |
| `group:join` | 加入群组 |
| `group:leave` | 离开群组 |
| `group:invite` | 邀请加入 |
| `group:accept_invite` | 接受邀请 |
| `group:reject_invite` | 拒绝邀请 |
| 消息类型 | 说明 |
|-----------------------|--------|
| `group:create` | 创建群组 |
| `group:disband` | 解散群组 |
| `group:join` | 加入群组 |
| `group:leave` | 离开群组 |
| `group:invite` | 邀请加入 |
| `group:accept_invite` | 接受邀请 |
| `group:reject_invite` | 拒绝邀请 |
| `group:member_update` | 成员更新通知 |
| `group:role_change` | 角色变更 |
| `group:role_change` | 角色变更 |
### 3.2 群组通信消息(前缀 `group:`)
| 消息类型 | 说明 |
|---------|------|
| 消息类型 | 说明 |
|-------------------|----------|
| `group:broadcast` | 广播(所有成员) |
| `group:multicast` | 组播(指定成员) |
| `group:direct` | 群内单播 |
| `group:relay` | 消息中继 |
| `group:direct` | 群内单播 |
| `group:relay` | 消息中继 |
### 3.3 任务协作消息(前缀 `group:`)
| 消息类型 | 说明 |
|---------|------|
| `group:task_split` | 任务拆分 |
| `group:task_assign` | 任务分配 |
| `group:task_merge` | 结果合并 |
| 消息类型 | 说明 |
|-----------------------|-------|
| `group:task_split` | 任务拆分 |
| `group:task_assign` | 任务分配 |
| `group:task_merge` | 结果合并 |
| `group:task_progress` | 子任务进度 |
### 3.4 共识投票消息(前缀 `group:`)
| 消息类型 | 说明 |
|---------|------|
| `group:vote` | 发起投票 |
| 消息类型 | 说明 |
|---------------------|------|
| `group:vote` | 发起投票 |
| `group:vote_submit` | 提交投票 |
| `group:consensus` | 达成共识 |
| `group:consensus` | 达成共识 |
### 3.5 HiL 升级消息(前缀 `group:` / `inter_group:`)
| 消息类型 | 说明 |
|---------|------|
| `group:consensus_escalate` | 共识僵局升级给人类 |
| `group:subtask_escalate` | 子任务阻塞升级给人类 |
| `group:human_decision` | 人类决策结果 |
| `inter_group:escalate` | 跨群组升级 |
| 消息类型 | 说明 |
|----------------------------|------------|
| `group:consensus_escalate` | 共识僵局升级给人类 |
| `group:subtask_escalate` | 子任务阻塞升级给人类 |
| `group:human_decision` | 人类决策结果 |
| `inter_group:escalate` | 跨群组升级 |
---
@@ -135,49 +137,49 @@ A2N 协议定义多个 Agent 组成群组进行协同工作的规范,包括群
### 4.1 群组拓扑结构
| 拓扑类型 | 说明 | 适用场景 |
|---------|------|---------|
| `star` | 星型,中心 coordinator 协调 | 简单任务分发 |
| `mesh` | 网状,成员间可直接通信 | 对等协作 |
| `chain` | 链式,流水线模式 | 顺序处理 |
| `hierarchical` | 层级型,多层管理 | 大型复杂任务 |
| `fullmesh` | 全连接网状 | 高可靠协作 |
| 拓扑类型 | 说明 | 适用场景 |
|----------------|----------------------|--------|
| `star` | 星型,中心 coordinator 协调 | 简单任务分发 |
| `mesh` | 网状,成员间可直接通信 | 对等协作 |
| `chain` | 链式,流水线模式 | 顺序处理 |
| `hierarchical` | 层级型,多层管理 | 大型复杂任务 |
| `fullmesh` | 全连接网状 | 高可靠协作 |
### 4.2 成员角色
| 角色 | 说明 | 权限 |
|------|------|------|
| 角色 | 说明 | 权限 |
|---------------|-----|------------------------|
| `coordinator` | 协调者 | 创建/解散群组、任务拆分、发起投票、角色变更 |
| `worker` | 工作者 | 执行子任务、提交结果、投票 |
| `reviewer` | 审核者 | 审核结果、发起投票、升级请求 |
| `observer` | 观察者 | 只读,查看进度 |
| `worker` | 工作者 | 执行子任务、提交结果、投票 |
| `reviewer` | 审核者 | 审核结果、发起投票、升级请求 |
| `observer` | 观察者 | 只读,查看进度 |
### 4.3 群组状态
| 状态 | 说明 |
|------|------|
| `creating` | 创建中 |
| `active` | 活跃 |
| `frozen` | 冻结(不可执行新任务) |
| `disbanded` | 已解散(终态) |
| 状态 | 说明 |
|-------------|-------------|
| `creating` | 创建中 |
| `active` | 活跃 |
| `frozen` | 冻结(不可执行新任务) |
| `disbanded` | 已解散(终态) |
### 4.4 合并策略
| 策略 | 说明 |
|------|------|
| 策略 | 说明 |
|-----------------|-----------|
| `first_success` | 首个成功结果即返回 |
| `majority` | 多数结果合并 |
| `weighted` | 按权重加权合并 |
| `custom` | 自定义合并逻辑 |
| `majority` | 多数结果合并 |
| `weighted` | 按权重加权合并 |
| `custom` | 自定义合并逻辑 |
### 4.5 共识类型
| 类型 | 说明 |
|------|------|
| `majority` | 多数投票(>50%) |
| 类型 | 说明 |
|-----------------|------------|
| `majority` | 多数投票(>50%) |
| `supermajority` | 绝对多数(>67%) |
| `unanimity` | 一致同意(100%) |
| `weighted` | 加权投票 |
| `unanimity` | 一致同意(100%) |
| `weighted` | 加权投票 |
---
@@ -245,20 +247,20 @@ Coordinator 所有成员
### 6.2 流程步骤
1. **任务拆分阶段**
- Coordinator 接收原始任务
- 将任务拆分为多个子任务
- 为每个子任务指定执行的 Worker
- 定义合并策略
- Coordinator 接收原始任务
- 将任务拆分为多个子任务
- 为每个子任务指定执行的 Worker
- 定义合并策略
2. **并行执行阶段**
- 各 Worker 并行执行子任务
- 定期上报进度
- 子任务完成后上报结果
- 各 Worker 并行执行子任务
- 定期上报进度
- 子任务完成后上报结果
3. **结果合并阶段**
- Coordinator 收集所有子任务结果
- 按合并策略合并结果
- 返回最终结果
- Coordinator 收集所有子任务结果
- 按合并策略合并结果
- 返回最终结果
---
@@ -280,59 +282,59 @@ Coordinator 所有成员
### 8.1 群组创建载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `group_id` | string | ✓ | 群组唯一标识 |
| `group_name` | string | - | 群组名称 |
| `topology` | string | ✓ | 拓扑结构 |
| `config` | object | - | 群组配置 |
| 字段 | 类型 | 必填 | 说明 |
|--------------|--------|:--:|--------|
| `group_id` | string | ✓ | 群组唯一标识 |
| `group_name` | string | - | 群组名称 |
| `topology` | string | ✓ | 拓扑结构 |
| `config` | object | - | 群组配置 |
### 8.2 群组配置
| 字段 | 类型 | 说明 |
|------|------|------|
| `max_members` | integer | 最大成员数 |
| `vote_threshold` | float | 投票阈值 |
| `default_consensus_type` | string | 默认共识类型 |
| 字段 | 类型 | 说明 |
|--------------------------|---------|--------|
| `max_members` | integer | 最大成员数 |
| `vote_threshold` | float | 投票阈值 |
| `default_consensus_type` | string | 默认共识类型 |
### 8.3 子任务结构
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `subtask_id` | string | ✓ | 子任务标识 |
| `description` | string | ✓ | 子任务描述 |
| `assigned_to` | string | ✓ | 执行者 Agent ID |
| `dependencies` | array | - | 依赖的子任务 ID 列表 |
| `status` | string | ✓ | 子任务状态 |
| `payload` | object | ✓ | 子任务参数 |
| 字段 | 类型 | 必填 | 说明 |
|----------------|--------|:--:|--------------|
| `subtask_id` | string | ✓ | 子任务标识 |
| `description` | string | ✓ | 子任务描述 |
| `assigned_to` | string | ✓ | 执行者 Agent ID |
| `dependencies` | array | - | 依赖的子任务 ID 列表 |
| `status` | string | ✓ | 子任务状态 |
| `payload` | object | ✓ | 子任务参数 |
### 8.4 投票载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `vote_id` | string | ✓ | 投票标识 |
| `question` | string | ✓ | 投票问题 |
| `options` | array | ✓ | 选项列表 |
| `consensus_type` | string | ✓ | 共识类型 |
| `deadline` | string | - | 截止时间 |
| 字段 | 类型 | 必填 | 说明 |
|------------------|--------|:--:|------|
| `vote_id` | string | ✓ | 投票标识 |
| `question` | string | ✓ | 投票问题 |
| `options` | array | ✓ | 选项列表 |
| `consensus_type` | string | ✓ | 共识类型 |
| `deadline` | string | - | 截止时间 |
### 8.5 投票提交载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `vote_id` | string | ✓ | 投票标识 |
| `voter_id` | string | ✓ | 投票者 ID |
| `option_id` | string | ✓ | 选择的选项 |
| `reasoning` | string | - | 投票理由 |
| 字段 | 类型 | 必填 | 说明 |
|-------------|--------|:--:|--------|
| `vote_id` | string | ✓ | 投票标识 |
| `voter_id` | string | ✓ | 投票者 ID |
| `option_id` | string | ✓ | 选择的选项 |
| `reasoning` | string | - | 投票理由 |
### 8.6 共识结果载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `vote_id` | string | ✓ | 投票标识 |
| `winner` | string | ✓ | 获胜选项 |
| `vote_counts` | object | ✓ | 各选项票数 |
| `passed` | boolean | ✓ | 是否通过阈值 |
| 字段 | 类型 | 必填 | 说明 |
|---------------|---------|:--:|--------|
| `vote_id` | string | ✓ | 投票标识 |
| `winner` | string | ✓ | 获胜选项 |
| `vote_counts` | object | ✓ | 各选项票数 |
| `passed` | boolean | ✓ | 是否通过阈值 |
---
@@ -340,21 +342,21 @@ Coordinator 所有成员
### 9.1 升级场景
| 场景 | 消息类型 | 说明 |
|------|---------|------|
| 共识僵局 | `group:consensus_escalate` | 投票超时未达成共识 |
| 子任务阻塞 | `group:subtask_escalate` | 子任务执行受阻 |
| 跨群组 | `inter_group:escalate` | 升级到上级群组 |
| 场景 | 消息类型 | 说明 |
|-------|----------------------------|-----------|
| 共识僵局 | `group:consensus_escalate` | 投票超时未达成共识 |
| 子任务阻塞 | `group:subtask_escalate` | 子任务执行受阻 |
| 跨群组 | `inter_group:escalate` | 升级到上级群组 |
### 9.2 升级载荷
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `escalation_id` | string | ✓ | 升级标识 |
| `escalation_type` | string | ✓ | 升级类型 |
| `escalation_level` | integer | ✓ | 升级级别(1/2/3) |
| `context` | object | ✓ | 升级上下文 |
| `options` | array | - | 可选方案 |
| 字段 | 类型 | 必填 | 说明 |
|--------------------|---------|:--:|-------------|
| `escalation_id` | string | ✓ | 升级标识 |
| `escalation_type` | string | ✓ | 升级类型 |
| `escalation_level` | integer | ✓ | 升级级别(1/2/3) |
| `context` | object | ✓ | 升级上下文 |
| `options` | array | - | 可选方案 |
---
@@ -362,16 +364,16 @@ Coordinator 所有成员
群组错误码分段:7000-7999
| 错误码 | 名称 | 说明 |
|------|------|------|
| 7001 | 群组不存在 | |
| 7002 | 群组未激活 | |
| 7003 | 成员不存在 | |
| 7004 | 不是群组成员 | |
| 7005 | 未达成共识 | |
| 7006 | 角色不存在 | |
| 7007 | 已是成员 | |
| 7008 | 群组已满 | |
| 错误码 | 名称 | 说明 |
|------|--------|----|
| 7001 | 群组不存在 | |
| 7002 | 群组未激活 | |
| 7003 | 成员不存在 | |
| 7004 | 不是群组成员 | |
| 7005 | 未达成共识 | |
| 7006 | 角色不存在 | |
| 7007 | 已是成员 | |
| 7008 | 群组已满 | |
---
@@ -379,12 +381,12 @@ Coordinator 所有成员
Agent 实现 A2N 协议时必须提供:
| 接口 | 说明 |
|------|------|
| 接口 | 说明 |
|---------|---------------|
| 群组管理处理器 | 处理群组创建、加入、离开等 |
| 子任务处理器 | 执行分配的子任务 |
| 投票处理器 | 处理投票相关消息 |
| 升级处理器 | 处理升级请求 |
| 子任务处理器 | 执行分配的子任务 |
| 投票处理器 | 处理投票相关消息 |
| 升级处理器 | 处理升级请求 |
---

View File

@@ -15,12 +15,14 @@ P2A 协议定义**非 Agent 调用方**(如普通后端服务、前端应用
本协议将 A2A 协议的复杂性封装起来,提供简洁的 RESTful API,使调用方无需了解 A2A 协议细节即可使用 Agent 能力。
**适用场景**:
- 前端应用直接调用 Agent 能力
- 后端业务系统集成 Agent 服务
- 第三方开发者通过 API 接入
- 无需实现完整 A2A 协议的调用方
**设计原则**:
- **简单易用**:标准 RESTful API,JSON 格式
- **两种模式**:回调模式 + 轮询模式,调用方按需选择
- **认证简单**:API Key 认证,无需 HMAC 签名
@@ -33,44 +35,44 @@ P2A 协议定义**非 Agent 调用方**(如普通后端服务、前端应用
### 2.1 任务提交
| 功能 | 说明 |
|-----|------|
| JSON 提交 | application/json 格式提交任务 |
| Multipart 提交 | 带文件上传的任务提交 |
| 功能 | 说明 |
|--------------|-------------------------|
| JSON 提交 | application/json 格式提交任务 |
| Multipart 提交 | 带文件上传的任务提交 |
### 2.2 任务查询
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|---------------|
| 任务详情 | 获取完整任务信息(含结果) |
| 任务状态 | 简化版状态查询 |
| 任务列表 | 分页查询任务列表 |
| 任务状态 | 简化版状态查询 |
| 任务列表 | 分页查询任务列表 |
### 2.3 任务控制
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|-----------|
| 任务取消 | 取消正在执行的任务 |
### 2.4 能力查询
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|------------------|
| 能力清单 | 获取 Agent 支持的任务类型 |
### 2.5 通知机制
| 功能 | 说明 |
|-----|------|
| 功能 | 说明 |
|------|--------------|
| 回调通知 | 任务完成后主动回调调用方 |
| 轮询查询 | 调用方主动查询状态 |
| 轮询查询 | 调用方主动查询状态 |
### 2.6 认证
| 功能 | 说明 |
|-----|------|
| API Key 认证 | X-API-Key 头部认证 |
| 回调验证 | X-Callback-Token 验证回调来源 |
| 功能 | 说明 |
|------------|-------------------------|
| API Key 认证 | X-API-Key 头部认证 |
| 回调验证 | X-Callback-Token 验证回调来源 |
---
@@ -80,15 +82,15 @@ P2A 协议定义**非 Agent 调用方**(如普通后端服务、前端应用
### 3.1 端点清单
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/task` | 提交任务(JSON) |
| POST | `/task/multipart` | 提交任务(带文件上传) |
| GET | `/task/{task_id}` | 获取任务详情 |
| GET | `/task/{task_id}/status` | 获取任务状态(简化版) |
| GET | `/tasks` | 获取任务列表 |
| POST | `/task/{task_id}/cancel` | 取消任务 |
| GET | `/capabilities` | 获取能力清单 |
| 方法 | 路径 | 说明 |
|------|--------------------------|-------------|
| POST | `/task` | 提交任务(JSON) |
| POST | `/task/multipart` | 提交任务(带文件上传) |
| GET | `/task/{task_id}` | 获取任务详情 |
| GET | `/task/{task_id}/status` | 获取任务状态(简化版) |
| GET | `/tasks` | 获取任务列表 |
| POST | `/task/{task_id}/cancel` | 取消任务 |
| GET | `/capabilities` | 获取能力清单 |
---
@@ -96,13 +98,13 @@ P2A 协议定义**非 Agent 调用方**(如普通后端服务、前端应用
P2A 协议使用简化状态(5 种):
| 状态 | 说明 |
|------|------|
| `received` | 已接收 |
| `processing` | 处理中 |
| `completed` | 已完成(终态) |
| `failed` | 已失败(终态) |
| `cancelled` | 已取消(终态) |
| 状态 | 说明 |
|--------------|---------|
| `received` | 已接收 |
| `processing` | 处理中 |
| `completed` | 已完成(终态) |
| `failed` | 已失败(终态) |
| `cancelled` | 已取消(终态) |
状态流转:
@@ -119,6 +121,7 @@ received → processing → completed
### 5.1 API Key 认证
传递方式:
- HTTP Header:`X-API-Key: {api_key}`
- URL Query:`?api_key={api_key}`
@@ -134,26 +137,26 @@ received → processing → completed
### 6.1 任务提交请求(JSON)
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_type` | string | ✓ | 任务类型(如 `text_generation`) |
| `payload` | object | ✓ | 任务参数(结构由 task_type 决定) |
| `external_task_id` | string | - | 调用方的任务 ID,用于关联 |
| `priority` | string | - | 优先级:`low`/`normal`/`high`/`urgent`,默认 `normal` |
| `callback_url` | string | - | 回调 URL,不提供则需轮询 |
| `callback_token` | string | - | 回调验证 token |
| 字段 | 类型 | 必填 | 说明 |
|--------------------|--------|:--:|------------------------------------------------|
| `task_type` | string | ✓ | 任务类型(如 `text_generation`) |
| `payload` | object | ✓ | 任务参数(结构由 task_type 决定) |
| `external_task_id` | string | - | 调用方的任务 ID,用于关联 |
| `priority` | string | - | 优先级:`low`/`normal`/`high`/`urgent`,默认 `normal` |
| `callback_url` | string | - | 回调 URL,不提供则需轮询 |
| `callback_token` | string | - | 回调验证 token |
### 6.2 任务提交请求(Multipart)
| 字段 | 类型 | 必填 | 说明 |
|------|------|:----:|------|
| `task_type` | string | ✓ | 任务类型 |
| `payload` | string(JSON) | ✓ | 任务参数(JSON 字符串) |
| `external_task_id` | string | - | 外部任务 ID |
| `priority` | string | - | 优先级 |
| `callback_url` | string | - | 回调 URL |
| `callback_token` | string | - | 回调 token |
| `file` | file | - | 上传的文件(可多个) |
| 字段 | 类型 | 必填 | 说明 |
|--------------------|--------------|:--:|----------------|
| `task_type` | string | ✓ | 任务类型 |
| `payload` | string(JSON) | ✓ | 任务参数(JSON 字符串) |
| `external_task_id` | string | - | 外部任务 ID |
| `priority` | string | - | 优先级 |
| `callback_url` | string | - | 回调 URL |
| `callback_token` | string | - | 回调 token |
| `file` | file | - | 上传的文件(可多个) |
---
@@ -161,77 +164,77 @@ received → processing → completed
### 7.1 任务提交响应
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | boolean | 是否成功 |
| `task_id` | string | 服务端生成的任务 ID |
| `status` | string | 初始状态(通常为 `received`) |
| `message` | string | 提示信息 |
| `error` | object | 错误信息(失败时) |
| 字段 | 类型 | 说明 |
|-----------|---------|----------------------|
| `success` | boolean | 是否成功 |
| `task_id` | string | 服务端生成的任务 ID |
| `status` | string | 初始状态(通常为 `received`) |
| `message` | string | 提示信息 |
| `error` | object | 错误信息(失败时) |
### 7.2 任务详情响应
| 字段 | 类型 | 说明 |
|------|------|------|
| 字段 | 类型 | 说明 |
|-----------|---------|------|
| `success` | boolean | 是否成功 |
| `task` | object | 任务详情 |
| `error` | object | 错误信息 |
| `task` | object | 任务详情 |
| `error` | object | 错误信息 |
### 7.3 任务详情结构
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | string | 任务 ID |
| `type` | string | 任务类型 |
| `status` | string | 任务状态 |
| `progress` | integer | 进度百分比(0-100) |
| `message` | string | 状态说明 |
| `created_at` | string | 创建时间(RFC3339) |
| `updated_at` | string | 更新时间(RFC3339) |
| `completed_at` | string | 完成时间(RFC3339) |
| `eta` | string | 预估完成时间 |
| `result` | object | 任务结果(结构由 task_type 决定) |
| `error` | object | 错误信息 |
| 字段 | 类型 | 说明 |
|----------------|---------|------------------------|
| `id` | string | 任务 ID |
| `type` | string | 任务类型 |
| `status` | string | 任务状态 |
| `progress` | integer | 进度百分比(0-100) |
| `message` | string | 状态说明 |
| `created_at` | string | 创建时间(RFC3339) |
| `updated_at` | string | 更新时间(RFC3339) |
| `completed_at` | string | 完成时间(RFC3339) |
| `eta` | string | 预估完成时间 |
| `result` | object | 任务结果(结构由 task_type 决定) |
| `error` | object | 错误信息 |
### 7.4 任务列表响应
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | boolean | 是否成功 |
| `tasks` | array | 任务列表 |
| `total` | integer | 总数 |
| `limit` | integer | 每页数量 |
| `offset` | integer | 偏移量 |
| 字段 | 类型 | 说明 |
|------------|---------|-------|
| `success` | boolean | 是否成功 |
| `tasks` | array | 任务列表 |
| `total` | integer | 总数 |
| `limit` | integer | 每页数量 |
| `offset` | integer | 偏移量 |
| `has_more` | boolean | 是否有更多 |
### 7.5 能力清单响应
| 字段 | 类型 | 说明 |
|------|------|------|
| `agent_id` | string | Agent 唯一标识 |
| `agent_name` | string | Agent 名称 |
| `protocol_version` | string | 协议版本 |
| `supported_task_types` | array | 支持的任务类型列表 |
| `supported_content_types` | array | 支持的内容类型 |
| `max_file_size` | integer | 最大文件大小(字节) |
| `max_concurrent_tasks` | integer | 最大并发任务数 |
| `max_task_duration` | integer | 最大任务时长(秒) |
| `support_progress_updates` | boolean | 是否支持进度更新 |
| `support_streaming` | boolean | 是否支持流式传输 |
| `support_hil` | boolean | 是否支持人类介入 |
| `support_groups` | boolean | 是否支持群组协作 |
| 字段 | 类型 | 说明 |
|----------------------------|---------|------------|
| `agent_id` | string | Agent 唯一标识 |
| `agent_name` | string | Agent 名称 |
| `protocol_version` | string | 协议版本 |
| `supported_task_types` | array | 支持的任务类型列表 |
| `supported_content_types` | array | 支持的内容类型 |
| `max_file_size` | integer | 最大文件大小(字节) |
| `max_concurrent_tasks` | integer | 最大并发任务数 |
| `max_task_duration` | integer | 最大任务时长(秒) |
| `support_progress_updates` | boolean | 是否支持进度更新 |
| `support_streaming` | boolean | 是否支持流式传输 |
| `support_hil` | boolean | 是否支持人类介入 |
| `support_groups` | boolean | 是否支持群组协作 |
### 7.6 任务类型能力
| 字段 | 类型 | 说明 |
|------|------|------|
| `type` | string | 任务类型标识 |
| `name` | string | 任务类型名称 |
| `description` | string | 描述 |
| 字段 | 类型 | 说明 |
|------------------|--------|--------------------|
| `type` | string | 任务类型标识 |
| `name` | string | 任务类型名称 |
| `description` | string | 描述 |
| `estimated_time` | string | 预估耗时(如 "30s-2min") |
| `input_schema` | string | 输入 Schema |
| `output_schema` | string | 输出 Schema |
| `capabilities` | array | 所需能力列表 |
| `input_schema` | string | 输入 Schema |
| `output_schema` | string | 输出 Schema |
| `capabilities` | array | 所需能力列表 |
---
@@ -241,40 +244,40 @@ received → processing → completed
当任务完成时,服务端向调用方提供的 `callback_url` 发送回调:
| 字段 | 类型 | 说明 |
|------|------|------|
| `task_id` | string | 任务 ID |
| `external_task_id` | string | 外部任务 ID(如有) |
| `status` | string | 任务状态 |
| `progress` | integer | 进度 |
| `result` | object | 任务结果 |
| `error` | object | 错误信息 |
| `timestamp` | string | 时间戳(RFC3339) |
| 字段 | 类型 | 说明 |
|--------------------|---------|--------------|
| `task_id` | string | 任务 ID |
| `external_task_id` | string | 外部任务 ID(如有) |
| `status` | string | 任务状态 |
| `progress` | integer | 进度 |
| `result` | object | 任务结果 |
| `error` | object | 错误信息 |
| `timestamp` | string | 时间戳(RFC3339) |
### 8.2 回调 Header
| Header | 说明 |
|--------|------|
| Header | 说明 |
|--------------------|------------------------------------|
| `X-Callback-Token` | 回调验证 token(如调用方提供了 callback_token) |
| `Content-Type` | `application/json` |
| `Content-Type` | `application/json` |
---
## 9. 错误响应结构
| 字段 | 类型 | 说明 |
|------|------|------|
| 字段 | 类型 | 说明 |
|-----------|---------|-------|
| `success` | boolean | false |
| `error` | object | 错误详情 |
| `error` | object | 错误详情 |
错误详情结构:
| 字段 | 类型 | 说明 |
|------|------|------|
| `code` | integer | 数字错误码 |
| `category` | string | 错误类别 |
| `message` | string | 错误描述 |
| `details` | object | 详细信息 |
| 字段 | 类型 | 说明 |
|---------------|---------|-----------|
| `code` | integer | 数字错误码 |
| `category` | string | 错误类别 |
| `message` | string | 错误描述 |
| `details` | object | 详细信息 |
| `retry_after` | integer | 重试等待时间(秒) |
---
@@ -284,6 +287,7 @@ received → processing → completed
### 10.1 回调模式
调用方提供 `callback_url`:
- 任务状态变化时主动回调
- 无需轮询
- 适用于实时性要求高的场景
@@ -291,6 +295,7 @@ received → processing → completed
### 10.2 轮询模式
调用方不提供 `callback_url`:
- 需主动调用 `/task/{task_id}/status` 查询
- 适用于无法接收回调的场景
- 推荐轮询间隔:5-10 秒
@@ -298,6 +303,7 @@ received → processing → completed
### 10.3 混合模式
调用方提供 `callback_url`,同时支持轮询:
- 回调为主,轮询兜底
- 适用于高可靠性场景
@@ -311,13 +317,13 @@ received → processing → completed
P2A 协议是 A2A 协议的"简化入口":
| P2A API | A2A 消息映射 |
|---------|-------------|
| POST `/task` | `p2p:task_request` |
| GET `/task/{id}` | 内部状态查询 |
| POST `/task/{id}/cancel` | `p2p:task_cancel` |
| GET `/capabilities` | `p2p:capability_query` + `p2p:capability_response` |
| 回调发送 | `p2p:task_complete` / `p2p:task_failed` 等 |
| P2A API | A2A 消息映射 |
|--------------------------|----------------------------------------------------|
| POST `/task` | `p2p:task_request` |
| GET `/task/{id}` | 内部状态查询 |
| POST `/task/{id}/cancel` | `p2p:task_cancel` |
| GET `/capabilities` | `p2p:capability_query` + `p2p:capability_response` |
| 回调发送 | `p2p:task_complete` / `p2p:task_failed` 等 |
---
@@ -325,11 +331,11 @@ P2A 协议是 A2A 协议的"简化入口":
实现 P2A 协议的服务端必须提供:
| 接口 | 说明 |
|------|------|
| 任务接收端点 | 接收任务提交请求 |
| 任务查询端点 | 提供任务状态和结果查询 |
| 任务取消端点 | 支持任务取消 |
| 能力查询端点 | 提供能力清单 |
| 回调发送器 | 支持向调用方回调 |
| 接口 | 说明 |
|---------|--------------------|
| 任务接收端点 | 接收任务提交请求 |
| 任务查询端点 | 提供任务状态和结果查询 |
| 任务取消端点 | 支持任务取消 |
| 能力查询端点 | 提供能力清单 |
| 回调发送器 | 支持向调用方回调 |
| A2A 转换器 | 将 P2A 请求转换为 A2A 消息 |

View File

@@ -18,6 +18,7 @@
### 1.1 问题陈述
现有协议假设存在中心化的注册表(如灵脉 Meridian),但在以下场景中:
- 临时 P2P 网络
- 跨组织协作
- 离线/断网环境
@@ -27,13 +28,13 @@
### 1.2 设计目标
| 目标 | 说明 |
|-----|------|
| 目标 | 说明 |
|-------|-----------------|
| 身份可验证 | AgentID 无法伪造或冒用 |
| 去中心化 | 无需中心化注册表 |
| 高可用 | 无单点故障 |
| 可扩展 | 支持大规模 Agent 网络 |
| 可读性 | 支持人类可读别名(可选) |
| 去中心化 | 无需中心化注册表 |
| 高可用 | 无单点故障 |
| 可扩展 | 支持大规模 Agent 网络 |
| 可读性 | 支持人类可读别名(可选) |
---
@@ -52,41 +53,41 @@ AgentID = {namespace}:{key_hash}:{alias}
did:synapse:abc123def456:chat-bot
```
| 部分 | 格式 | 说明 |
|------|------|------|
| namespace | string | 命名空间(如 `synapse`) |
| key_hash | base58 | 公钥哈希的前 16 字节 |
| alias | string(可选) | 人类可读别名 |
| 部分 | 格式 | 说明 |
|-----------|------------|-------------------|
| namespace | string | 命名空间(如 `synapse`) |
| key_hash | base58 | 公钥哈希的前 16 字节 |
| alias | string(可选) | 人类可读别名 |
### 2.2 生成算法
```go
func GenerateAgentID(privateKey []byte, namespace string, alias string) string {
// 1. 从私钥派生公钥
publicKey := crypto.GeneratePublicKey(privateKey)
// 2. 计算公钥哈希
hash := sha3.Sum256(publicKey)
// 3. 取前 16 字节,Base58 编码
keyHash := base58.Encode(hash[:16])
// 4. 组装完整 ID
if alias != "" {
return fmt.Sprintf("%s:%s:%s", namespace, keyHash, alias)
}
return fmt.Sprintf("%s:%s", namespace, keyHash)
// 1. 从私钥派生公钥
publicKey := crypto.GeneratePublicKey(privateKey)
// 2. 计算公钥哈希
hash := sha3.Sum256(publicKey)
// 3. 取前 16 字节,Base58 编码
keyHash := base58.Encode(hash[:16])
// 4. 组装完整 ID
if alias != "" {
return fmt.Sprintf("%s:%s:%s", namespace, keyHash, alias)
}
return fmt.Sprintf("%s:%s", namespace, keyHash)
}
```
### 2.3 ID 特性
| 特性 | 说明 |
|------|------|
| 唯一性 | 相同公钥 → 相同 key_hash → 相同 AgentID |
| 不可伪造 | 无法在没有私钥的情况下生成有效 AgentID |
| 可验证 | 任何人都可以用公钥验证 AgentID 真实性 |
| 不可预测 | 私钥随机生成,key_hash 不可预测 |
| 特性 | 说明 |
|------|---------------------------------|
| 唯一性 | 相同公钥 → 相同 key_hash → 相同 AgentID |
| 不可伪造 | 无法在没有私钥的情况下生成有效 AgentID |
| 可验证 | 任何人都可以用公钥验证 AgentID 真实性 |
| 不可预测 | 私钥随机生成,key_hash 不可预测 |
---
@@ -120,10 +121,10 @@ func GenerateAgentID(privateKey []byte, namespace string, alias string) string {
```go
type SignedMessage struct {
Message *UnifiedSynapseMessage // 原始消息
Signature []byte // 签名
PublicKey []byte // 公钥
AgentID string // Agent 标识
Message *UnifiedSynapseMessage // 原始消息
Signature []byte // 签名
PublicKey []byte // 公钥
AgentID string // Agent 标识
}
```
@@ -139,11 +140,11 @@ signature_content =
### 3.4 签名算法
| 算法 | 说明 |
|------|------|
| Ed25519 | 默认,高效且安全 |
| ECDSA-P256 | 兼容性选项 |
| RSA-2048 | 遗留系统兼容 |
| 算法 | 说明 |
|------------|----------|
| Ed25519 | 默认,高效且安全 |
| ECDSA-P256 | 兼容性选项 |
| RSA-2048 | 遗留系统兼容 |
---
@@ -151,11 +152,11 @@ signature_content =
### 4.1 发现机制选择
| 场景 | 推荐机制 |
|------|---------|
| 小规模(<100 Agent) | 广播查询 |
| 中规模(100-10000) | 分层 DHT |
| 大规模(>10000) | 完整 Kademlia |
| 场景 | 推荐机制 |
|-----------------|-------------|
| 小规模(<100 Agent) | 广播查询 |
| 中规模(100-10000) | 分层 DHT |
| 大规模(>10000) | 完整 Kademlia |
### 4.2 广播查询协议
@@ -201,26 +202,26 @@ Agent A 想知道 Agent B 的 Endpoint:
### 4.4 DHT 消息类型
| 消息类型 | 说明 |
|---------|------|
| `dht:ping` | 节点存活探测 |
| `dht:store` | 存储 Agent 记录 |
| `dht:find_node` | 查找附近节点 |
| 消息类型 | 说明 |
|------------------|-------------|
| `dht:ping` | 节点存活探测 |
| `dht:store` | 存储 Agent 记录 |
| `dht:find_node` | 查找附近节点 |
| `dht:find_value` | 查找 Agent 记录 |
| `dht:notify` | 通知记录更新 |
| `dht:notify` | 通知记录更新 |
### 4.5 Agent 记录结构
```go
type AgentRecord struct {
AgentID string // Agent 唯一标识
Alias string // 人类可读别名(可选)
Endpoint string // 网络地址
PublicKey []byte // 公钥
TTL int64 // 记录有效期(秒)
Version uint64 // 版本号(递增)
Signature []byte // Agent 对以上字段的签名
Timestamp int64 // 发布时间戳
AgentID string // Agent 唯一标识
Alias string // 人类可读别名(可选)
Endpoint string // 网络地址
PublicKey []byte // 公钥
TTL int64 // 记录有效期(秒)
Version uint64 // 版本号(递增)
Signature []byte // Agent 对以上字段的签名
Timestamp int64 // 发布时间戳
}
```
@@ -263,6 +264,7 @@ record_signature_content =
```
**核心思想**:
- Agent 在区块链智能合约中注册身份
- 注册需要质押一定数量的代币作为保证金
- 心跳通过交易上链更新
@@ -449,13 +451,13 @@ did:synapse:{method-specific-id}
**DID 方法**:
| 方法 | 说明 |
|------|------|
| `did:synapse:ethereum` | 基于以太坊链上注册表 |
| `did:synapse:polygon` | 基于 Polygon 链 |
| `did:synapse:solana` | 基于 Solana 链 |
| `did:synapse:key` | 基于公钥的离链 DID |
| `did:synapse:dht` | 基于 DHT 的离链 DID |
| 方法 | 说明 |
|------------------------|----------------|
| `did:synapse:ethereum` | 基于以太坊链上注册表 |
| `did:synapse:polygon` | 基于 Polygon 链 |
| `did:synapse:solana` | 基于 Solana 链 |
| `did:synapse:key` | 基于公钥的离链 DID |
| `did:synapse:dht` | 基于 DHT 的离链 DID |
**DID Document 示例**:
@@ -466,18 +468,25 @@ did:synapse:{method-specific-id}
"https://www.w3.org/ns/synapse/v1"
],
"id": "did:synapse:ethereum:0x1234abcd5678",
"verificationMethod": [{
"id": "did:synapse:ethereum:0x1234abcd5678#keys-1",
"type": "EcdsaSecp256k1VerificationKey2019",
"controller": "did:synapse:ethereum:0x1234abcd5678",
"publicKeyHex": "02b3..."
}],
"service": [{
"id": "did:synapse:ethereum:0x1234abcd5678#synapse-agent",
"type": "SynapseAgent",
"serviceEndpoint": "https://agent-01.example.com/api/synapse"
}],
"synapse:capabilities": ["text_generation", "image_generation"],
"verificationMethod": [
{
"id": "did:synapse:ethereum:0x1234abcd5678#keys-1",
"type": "EcdsaSecp256k1VerificationKey2019",
"controller": "did:synapse:ethereum:0x1234abcd5678",
"publicKeyHex": "02b3..."
}
],
"service": [
{
"id": "did:synapse:ethereum:0x1234abcd5678#synapse-agent",
"type": "SynapseAgent",
"serviceEndpoint": "https://agent-01.example.com/api/synapse"
}
],
"synapse:capabilities": [
"text_generation",
"image_generation"
],
"synapse:agentName": "智能写作助手",
"synapse:version": "1.0.0"
}
@@ -485,14 +494,14 @@ did:synapse:{method-specific-id}
### 4.1.4 区块链平台选择
| 平台 | 优点 | 缺点 | 适合场景 |
|------|------|------|---------|
| Ethereum | 生态最大、安全最高 | Gas 贵、延迟高 | 高价值交易、核心 Agent |
| Polygon | 低 Gas、快确认 | 中心化程度较高 | 中等价值、大量 Agent |
| Solana | 高吞吐、低延迟 | 稳定性偶有问题 | 高频心跳场景 |
| 联盟链 | 可控、隐私好 | 需要许可机制 | 企业内部、联盟合作 |
| L2 (Arbitrum) | 低 Gas、安全继承 | 复杂度较高 | 通用场景 |
| 本地私链 | 完全可控、零成本 | 信任范围有限 | 测试、内部系统 |
| 平台 | 优点 | 缺点 | 适合场景 |
|---------------|------------|-----------|----------------|
| Ethereum | 生态最大、安全最高 | Gas 贵、延迟高 | 高价值交易、核心 Agent |
| Polygon | 低 Gas、快确认 | 中心化程度较高 | 中等价值、大量 Agent |
| Solana | 高吞吐、低延迟 | 稳定性偶有问题 | 高频心跳场景 |
| 联盟链 | 可控、隐私好 | 需要许可机制 | 企业内部、联盟合作 |
| L2 (Arbitrum) | 低 Gas、安全继承 | 复杂度较高 | 通用场景 |
| 本地私链 | 完全可控、零成本 | 信任范围有限 | 测试、内部系统 |
### 4.1.5 混合架构(推荐)
@@ -526,43 +535,43 @@ did:synapse:{method-specific-id}
```go
type HybridLookup struct {
// L1: 本地缓存(内存,TTL 1分钟)
LocalCache map[string]*AgentRecord
// L2: DHT 网络(分钟级一致性)
DHT DHTClient
// L3: 区块链(最终一致性源)
Blockchain BlockchainClient
// L1: 本地缓存(内存,TTL 1分钟)
LocalCache map[string]*AgentRecord
// L2: DHT 网络(分钟级一致性)
DHT DHTClient
// L3: 区块链(最终一致性源)
Blockchain BlockchainClient
}
func (h *HybridLookup) Find(agentID string) (*AgentRecord, error) {
// 1. 查本地缓存
if record, ok := h.LocalCache.Get(agentID); ok {
if record.IsFresh() {
return record, nil
}
}
// 2. 查 DHT
if record, err := h.DHT.FindValue(agentID); err == nil {
// 验证签名
if record.VerifySignature() {
h.LocalCache.Set(agentID, record)
return record, nil
}
}
// 3. 查区块链(最终源)
if record, err := h.Blockchain.Lookup(agentID); err == nil {
// 验证链上签名(已由链上合约验证过)
h.LocalCache.Set(agentID, record)
// 广播到 DHT 加速后续查询
h.DHT.Store(agentID, record)
return record, nil
}
return nil, ErrAgentNotFound
// 1. 查本地缓存
if record, ok := h.LocalCache.Get(agentID); ok {
if record.IsFresh() {
return record, nil
}
}
// 2. 查 DHT
if record, err := h.DHT.FindValue(agentID); err == nil {
// 验证签名
if record.VerifySignature() {
h.LocalCache.Set(agentID, record)
return record, nil
}
}
// 3. 查区块链(最终源)
if record, err := h.Blockchain.Lookup(agentID); err == nil {
// 验证链上签名(已由链上合约验证过)
h.LocalCache.Set(agentID, record)
// 广播到 DHT 加速后续查询
h.DHT.Store(agentID, record)
return record, nil
}
return nil, ErrAgentNotFound
}
```
@@ -570,13 +579,13 @@ func (h *HybridLookup) Find(agentID string) (*AgentRecord, error) {
区块链还可实现链上治理功能:
| 功能 | 说明 |
|------|------|
| 功能 | 说明 |
|------|---------------------------|
| 质押机制 | Agent 注册需质押代币,恶意行为被 slash |
| 信誉评分 | 链上可查的 Agent 信誉分 |
| 服务定价 | 智能合约自动结算任务费用 |
| 争议仲裁 | 链上投票仲裁 Agent 纠纷 |
| 协议升级 | 通过 DAO 投票决定协议升级 |
| 信誉评分 | 链上可查的 Agent 信誉分 |
| 服务定价 | 智能合约自动结算任务费用 |
| 争议仲裁 | 链上投票仲裁 Agent 纠纷 |
| 协议升级 | 通过 DAO 投票决定协议升级 |
---
@@ -584,12 +593,12 @@ func (h *HybridLookup) Find(agentID string) (*AgentRecord, error) {
### 5.1 冲突场景
| 场景 | 说明 |
|------|------|
| 同一公钥注册多个别名 | 允许(同一 Agent 的多个别名) |
| 不同公钥生成相同 AgentID | 不可能(公钥哈希唯一) |
| 伪造他人 AgentID | 不可能(无法伪造签名) |
| Endpoint 欺骗 | 需要额外验证 |
| 场景 | 说明 |
|------------------|--------------------|
| 同一公钥注册多个别名 | 允许(同一 Agent 的多个别名) |
| 不同公钥生成相同 AgentID | 不可能(公钥哈希唯一) |
| 伪造他人 AgentID | 不可能(无法伪造签名) |
| Endpoint 欺骗 | 需要额外验证 |
### 5.2 Endpoint 绑定验证
@@ -611,33 +620,33 @@ func (h *HybridLookup) Find(agentID string) (*AgentRecord, error) {
```go
// 挑战消息
type Challenge struct {
ChallengeID string // 挑战 ID
Nonce []byte // 随机数
Timestamp int64 // 发送时间
ChallengeID string // 挑战 ID
Nonce []byte // 随机数
Timestamp int64 // 发送时间
}
// 响应消息
type ChallengeResponse struct {
ChallengeID string // 对应的挑战 ID
Nonce []byte // 原样返回的随机数
Signature []byte // 对 Nonce 的签名
ChallengeID string // 对应的挑战 ID
Nonce []byte // 原样返回的随机数
Signature []byte // 对 Nonce 的签名
}
// 验证流程
func VerifyEndpoint(endpoint string, publicKey []byte, challenge *Challenge) bool {
// 1. 发送挑战到 Endpoint
resp := SendChallenge(endpoint, challenge)
// 2. 验证响应
if resp.ChallengeID != challenge.ChallengeID {
return false // 挑战 ID 不匹配
}
if !bytes.Equal(resp.Nonce, challenge.Nonce) {
return false // Nonce 被篡改
}
// 3. 验证签名
return crypto.Verify(publicKey, challenge.Nonce, resp.Signature)
// 1. 发送挑战到 Endpoint
resp := SendChallenge(endpoint, challenge)
// 2. 验证响应
if resp.ChallengeID != challenge.ChallengeID {
return false // 挑战 ID 不匹配
}
if !bytes.Equal(resp.Nonce, challenge.Nonce) {
return false // Nonce 被篡改
}
// 3. 验证签名
return crypto.Verify(publicKey, challenge.Nonce, resp.Signature)
}
```
@@ -678,40 +687,40 @@ func VerifyEndpoint(endpoint string, publicKey []byte, challenge *Challenge) boo
### 6.2 生命周期消息
| 状态 | 说明 | 触发条件 |
|------|------|---------|
| offline | 离线 | 初始状态或主动注销 |
| online | 上线中 | 注册完成,等待首次心跳 |
| active | 活跃 | 定期心跳维持 |
| 状态 | 说明 | 触发条件 |
|------------|-----|-----------------|
| offline | 离线 | 初始状态或主动注销 |
| online | 上线中 | 注册完成,等待首次心跳 |
| active | 活跃 | 定期心跳维持 |
| refreshing | 刷新中 | 更新 Endpoint 或别名 |
| suspended | 挂起 | 心跳超时,未注销 |
| offline | 离线 | 注销或永久离线 |
| suspended | 挂起 | 心跳超时,未注销 |
| offline | 离线 | 注销或永久离线 |
### 6.3 消息类型
| 消息类型 | 方向 | 说明 |
|---------|------|------|
| `identity:register` | → 网络 | 注册 Agent 身份 |
| `identity:refresh` | → 网络 | 刷新注册信息 |
| `identity:challenge` | 双向 | Endpoint 验证挑战 |
| `identity:challenge_response` | 双向 | 挑战响应 |
| `identity:revoke` | → 网络 | 注销身份 |
| `identity:lookup` | → 网络 | 查询 Agent 信息 |
| `identity:lookup_response` | → 网络 | 查询响应 |
| `identity:announce` | → 网络 | 广播在线状态 |
| `identity:heartbeat` | → 网络 | 心跳保活 |
| 消息类型 | 方向 | 说明 |
|-------------------------------|------|---------------|
| `identity:register` | → 网络 | 注册 Agent 身份 |
| `identity:refresh` | → 网络 | 刷新注册信息 |
| `identity:challenge` | 双向 | Endpoint 验证挑战 |
| `identity:challenge_response` | 双向 | 挑战响应 |
| `identity:revoke` | → 网络 | 注销身份 |
| `identity:lookup` | → 网络 | 查询 Agent 信息 |
| `identity:lookup_response` | → 网络 | 查询响应 |
| `identity:announce` | → 网络 | 广播在线状态 |
| `identity:heartbeat` | → 网络 | 心跳保活 |
### 6.4 Register 载荷
```go
type IdentityRegisterPayload struct {
AgentID string // Agent 标识
Alias string // 人类可读别名
Endpoint string // 网络地址
PublicKey []byte // 公钥
TTL int64 // 注册有效期
Version uint64 // 版本号
Signature []byte // Agent 签名
AgentID string // Agent 标识
Alias string // 人类可读别名
Endpoint string // 网络地址
PublicKey []byte // 公钥
TTL int64 // 注册有效期
Version uint64 // 版本号
Signature []byte // Agent 签名
}
```
@@ -719,10 +728,10 @@ type IdentityRegisterPayload struct {
```go
type IdentityHeartbeatPayload struct {
AgentID string // Agent 标识
Endpoint string // 当前 Endpoint(可能变化)
TTL int64 // 续期时间
Signature []byte // Agent 签名
AgentID string // Agent 标识
Endpoint string // 当前 Endpoint(可能变化)
TTL int64 // 续期时间
Signature []byte // Agent 签名
}
```
@@ -732,48 +741,48 @@ type IdentityHeartbeatPayload struct {
### 7.1 威胁模型
| 威胁 | 场景 | 防护措施 |
|------|------|---------|
| 身份伪造 | 攻击者声称自己是他人 | 公钥派生 ID + 签名验证 |
| Endpoint 欺骗 | 攻击者声称他人 Endpoint | 挑战-响应协议 |
| 重放攻击 | 攻击者重放旧消息 | 时间戳 + Nonce |
| 中间人攻击 | 拦截并修改消息 | TLS + 签名验证 |
| 女巫攻击 | 一个节点伪装多个身份 | 工作量证明或权益证明(可选) |
| 日食攻击 | 隔离目标节点 | 多路径查询 |
| 威胁 | 场景 | 防护措施 |
|-------------|------------------|----------------|
| 身份伪造 | 攻击者声称自己是他人 | 公钥派生 ID + 签名验证 |
| Endpoint 欺骗 | 攻击者声称他人 Endpoint | 挑战-响应协议 |
| 重放攻击 | 攻击者重放旧消息 | 时间戳 + Nonce |
| 中间人攻击 | 拦截并修改消息 | TLS + 签名验证 |
| 女巫攻击 | 一个节点伪装多个身份 | 工作量证明或权益证明(可选) |
| 日食攻击 | 隔离目标节点 | 多路径查询 |
### 7.2 重放攻击防护
```go
type AntiReplay struct {
RecentNonces map[string]int64 // nonce -> timestamp
Window time.Duration // 时间窗口(5分钟)
RecentNonces map[string]int64 // nonce -> timestamp
Window time.Duration // 时间窗口(5分钟)
}
func (a *AntiReplay) CheckAndAdd(nonce string, timestamp int64) bool {
// 1. 检查时间戳是否在窗口内
now := time.Now().Unix()
if now - timestamp > int64(a.Window.Seconds()) {
return false // 时间戳太旧
}
// 2. 检查 Nonce 是否已使用
if _, exists := a.RecentNonces[nonce]; exists {
return false // 重放
}
// 3. 记录
a.RecentNonces[nonce] = timestamp
return true
// 1. 检查时间戳是否在窗口内
now := time.Now().Unix()
if now - timestamp > int64(a.Window.Seconds()) {
return false // 时间戳太旧
}
// 2. 检查 Nonce 是否已使用
if _, exists := a.RecentNonces[nonce]; exists {
return false // 重放
}
// 3. 记录
a.RecentNonces[nonce] = timestamp
return true
}
```
### 7.3 私钥保护
| 场景 | 建议 |
|------|------|
| 本地运行 | 使用密钥文件 + 操作系统密钥链 |
| 云端运行 | 使用 HSM/KMS |
| 嵌入式设备 | 使用 TPM |
| 场景 | 建议 |
|------------|---------------------------------|
| 本地运行 | 使用密钥文件 + 操作系统密钥链 |
| 云端运行 | 使用 HSM/KMS |
| 嵌入式设备 | 使用 TPM |
| 多 Agent 共享 | 密钥分片(如 Shamir's Secret Sharing) |
---
@@ -786,33 +795,33 @@ func (a *AntiReplay) CheckAndAdd(nonce string, timestamp int64) bool {
```go
type AgentEndpoint struct {
AgentID string // 扩展:基于公钥派生
AgentName string // 人类可读名称
SystemID string // 所属系统
Endpoint string // 回调端点
Version string // Agent 版本
// 新增字段
PublicKey []byte // 公钥(用于验证)
Namespace string // 命名空间
Alias string // 人类可读别名
AgentID string // 扩展:基于公钥派生
AgentName string // 人类可读名称
SystemID string // 所属系统
Endpoint string // 回调端点
Version string // Agent 版本
// 新增字段
PublicKey []byte // 公钥(用于验证)
Namespace string // 命名空间
Alias string // 人类可读别名
}
```
### 8.2 与灵脉(Meridian)的整合
| 模式 | 行为 |
|------|------|
| 中心化可用 | 使用灵脉作为主注册表,本草案作为备份 |
| 去中心化 | 使用本草案的 DHT 机制,完全去中心化 |
| 混合模式 | 核心 Agent 使用中心化,边缘 Agent 使用去中心化 |
| 模式 | 行为 |
|-------|--------------------------------|
| 中心化可用 | 使用灵脉作为主注册表,本草案作为备份 |
| 去中心化 | 使用本草案的 DHT 机制,完全去中心化 |
| 混合模式 | 核心 Agent 使用中心化,边缘 Agent 使用去中心化 |
### 8.3 与灵玺(Sigil)的整合
| 组件 | 职责 |
|------|------|
| 灵玺(Sigil) | 密钥管理、签名验证 |
| 本草案 | ID 生成、发现协议、生命周期 |
| 组件 | 职责 |
|-----------|-----------------|
| 灵玺(Sigil) | 密钥管理、签名验证 |
| 本草案 | ID 生成、发现协议、生命周期 |
---
@@ -820,36 +829,36 @@ type AgentEndpoint struct {
### 9.1 消息类型列表
| 类型 | 协议前缀 | 说明 |
|------|---------|------|
| `identity:register` | 前端 | 注册身份 |
| `identity:refresh` | 前端 | 刷新注册 |
| `identity:revoke` | 前端 | 注销身份 |
| `identity:challenge` | 前端 | 挑战请求 |
| `identity:challenge_response` | 前端 | 挑战响应 |
| `identity:lookup` | 前端 | 查询身份 |
| `identity:lookup_response` | 前端 | 查询响应 |
| `identity:announce` | 前端 | 广播在线 |
| `identity:heartbeat` | 前端 | 心跳保活 |
| `dht:ping` | DHT | 节点探测 |
| `dht:store` | DHT | 存储记录 |
| `dht:find_node` | DHT | 查找节点 |
| `dht:find_value` | DHT | 查找值 |
| `dht:notify` | DHT | 通知更新 |
| 类型 | 协议前缀 | 说明 |
|-------------------------------|------|------|
| `identity:register` | 前端 | 注册身份 |
| `identity:refresh` | 前端 | 刷新注册 |
| `identity:revoke` | 前端 | 注销身份 |
| `identity:challenge` | 前端 | 挑战请求 |
| `identity:challenge_response` | 前端 | 挑战响应 |
| `identity:lookup` | 前端 | 查询身份 |
| `identity:lookup_response` | 前端 | 查询响应 |
| `identity:announce` | 前端 | 广播在线 |
| `identity:heartbeat` | 前端 | 心跳保活 |
| `dht:ping` | DHT | 节点探测 |
| `dht:store` | DHT | 存储记录 |
| `dht:find_node` | DHT | 查找节点 |
| `dht:find_value` | DHT | 查找值 |
| `dht:notify` | DHT | 通知更新 |
---
## 10. 待解决问题(Open Issues)
| 问题 | 说明 | 优先级 |
|------|------|--------|
| 隐私保护 | 公钥哈希是否暴露身份? | 高 |
| 密钥轮换 | 私钥更换后如何保持 AgentID? | 高 |
| 名称冲突 | 人类可读别名可能重复 | 中 |
| 性能优化 | DHT 查找延迟 | 中 |
| 移动 Agent | Endpoint 频繁变化 | 低 |
| 链上 Gas 成本 | 区块链交易费用 | 中 |
| DID 方法注册 | W3C 标准 DID 方法注册流程 | 低 |
| 问题 | 说明 | 优先级 |
|-----------|--------------------|-----|
| 隐私保护 | 公钥哈希是否暴露身份? | 高 |
| 密钥轮换 | 私钥更换后如何保持 AgentID? | 高 |
| 名称冲突 | 人类可读别名可能重复 | 中 |
| 性能优化 | DHT 查找延迟 | 中 |
| 移动 Agent | Endpoint 频繁变化 | 低 |
| 链上 Gas 成本 | 区块链交易费用 | 中 |
| DID 方法注册 | W3C 标准 DID 方法注册流程 | 低 |
---
@@ -858,28 +867,31 @@ type AgentEndpoint struct {
### 11.1 分阶段实现
**Phase 1(最小可行)**:
- 实现 AgentID 公钥派生
- 实现消息签名验证
- 使用广播进行发现
**Phase 2(基本功能)**:
- 实现分层 DHT
- 实现生命周期管理
- 实现挑战-响应协议
**Phase 3(完整功能)**:
- 实现完整 Kademlia
- 实现隐私保护
- 实现密钥轮换
### 11.2 推荐库
| 功能 | 推荐库 |
|------|--------|
| 加密签名 | golang.org/x/crypto/ed25519 |
| Base58 | github.com/mr-tron/base58 |
| DHT | github.com/anacrolix/go-libutp 或自实现 |
| 分布式存储 | etcd/consul(混合模式) |
| 功能 | 推荐库 |
|--------|-------------------------------------|
| 加密签名 | golang.org/x/crypto/ed25519 |
| Base58 | github.com/mr-tron/base58 |
| DHT | github.com/anacrolix/go-libutp 或自实现 |
| 分布式存储 | etcd/consul(混合模式) |
---