Files
synapse/docs/implement/message-extensions.md
2026-06-29 00:53:42 +08:00

202 lines
14 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.

# 灵隙协议实现规范:消息扩展字段
> 版本:1.0.0 | 层级:实现层
---
## 1. 消息扩展字段总览
统一消息信封 `UnifiedSynapseMessage` 在原始协议基础字段之上,扩充了以下扩展字段,用于支持会话关联、传输控制、群组精准投递及安全声明等高级功能。
| 字段 | 类型 | 说明 |
|------|------|------|
| `ConversationID` | `string` | 会话 ID,用于多轮对话关联 |
| `TTL` | `int` | 消息存活时间,单位秒;超时后由灵泊(Harbor)自动清理 |
| `Broadcast` | `bool` | 是否广播;为 `true` 时消息将发送至群组所有成员 |
| `Encrypt` | `bool` | 标识 payload 是否已加密;接收方据此决定是否解密 |
| `TargetType` | `GroupTargetType` | 群组目标类型,定义消息在群组内的投递范围 |
| `TargetIDs` | `[]string` | 目标 ID 列表,与 `TargetType` 配合使用 |
| `SignatureAlgorithm` | `string` | 签名算法声明,接收方据此选择验证方式 |
### 代码定义
```go
type UnifiedSynapseMessage struct {
// 基础字段(协议定义)
ID string `json:"id"`
Version string `json:"version"`
Type string `json:"type"`
Sender AgentEndpoint `json:"sender"`
Receiver *AgentEndpoint `json:"receiver,omitempty"`
CorrelationID string `json:"correlation_id,omitempty"`
ReplyTo string `json:"reply_to,omitempty"`
GroupID string `json:"group_id,omitempty"`
Payload json.RawMessage `json:"payload"`
Timestamp Timestamp `json:"timestamp"`
Signature string `json:"signature,omitempty"`
// 扩展字段(实现补充)
ConversationID string `json:"conversation_id,omitempty"`
TTL int `json:"ttl,omitempty"`
Broadcast bool `json:"broadcast,omitempty"`
Encrypt bool `json:"encrypt,omitempty"`
TargetType GroupTargetType `json:"target_type,omitempty"`
TargetIDs []string `json:"target_ids,omitempty"`
SignatureAlgorithm string `json:"signature_algorithm,omitempty"`
}
```
---
## 2. 群组目标类型
`GroupTargetType` 枚举定义了消息在群组内的三种目标选择策略,用于精确控制消息的投递范围,避免向无关成员发送无关消息。
```go
type GroupTargetType string
const (
TargetTypeAll GroupTargetType = "all" // 所有成员
TargetTypeRole GroupTargetType = "role" // 按角色
TargetTypeSpecific GroupTargetType = "specific" // 指定成员
)
```
### 字段说明表
| 值 | 常量名 | 含义 | TargetIDs 用法 |
|----|--------|------|----------------|
| `"all"` | `TargetTypeAll` | 发送给群组内所有成员 | 忽略 `TargetIDs`,即使有值也不参与路由 |
| `"role"` | `TargetTypeRole` | 按角色筛选成员 | `TargetIDs` 填入角色名称列表(如 `["admin","operator"]`),仅匹配这些角色的成员会收到消息 |
| `"specific"` | `TargetTypeSpecific` | 发送给指定的若干成员 | `TargetIDs` 填入成员 AgentID 列表,精确投递 |
### 使用约束
- 仅在 `GroupID` 非空时生效。若 `GroupID` 为空,`TargetType` 和 `TargetIDs` 将被忽略。
- 默认值为空字符串,此时行为等同于 `"all"`(全量投递)。
- `TargetType` 与 `Broadcast` 的关系:当 `Broadcast` 为 `true` 时,`TargetType` 仍可进一步缩小广播范围;两者协同工作而非互斥。
---
## 3. 各字段用途说明表
| 字段名 | 类型 | 用途 | 使用场景 | 示例值 |
|--------|------|------|----------|--------|
| `ConversationID` | `string` | 关联同一会话的多条消息,形成对话上下文 | 多轮问答、连续任务编排、长对话跟踪 | `"conv-a1b2c3d4"` |
| `TTL` | `int` | 消息的存活时长,超时后由灵泊组件自动丢弃 | 临时通知、时效性指令、过期任务取消 | `300`(5 分钟) |
| `Broadcast` | `bool` | 标记消息是否为广播,指示接收方是否需要扩散 | 群组公告、系统通知、状态广播 | `true` |
| `Encrypt` | `bool` | 标记 payload 是否已加密,接收方据此触发解密流程 | 包含敏感数据的消息、跨信任域通信 | `true` |
| `TargetType` | `GroupTargetType` | 群组内的目标选择策略 | 按角色下发命令、定向通知指定成员 | `"role"` |
| `TargetIDs` | `[]string` | 配合 `TargetType` 提供目标标识列表 | 指定角色名列表或成员 ID 列表 | `["admin","operator"]` |
| `SignatureAlgorithm` | `string` | 声明消息签名所使用的算法,接收方选择对应验证逻辑 | 多算法共存场景、算法升级过渡期 | `"HMAC-SHA256"` |
---
## 4. 扩展字段与基础字段关系图
下图展示了包含扩展字段在内的完整 `UnifiedSynapseMessage` 结构层次。
```
┌─────────────────────────────────────────────────────────┐
│ UnifiedSynapseMessage │
│ │
│ ┌─────────────────────────────────────────────────────┐│
│ │ 基础字段 ││
│ │ ││
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ ││
│ │ │ ID │ │ Version │ │ Type │ ││
│ │ └──────────┘ └──────────┘ └──────────────────┘ ││
│ │ ││
│ │ ┌────────────────────────────────────────────────┐ ││
│ │ │ Sender (AgentEndpoint) │ ││
│ │ │ ┌─────────┐ ┌──────────┐ ┌────────────────┐ │ ││
│ │ │ │AgentID │ │AgentName │ │ Endpoint │ │ ││
│ │ │ └─────────┘ └──────────┘ └────────────────┘ │ ││
│ │ │ ┌─────────┐ ┌──────────┐ ┌────────────────┐ │ ││
│ │ │ │SystemID │ │Version │ │ Capabilities │ │ ││
│ │ │ └─────────┘ └──────────┘ └────────────────┘ │ ││
│ │ └────────────────────────────────────────────────┘ ││
│ │ ││
│ │ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ││
│ │ │ Receiver │ │CorrelationID │ │ ReplyTo │ ││
│ │ │(optional)│ │ │ │ │ ││
│ │ └──────────┘ └──────────────┘ └──────────────┘ ││
│ │ ││
│ │ ┌──────────┐ ┌──────────────────────────────────┐ ││
│ │ │ GroupID │ │ Payload │ ││
│ │ │ │ │ (json.RawMessage) │ ││
│ │ └──────────┘ └──────────────────────────────────┘ ││
│ │ ││
│ │ ┌──────────┐ ┌──────────┐ ││
│ │ │Timestamp │ │Signature │ ││
│ │ └──────────┘ └──────────┘ ││
│ └─────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────┐│
│ │ 扩展字段 ││
│ │ ││
│ │ ┌────────────────┐ ┌──────┐ ┌──────────┐ ││
│ │ │ ConversationID │ │ TTL │ │ Broadcast│ ││
│ │ └────────────────┘ └──────┘ └──────────┘ ││
│ │ ││
│ │ ┌──────────┐ ┌──────────────────────────────────┐ ││
│ │ │ Encrypt │ │ TargetType + TargetIDs │ ││
│ │ │ │ │ (群组目标选择) │ ││
│ │ └──────────┘ └──────────────────────────────────┘ ││
│ │ ││
│ │ ┌────────────────────────────────────────────────┐ ││
│ │ │ SignatureAlgorithm │ ││
│ │ │ (签名算法声明) │ ││
│ │ └────────────────────────────────────────────────┘ ││
│ └─────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────┘
```
### 层次说明
| 层级 | 包含字段 | 职责 |
|------|----------|------|
| **标识层** | `ID`, `Version`, `Type` | 消息唯一标识与协议版本声明 |
| **源端层** | `Sender` (AgentEndpoint) | 发送方端点信息,含身份、能力与路由地址 |
| **目标层** | `Receiver`, `GroupID`, `TargetType`, `TargetIDs` | 点对点或群组目标寻址 |
| **控制层** | `CorrelationID`, `ReplyTo`, `ConversationID` | 消息关联、回复与会话跟踪 |
| **数据层** | `Payload` | 业务负载,JSON 格式 |
| **传输层** | `TTL`, `Broadcast`, `Priority`, `ExpiresAt` | 传输行为控制与生命周期管理 |
| **安全层** | `Signature`, `SignatureAlgorithm`, `Encrypt` | 完整性保护、算法声明与负载加密 |
| **时间层** | `Timestamp` | 消息产生时间,ISO 8601 格式 |
### 扩展字段与基础字段的协作关系
```
发送流程 接收流程
───────── ─────────
发方构造消息 收方解析消息
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 填写基础字段 │ │ 校验基础字段 │
│ ID, Sender, │─────────▶ │ ID, Type, │
│ Type, Payload│ │ Signature │
└──────────────┘ └──────────────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 设置扩展字段 │ │ 读取扩展字段 │
│ │ │ │
│ • ConversationID ──────▶ │ • 恢复会话 │
│ • TTL ──────▶ │ • 设置超时 │
│ • Broadcast ──────▶ │ • 判断扩散 │
│ • Encrypt ──────▶ │ • 触发解密 │
│ • TargetType ──────▶ │ • 筛选成员 │
│ • TargetIDs ──────▶ │ • 精确投递 │
│ • SigAlgo ──────▶ │ • 选择验证 │
└──────────────┘ └──────────────┘
```
---
**参考来源**
- [v0 实现细节 - 第 7 章:消息扩展字段](file:///e:/code/go/synapse/docs/v0/06-implementation-details.md#1088)
- [UnifiedSynapseMessage 类型定义](file:///e:/code/go/synapse/pkg/types/types.go#L197-L236)