522 lines
18 KiB
Markdown
522 lines
18 KiB
Markdown
# 灵隙协议实现规范:gRPC 传输协议
|
||
|
||
> 版本:1.0.0 | 层级:实现层
|
||
|
||
---
|
||
|
||
## 1. Proto 定义位置说明
|
||
|
||
Synapse 协议的 gRPC 服务定义统一存放于以下位置:
|
||
|
||
```
|
||
proto/
|
||
├── synapse.proto # 主 proto 文件,包含所有服务与消息定义
|
||
├── synapse_common.proto # 公共消息类型(可选拆分)
|
||
├── google/
|
||
│ └── api/
|
||
│ ├── annotations.proto # Google HTTP 注解依赖
|
||
│ └── http.proto
|
||
└── protoc-gen-openapiv2/
|
||
└── options/
|
||
└── annotations.proto # OpenAPI v2 注解依赖(可选)
|
||
```
|
||
|
||
主定义文件 [`synapse.proto`](file:///proto/synapse.proto) 包含:
|
||
|
||
- 5 个 gRPC 服务(TaskService、SynapseMessageService、CapabilitiesService、GroupService、HealthService)
|
||
- 20 个 RPC 方法
|
||
- 对应的请求/响应消息类型
|
||
- `google.api.http` 注解,用于通过 gRPC Gateway 生成 HTTP REST 端点
|
||
|
||
通过 `buf` 或 `protoc` 工具链编译生成:
|
||
|
||
| 生成产物 | 说明 |
|
||
|---------|------|
|
||
| `synapse.pb.go` | gRPC 服务端/客户端桩代码 |
|
||
| `synapse.pb.gw.go` | gRPC Gateway 反向代理代码 |
|
||
| `synapse.swagger.json` | OpenAPI v2 规范文档(可选) |
|
||
|
||
---
|
||
|
||
## 2. 服务定义
|
||
|
||
### 2.1 TaskService(任务服务)
|
||
|
||
任务服务是协议核心,负责任务的提交、查询、取消与状态流式推送。
|
||
|
||
```protobuf
|
||
service TaskService {
|
||
// 提交任务(JSON payload)
|
||
rpc SubmitTask(SubmitTaskRequest) returns (SubmitTaskResponse);
|
||
|
||
// 提交任务(含文件附件,Multipart)
|
||
rpc SubmitTaskWithFiles(SubmitTaskWithFilesRequest) returns (SubmitTaskResponse);
|
||
|
||
// 获取任务完整信息
|
||
rpc GetTask(GetTaskRequest) returns (TaskStatusResponse);
|
||
|
||
// 获取任务状态(轻量查询)
|
||
rpc GetTaskStatus(GetTaskRequest) returns (TaskStatusResponse);
|
||
|
||
// 获取任务列表(支持分页和过滤)
|
||
rpc ListTasks(ListTasksRequest) returns (ListTasksResponse);
|
||
|
||
// 取消任务
|
||
rpc CancelTask(CancelTaskRequest) returns (CancelTaskResponse);
|
||
|
||
// 流式监听任务状态变化(双向流)
|
||
rpc StreamTaskStatus(stream TaskStatusStreamRequest) returns (stream TaskStatusUpdate);
|
||
}
|
||
```
|
||
|
||
**RPC 方法列表:**
|
||
|
||
| # | 方法名 | 请求类型 | 响应类型 | 流式 |
|
||
|---|--------|---------|---------|------|
|
||
| 1 | `SubmitTask` | `SubmitTaskRequest` | `SubmitTaskResponse` | 否 |
|
||
| 2 | `SubmitTaskWithFiles` | `SubmitTaskWithFilesRequest` | `SubmitTaskResponse` | 否 |
|
||
| 3 | `GetTask` | `GetTaskRequest` | `TaskStatusResponse` | 否 |
|
||
| 4 | `GetTaskStatus` | `GetTaskRequest` | `TaskStatusResponse` | 否 |
|
||
| 5 | `ListTasks` | `ListTasksRequest` | `ListTasksResponse` | 否 |
|
||
| 6 | `CancelTask` | `CancelTaskRequest` | `CancelTaskResponse` | 否 |
|
||
| 7 | `StreamTaskStatus` | `stream TaskStatusStreamRequest` | `stream TaskStatusUpdate` | 双向流 |
|
||
|
||
### 2.2 SynapseMessageService(消息服务)
|
||
|
||
消息服务负责 Agent 间的异步消息传递、流式对话以及回调推送。
|
||
|
||
```protobuf
|
||
service SynapseMessageService {
|
||
// 发送单条消息
|
||
rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
|
||
|
||
// 流式消息交换(双向流,适用于多轮对话)
|
||
rpc StreamMessages(stream SynapseMessage) returns (stream SynapseMessage);
|
||
|
||
// 接收服务端推送的回调消息(服务器推送流)
|
||
rpc ReceiveCallback(google.protobuf.Empty) returns (stream SynapseMessage);
|
||
}
|
||
```
|
||
|
||
**RPC 方法列表:**
|
||
|
||
| # | 方法名 | 请求类型 | 响应类型 | 流式 |
|
||
|---|--------|---------|---------|------|
|
||
| 8 | `SendMessage` | `SendMessageRequest` | `SendMessageResponse` | 否 |
|
||
| 9 | `StreamMessages` | `stream SynapseMessage` | `stream SynapseMessage` | 双向流 |
|
||
| 10 | `ReceiveCallback` | `google.protobuf.Empty` | `stream SynapseMessage` | 服务端流 |
|
||
|
||
### 2.3 CapabilitiesService(能力服务)
|
||
|
||
能力服务提供 Agent 能力查询与发现机制。
|
||
|
||
```protobuf
|
||
service CapabilitiesService {
|
||
// 获取当前 Agent 自身的能力声明
|
||
rpc GetCapabilities(google.protobuf.Empty) returns (CapabilitiesResponse);
|
||
|
||
// 查询指定 Agent 的能力
|
||
rpc QueryAgent(QueryAgentRequest) returns (CapabilitiesResponse);
|
||
|
||
// 列出网络中所有活跃 Agent
|
||
rpc ListAgents(google.protobuf.Empty) returns (ListAgentsResponse);
|
||
}
|
||
```
|
||
|
||
**RPC 方法列表:**
|
||
|
||
| # | 方法名 | 请求类型 | 响应类型 | 流式 |
|
||
|---|--------|---------|---------|------|
|
||
| 11 | `GetCapabilities` | `google.protobuf.Empty` | `CapabilitiesResponse` | 否 |
|
||
| 12 | `QueryAgent` | `QueryAgentRequest` | `CapabilitiesResponse` | 否 |
|
||
| 13 | `ListAgents` | `google.protobuf.Empty` | `ListAgentsResponse` | 否 |
|
||
|
||
### 2.4 GroupService(群组服务)
|
||
|
||
群组服务支持 Agent 群的创建、成员管理与群内消息流。
|
||
|
||
```protobuf
|
||
service GroupService {
|
||
// 创建群组
|
||
rpc CreateGroup(CreateGroupRequest) returns (CreateGroupResponse);
|
||
|
||
// 加入群组
|
||
rpc JoinGroup(JoinGroupRequest) returns (JoinGroupResponse);
|
||
|
||
// 离开群组
|
||
rpc LeaveGroup(LeaveGroupRequest) returns (LeaveGroupResponse);
|
||
|
||
// 解散群组(仅群主/管理员)
|
||
rpc DisbandGroup(DisbandGroupRequest) returns (DisbandGroupResponse);
|
||
|
||
// 列出群组成员
|
||
rpc ListGroupMembers(ListGroupMembersRequest) returns (ListGroupMembersResponse);
|
||
|
||
// 流式收发群组消息(双向流)
|
||
rpc StreamGroupMessages(stream SynapseMessage) returns (stream SynapseMessage);
|
||
}
|
||
```
|
||
|
||
**RPC 方法列表:**
|
||
|
||
| # | 方法名 | 请求类型 | 响应类型 | 流式 |
|
||
|---|--------|---------|---------|------|
|
||
| 14 | `CreateGroup` | `CreateGroupRequest` | `CreateGroupResponse` | 否 |
|
||
| 15 | `JoinGroup` | `JoinGroupRequest` | `JoinGroupResponse` | 否 |
|
||
| 16 | `LeaveGroup` | `LeaveGroupRequest` | `LeaveGroupResponse` | 否 |
|
||
| 17 | `DisbandGroup` | `DisbandGroupRequest` | `DisbandGroupResponse` | 否 |
|
||
| 18 | `ListGroupMembers` | `ListGroupMembersRequest` | `ListGroupMembersResponse` | 否 |
|
||
| 19 | `StreamGroupMessages` | `stream SynapseMessage` | `stream SynapseMessage` | 双向流 |
|
||
|
||
### 2.5 HealthService(健康服务)
|
||
|
||
健康服务提供存活探针与健康状态检查。
|
||
|
||
```protobuf
|
||
service HealthService {
|
||
// 健康检查
|
||
rpc HealthCheck(google.protobuf.Empty) returns (HealthCheckResponse);
|
||
}
|
||
```
|
||
|
||
**RPC 方法列表:**
|
||
|
||
| # | 方法名 | 请求类型 | 响应类型 | 流式 |
|
||
|---|--------|---------|---------|------|
|
||
| 20 | `HealthCheck` | `google.protobuf.Empty` | `HealthCheckResponse` | 否 |
|
||
|
||
---
|
||
|
||
## 3. HTTP 路由映射表
|
||
|
||
通过 `google.api.http` 注解,每个 gRPC 方法映射为对应的 HTTP REST 端点。gRPC Gateway 在启动时读取这些注解,自动生成反向代理,使同一套后端可同时服务于 gRPC 和 HTTP 客户端。
|
||
|
||
### 3.1 完整映射表
|
||
|
||
| # | gRPC 方法 | HTTP 方法 | HTTP 路径 | 说明 |
|
||
|---|-----------|----------|----------|------|
|
||
| 1 | `SubmitTask` | `POST` | `/api/v1/synapse/task` | 提交任务 |
|
||
| 2 | `SubmitTaskWithFiles` | `POST` | `/api/v1/synapse/task/multipart` | 提交含附件的任务 |
|
||
| 3 | `GetTask` | `GET` | `/api/v1/synapse/task/{task_id}` | 获取任务详情 |
|
||
| 4 | `GetTaskStatus` | `GET` | `/api/v1/synapse/task/{task_id}/status` | 获取任务状态 |
|
||
| 5 | `ListTasks` | `GET` | `/api/v1/synapse/tasks` | 列出任务(支持分页) |
|
||
| 6 | `CancelTask` | `POST` | `/api/v1/synapse/task/{task_id}/cancel` | 取消任务 |
|
||
| 7 | `StreamTaskStatus` | `GET` | `/api/v1/synapse/task/{task_id}/stream` | SSE 流式监听任务状态 |
|
||
| 8 | `SendMessage` | `POST` | `/api/v1/synapse/message` | 发送消息 |
|
||
| 9 | `StreamMessages` | `GET` | `/api/v1/synapse/messages/stream` | WebSocket/SSE 流式消息交换 |
|
||
| 10 | `ReceiveCallback` | `GET` | `/api/v1/synapse/messages/callback` | SSE 接收服务端回调推送 |
|
||
| 11 | `GetCapabilities` | `GET` | `/api/v1/synapse/capabilities` | 获取自身能力声明 |
|
||
| 12 | `QueryAgent` | `GET` | `/api/v1/synapse/agents/{agent_id}` | 查询指定 Agent 能力 |
|
||
| 13 | `ListAgents` | `GET` | `/api/v1/synapse/agents` | 列出所有活跃 Agent |
|
||
| 14 | `CreateGroup` | `POST` | `/api/v1/synapse/group` | 创建群组 |
|
||
| 15 | `JoinGroup` | `POST` | `/api/v1/synapse/group/{group_id}/join` | 加入群组 |
|
||
| 16 | `LeaveGroup` | `POST` | `/api/v1/synapse/group/{group_id}/leave` | 离开群组 |
|
||
| 17 | `DisbandGroup` | `POST` | `/api/v1/synapse/group/{group_id}/disband` | 解散群组 |
|
||
| 18 | `ListGroupMembers` | `GET` | `/api/v1/synapse/group/{group_id}/members` | 列出群组成员 |
|
||
| 19 | `StreamGroupMessages` | `GET` | `/api/v1/synapse/group/{group_id}/messages/stream` | WebSocket/SSE 流式群组消息 |
|
||
| 20 | `HealthCheck` | `GET` | `/api/v1/synapse/health` | 健康检查 |
|
||
|
||
### 3.2 路由特性说明
|
||
|
||
**路径参数绑定**:
|
||
|
||
| 路径参数 | 绑定字段 | 示例值 |
|
||
|---------|---------|-------|
|
||
| `{task_id}` | `GetTaskRequest.task_id` | `"task-abc123"` |
|
||
| `{agent_id}` | `QueryAgentRequest.agent_id` | `"agent-xyz789"` |
|
||
| `{group_id}` | `JoinGroupRequest.group_id` | `"group-demo-001"` |
|
||
|
||
**请求体映射规则**:
|
||
|
||
- **POST 请求**:除路径参数外,剩余字段映射为 HTTP 请求体(JSON)
|
||
- **GET 请求**:非路径参数字段映射为 URL 查询参数(query string)
|
||
|
||
**流式端点说明**:
|
||
|
||
| 流式 RPC | HTTP 协议映射 | 说明 |
|
||
|---------|-------------|------|
|
||
| `StreamTaskStatus` | SSE(Server-Sent Events) | 服务端单向推送任务状态变更 |
|
||
| `StreamMessages` | WebSocket | 全双工流式消息交换 |
|
||
| `ReceiveCallback` | SSE(Server-Sent Events) | 服务端单向推送回调消息 |
|
||
| `StreamGroupMessages` | WebSocket | 全双工群组消息流 |
|
||
|
||
对于双向流 RPC(`StreamMessages`、`StreamGroupMessages`),HTTP REST 映射通过 WebSocket Upgrade 实现;对于服务端流 RPC(`StreamTaskStatus`、`ReceiveCallback`),通过 SSE(`text/event-stream`)实现。
|
||
|
||
### 3.3 路由前缀约定
|
||
|
||
所有 Synapse 协议 REST API 遵循以下 URL 前缀约定:
|
||
|
||
```
|
||
/api/v1/synapse/
|
||
```
|
||
|
||
- `api`:标识为 API 请求
|
||
- `v1`:API 版本号
|
||
- `synapse`:命名空间,区分 Synapse 协议与其他业务 API
|
||
|
||
版本升级时(如 v1 → v2),路径前缀同步更新为 `/api/v2/synapse/`,新旧版本可并行部署。
|
||
|
||
### 3.4 HTTP 状态码与 gRPC 状态码映射
|
||
|
||
| HTTP 状态码 | gRPC 状态码 | 说明 |
|
||
|------------|-------------|------|
|
||
| `200 OK` | `OK` | 请求成功 |
|
||
| `201 Created` | `OK` | 资源创建成功(SubmitTask、CreateGroup) |
|
||
| `400 Bad Request` | `InvalidArgument` | 请求参数无效 |
|
||
| `401 Unauthorized` | `Unauthenticated` | 认证失败 |
|
||
| `403 Forbidden` | `PermissionDenied` | 权限不足 |
|
||
| `404 Not Found` | `NotFound` | 资源不存在 |
|
||
| `409 Conflict` | `AlreadyExists` / `Aborted` | 资源冲突 |
|
||
| `429 Too Many Requests` | `ResourceExhausted` | 限流触发 |
|
||
| `500 Internal Server Error` | `Internal` | 服务端内部错误 |
|
||
| `503 Service Unavailable` | `Unavailable` | 服务不可用 |
|
||
|
||
gRPC Gateway 自动完成上述状态码转换,客户端无需额外处理。
|
||
|
||
---
|
||
|
||
## 4. 协议缓冲区消息结构概览
|
||
|
||
以下列出各服务核心 RPC 的请求与响应消息结构(仅示意字段分类,完整定义以 `.proto` 文件为准):
|
||
|
||
### 4.1 任务相关消息
|
||
|
||
```protobuf
|
||
// SubmitTask 请求
|
||
message SubmitTaskRequest {
|
||
string task_type = 1; // 任务类型
|
||
string payload_json = 2; // JSON 负载
|
||
string callback_url = 3; // 回调地址(可选)
|
||
int32 ttl_seconds = 4; // 任务 TTL(可选)
|
||
string idempotency_key = 5; // 幂等键(可选)
|
||
}
|
||
|
||
// SubmitTask 响应
|
||
message SubmitTaskResponse {
|
||
string task_id = 1; // 任务 ID
|
||
string status = 2; // 初始状态
|
||
string message = 3; // 附加信息
|
||
}
|
||
|
||
// 任务状态查询响应(通用)
|
||
message TaskStatusResponse {
|
||
string task_id = 1;
|
||
string status = 2;
|
||
int32 progress = 3; // 0-100
|
||
string result_json = 4; // 执行结果(JSON)
|
||
string error_message = 5;
|
||
string created_at = 6;
|
||
string updated_at = 7;
|
||
string etag = 8; // 用于增量查询
|
||
}
|
||
|
||
// 任务流式更新
|
||
message TaskStatusUpdate {
|
||
string task_id = 1;
|
||
string event_type = 2; // status_update / progress / log / error / complete
|
||
string data_json = 3;
|
||
}
|
||
```
|
||
|
||
### 4.2 消息相关消息
|
||
|
||
```protobuf
|
||
// SendMessage 请求
|
||
message SendMessageRequest {
|
||
string receiver_id = 1;
|
||
string content_type = 2; // text / json / code / file
|
||
string payload_json = 3;
|
||
string correlation_id = 4; // 关联 ID(可选)
|
||
string conversation_id = 5; // 会话 ID(可选)
|
||
}
|
||
|
||
// SendMessage 响应
|
||
message SendMessageResponse {
|
||
string message_id = 1;
|
||
string status = 2;
|
||
}
|
||
|
||
// 统一消息信封(用于流式传输)
|
||
message SynapseMessage {
|
||
string id = 1;
|
||
string sender_id = 2;
|
||
string receiver_id = 3;
|
||
string content_type = 4;
|
||
string payload_json = 5;
|
||
string correlation_id = 6;
|
||
string conversation_id = 7;
|
||
int64 timestamp = 8;
|
||
}
|
||
```
|
||
|
||
### 4.3 能力相关消息
|
||
|
||
```protobuf
|
||
message CapabilitiesResponse {
|
||
string agent_id = 1;
|
||
string agent_name = 2;
|
||
string protocol_version = 3;
|
||
repeated string supported_task_types = 4;
|
||
repeated string supported_content_types = 5;
|
||
int64 max_file_size = 6;
|
||
int32 max_concurrent_tasks = 7;
|
||
bool support_streaming = 8;
|
||
bool support_hil = 9;
|
||
bool support_groups = 10;
|
||
}
|
||
|
||
message QueryAgentRequest {
|
||
string agent_id = 1;
|
||
}
|
||
|
||
message ListAgentsResponse {
|
||
repeated AgentInfo agents = 1;
|
||
int32 total = 2;
|
||
}
|
||
|
||
message AgentInfo {
|
||
string agent_id = 1;
|
||
string agent_name = 2;
|
||
string endpoint = 3;
|
||
repeated string capabilities = 4;
|
||
string status = 5; // online / offline / busy
|
||
}
|
||
```
|
||
|
||
### 4.4 群组相关消息
|
||
|
||
```protobuf
|
||
message CreateGroupRequest {
|
||
string name = 1;
|
||
string description = 2;
|
||
repeated string initial_members = 3;
|
||
}
|
||
|
||
message CreateGroupResponse {
|
||
string group_id = 1;
|
||
string status = 2;
|
||
}
|
||
|
||
message JoinGroupRequest {
|
||
string group_id = 1;
|
||
string agent_id = 2;
|
||
}
|
||
|
||
message LeaveGroupRequest {
|
||
string group_id = 1;
|
||
string agent_id = 2;
|
||
}
|
||
|
||
message DisbandGroupRequest {
|
||
string group_id = 1;
|
||
string agent_id = 2; // 需群主或管理员权限
|
||
}
|
||
|
||
message ListGroupMembersRequest {
|
||
string group_id = 1;
|
||
}
|
||
|
||
message ListGroupMembersResponse {
|
||
string group_id = 1;
|
||
repeated GroupMember members = 2;
|
||
}
|
||
|
||
message GroupMember {
|
||
string agent_id = 1;
|
||
string role = 2; // owner / admin / member
|
||
string joined_at = 3;
|
||
}
|
||
```
|
||
|
||
### 4.5 健康检查消息
|
||
|
||
```protobuf
|
||
message HealthCheckResponse {
|
||
string status = 1; // SERVING / NOT_SERVING
|
||
string version = 2;
|
||
int64 uptime_seconds = 3;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 传输配置与使用指引
|
||
|
||
### 5.1 gRPC 客户端连接配置
|
||
|
||
```go
|
||
// 推荐 gRPC 客户端配置
|
||
conn, err := grpc.Dial(
|
||
target,
|
||
grpc.WithInsecure(), // 开发环境;生产环境使用 TLS
|
||
grpc.WithDefaultCallOptions(
|
||
grpc.MaxCallRecvMsgSize(10*1024*1024), // 最大接收消息 10MB
|
||
grpc.MaxCallSendMsgSize(10*1024*1024), // 最大发送消息 10MB
|
||
),
|
||
grpc.WithKeepaliveParams(keepalive.ClientParameters{
|
||
Time: 30 * time.Second, // 每 30s 发送心跳
|
||
Timeout: 10 * time.Second, // 心跳超时 10s
|
||
PermitWithoutStream: true, // 无活跃流时也发送心跳
|
||
}),
|
||
)
|
||
```
|
||
|
||
### 5.2 HTTP REST 客户端调用示例
|
||
|
||
```bash
|
||
# SubmitTask
|
||
curl -X POST http://localhost:8080/api/v1/synapse/task \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"task_type":"text_generation","payload_json":"...","callback_url":"..."}'
|
||
|
||
# GetTask
|
||
curl http://localhost:8080/api/v1/synapse/task/task-abc123
|
||
|
||
# 流式监听任务状态(SSE)
|
||
curl -N http://localhost:8080/api/v1/synapse/task/task-abc123/stream
|
||
|
||
# HealthCheck
|
||
curl http://localhost:8080/api/v1/synapse/health
|
||
```
|
||
|
||
### 5.3 幂等性支持
|
||
|
||
对于 `SubmitTask` 和 `CreateGroup` 等写操作,建议通过 `idempotency_key` 字段实现幂等:
|
||
|
||
- 客户端为每个写操作生成唯一幂等键(如 UUID v4)
|
||
- 服务端缓存幂等键及其响应,相同键的重复请求返回缓存结果
|
||
- 幂等键缓存 TTL 默认为 24 小时
|
||
|
||
---
|
||
|
||
## 附录:gRPC Gateway 集成方式
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ 外部客户端 │
|
||
│ gRPC Client HTTP Client (REST) │
|
||
└────────┬───────────────────────────────┬────────────┘
|
||
│ gRPC (h2) │ HTTP/1.1
|
||
▼ ▼
|
||
┌─────────────────┐ ┌──────────────────────┐
|
||
│ gRPC Server │ │ gRPC Gateway │
|
||
│ (直接服务) │◄────────►│ (反向代理 / 协议转换) │
|
||
└────────┬────────┘ └──────────────────────┘
|
||
│ 内部 gRPC 调用
|
||
▼
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ Synapse 业务逻辑层 │
|
||
│ TaskService / MessageService / Capabilities ... │
|
||
└─────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
推荐集成方式:
|
||
|
||
1. 在 Go 服务端使用 `grpc-gateway` 库,通过一行代码注册反向代理
|
||
2. 启动时同时监听两个端口(例:gRPC 端口 `9090`,HTTP 端口 `8080`)
|
||
3. HTTP 端口同时提供 REST API 和 Swagger UI(开发环境)
|
||
|
||
---
|
||
|
||
**文档结束**
|