Files
synapse/docs/02-guide/transport-modes.md
2026-06-29 02:12:44 +08:00

17 KiB
Raw Permalink Blame History

灵隙协议实现规范:传输模式定义

版本:1.0.0 | 层级:实现层


1. 传输模式枚举

传输模式(TransportMode)定义了任务通信的传输方式。Synapse 协议支持四种传输模式,适配不同的网络环境和业务场景。

1.1 模式定义

// TransportMode 定义任务通信的传输模式
type TransportMode string

const (
	// TransportModeCallback - 异步回调模式
	// 任务完成后通过 Webhook 回调通知结果
	TransportModeCallback TransportMode = "callback"

	// TransportModePolling - 异步轮询模式
	// 调用方主动轮询获取任务状态和结果
	TransportModePolling TransportMode = "polling"

	// TransportModeSync - 同步模式
	// 调用方阻塞等待任务完成,直接返回结果
	TransportModeSync TransportMode = "sync"

	// TransportModeHybrid - 混合模式
	// 优先使用回调,回调失败时启用轮询作为兜底
	TransportModeHybrid TransportMode = "hybrid"
)

1.2 模式对比

模式 枚举值 通信方向 实时性 适用场景
回调(Callback) callback 服务端 → 调用方 高 网络可达、期望实时通知
轮询(Polling) polling 调用方 → 服务端 中 调用方主动拉取、服务端不主动推送
同步(Sync) sync 双向阻塞 最高 短耗时任务、需要即时响应
混合(Hybrid) hybrid 双向 + 兜底 高 生产环境、容错要求高的场景

1.3 模式选择建议

条件 推荐模式
任务耗时 < 5s sync — 直接同步等待
任务耗时 5s~5min,回调端点可达 callback — 异步回调
任务耗时 5s~5min,回调端点不可达 polling — 轮询拉取
生产环境,需要高可靠性 hybrid — 回调 + 轮询兜底
任务耗时 > 5min polling 或 hybrid — 长时间异步

2. 传输偏好配置

2.1 传输偏好结构

// TransportPreferences 定义任务的传输偏好配置
type TransportPreferences struct {
	// Preferred  - 首选传输模式
	Preferred TransportMode `json:"preferred"`

	// Fallback   - 兜底传输模式,当首选模式不可用时使用
	Fallback TransportMode `json:"fallback,omitempty"`

	// CallbackEndpoint - 回调端点 URL
	// 仅当 Preferred 或 Fallback 为 callback/hybrid 时生效
	CallbackEndpoint string `json:"callback_endpoint,omitempty"`

	// PollingInterval - 轮询间隔(秒)
	// 仅当 Preferred 或 Fallback 为 polling/hybrid 时生效
	PollingInterval int `json:"polling_interval,omitempty"`

	// ProgressUpdates - 是否接收进度更新
	// 为 true 时,服务端会在任务执行过程中推送进度事件
	ProgressUpdates bool `json:"progress_updates"`

	// ProgressInterval - 进度更新最小间隔(秒)
	// 控制进度通知的频率,避免频繁推送
	ProgressInterval int `json:"progress_interval,omitempty"`
}

2.2 字段说明

字段 类型 必需 默认值 说明
preferred TransportMode 是 callback 首选传输模式
fallback TransportMode 否 polling 兜底模式,首选不可用时回退
callback_endpoint string 条件必填 "" 回调 URL,callback/hybrid 模式必需
polling_interval int 否 5 轮询间隔(秒),最小 1
progress_updates bool 否 true 是否启用进度推送
progress_interval int 否 10 进度更新间隔(秒)

2.3 默认配置

// DefaultTransportPreferences 返回默认传输偏好配置
//
// 默认值说明:
//   - 首选回调模式(callback),兜底轮询(polling)
//   - 轮询间隔 5 秒
//   - 启用进度更新,最小间隔 10 秒
func DefaultTransportPreferences() *TransportPreferences {
	return &TransportPreferences{
		Preferred:        TransportModeCallback,
		Fallback:         TransportModePolling,
		PollingInterval:  5,
		ProgressUpdates:  true,
		ProgressInterval: 10,
	}
}

2.4 配置示例

纯回调模式:

prefs := &TransportPreferences{
	Preferred:        TransportModeCallback,
	CallbackEndpoint: "https://my-service.com/callback",
	ProgressUpdates:  true,
	ProgressInterval: 5,
}

纯轮询模式:

prefs := &TransportPreferences{
	Preferred:       TransportModePolling,
	PollingInterval: 3,
	ProgressUpdates: false,
}

混合模式(生产推荐):

prefs := &TransportPreferences{
	Preferred:        TransportModeCallback,
	Fallback:         TransportModePolling,
	CallbackEndpoint: "https://my-service.com/callback",
	PollingInterval:  5,
	ProgressUpdates:  true,
	ProgressInterval: 10,
}

同步模式:

prefs := &TransportPreferences{
	Preferred: TransportModeSync,
}

3. 轮询 API 类型

轮询 API 为调用方提供主动拉取任务状态的能力。所有 Agent 端必须实现以下类型以支持轮询传输模式。

3.1 任务状态响应

// TaskStatusResponse 任务状态轮询响应
//
// 调用方通过此结构获取单个任务的当前状态。
// 成功时 Success 为 true,Task 字段包含任务详情;
// 失败时 Success 为 false,Error 字段包含错误信息。
type TaskStatusResponse struct {
	Success bool          `json:"success"`
	Task    *TaskInfo     `json:"task,omitempty"`
	Error   *SynapseError `json:"error,omitempty"`
}

3.2 任务信息

// TaskInfo 任务详细信息
//
// 描述一个异步任务的完整状态,包括进度、结果和
// 错误信息。ETag 字段用于增量查询,避免重复传输
// 未变更的数据。
type TaskInfo struct {
	// ID - 任务唯一标识
	ID string `json:"id"`

	// Type - 任务类型,如 "text_generation", "image_analysis"
	Type string `json:"type"`

	// Status - 任务状态
	// 可选值: pending, running, completed, failed, cancelled
	Status string `json:"status"`

	// Progress - 任务进度百分比(0-100)
	Progress int `json:"progress"`

	// Message - 当前状态的人类可读描述
	Message string `json:"message,omitempty"`

	// CreatedAt - 任务创建时间
	CreatedAt Timestamp `json:"created_at"`

	// UpdatedAt - 任务最后更新时间
	UpdatedAt Timestamp `json:"updated_at"`

	// ETA - 预计完成时间(可选)
	ETA *Timestamp `json:"eta,omitempty"`

	// Result - 任务执行结果
	// 当 Status 为 completed 时此字段有效
	Result any `json:"result,omitempty"`

	// Error - 任务执行错误
	// 当 Status 为 failed 时此字段有效
	Error *SynapseError `json:"error,omitempty"`

	// ETag - 实体标签,用于增量查询和缓存
	// 客户端可在后续请求中携带此值以获取变更数据
	ETag string `json:"etag,omitempty"`
}

3.3 任务状态枚举

状态值 说明 可转换至
pending 任务已提交,等待执行 running
running 任务正在执行中 completed, failed, cancelled
completed 任务执行成功,Result 可用 —(终态)
failed 任务执行失败,Error 可用 —(终态)
cancelled 任务已被取消 —(终态)

3.4 任务列表响应

// TaskListResponse 任务列表响应
//
// 支持分页查询,调用方可使用 Limit 和 Offset
// 参数控制返回结果的数量和偏移量。
type TaskListResponse struct {
	Success bool       `json:"success"`
	Tasks   []TaskInfo `json:"tasks"`
	Total   int        `json:"total"`
	Limit   int        `json:"limit"`
	Offset  int        `json:"offset"`
	HasMore bool       `json:"has_more"`
}

分页参数说明:

字段 类型 说明
total int 符合条件的任务总数
limit int 本次请求的限制数量
offset int 本次请求的偏移量
has_more bool 是否还有更多数据

3.5 任务事件

// TaskEvent 任务事件
//
// 表示任务执行过程中产生的事件,用于事件流推送
// 和增量状态更新。
type TaskEvent struct {
	// ID - 事件唯一标识
	ID string `json:"id"`

	// Type - 事件类型
	// 可选值: status_update, progress, log, error, complete
	Type string `json:"type"`

	// Timestamp - 事件发生时间
	Timestamp Timestamp `json:"timestamp"`

	// Data - 事件数据
	// 不同类型的事件携带不同的数据结构
	Data any `json:"data"`
}

3.6 事件类型说明

事件类型 触发时机 Data 内容
status_update 任务状态变更 包含新状态和状态变更原因
progress 进度更新 包含当前进度值(0-100)和描述
log 任务产生日志输出 日志文本内容
error 任务执行出错 错误代码和错误消息
complete 任务完成 任务执行结果

3.7 任务事件流响应

// TaskEventsResponse 任务事件流响应
//
// 支持基于游标的分页,调用方可使用 Next 游标
// 持续拉取后续事件。
type TaskEventsResponse struct {
	Success bool        `json:"success"`
	Since   string      `json:"since"`
	Events  []TaskEvent `json:"events"`
	HasMore bool        `json:"has_more"`
	Next    string      `json:"next_cursor,omitempty"`
}

游标使用流程:

  1. 首次请求不带 since 参数,获取当前所有事件
  2. 响应中返回 next_cursor 作为下一页游标
  3. 后续请求携带 since=next_cursor 获取后续事件
  4. 当 has_more 为 false 时,表示已无新事件

3.8 轮询 API 端点约定

端点 方法 请求参数 响应类型 说明
/v1/tasks/{taskID} GET — TaskStatusResponse 查询单个任务状态
/v1/tasks GET limit, offset, status TaskListResponse 查询任务列表
/v1/tasks/{taskID}/events GET since TaskEventsResponse 查询任务事件流

4. 流式传输类型

流式传输用于实时传输大文件或持续生成的数据,如音频流、视频流、长文本生成等场景。

4.1 流数据块

// StreamChunk 流式传输数据块
//
// 每次传输一个数据块,Sequence 字段保证数据块
// 的顺序。当 Final 为 true 时,表示流传输结束,
// 客户端可开始组装完整数据。
type StreamChunk struct {
	// TaskID - 任务 ID,标识所属任务
	TaskID string `json:"task_id"`

	// Sequence - 块序列号,从 1 开始递增
	// 用于客户端排序和校验丢包
	Sequence int64 `json:"sequence"`

	// ChunkType - 数据块类型
	// 可选值: text, binary, audio, video
	ChunkType string `json:"chunk_type"`

	// Data - 数据块内容
	// 二进制数据使用 base64 编码传输
	Data string `json:"data"`

	// Final - 是否为最后一个数据块
	// 为 true 时表示流传输结束
	Final bool `json:"final"`

	// Timestamp - 数据块时间戳
	Timestamp Timestamp `json:"timestamp"`
}

4.2 数据块类型说明

ChunkType 说明 Data 编码 适用场景
text 文本数据 UTF-8 字符串 流式文本生成、日志输出
binary 二进制数据 Base64 文件传输、二进制协议数据
audio 音频数据 Base64 实时语音、音频流处理
video 视频数据 Base64 实时视频、视频流处理

4.3 流完成通知

// StreamComplete 流传输完成通知
//
// 当所有数据块传输完毕后发送,包含完整数据的
// 校验和,供客户端验证数据完整性。
type StreamComplete struct {
	// TaskID - 任务 ID
	TaskID string `json:"task_id"`

	// TotalChunks - 总数据块数
	// 客户端可据此验证是否收到所有数据块
	TotalChunks int64 `json:"total_chunks"`

	// FullContentChecksum - 完整数据校验和
	// 格式: "sha256:<hex>",用于完整性校验
	FullContentChecksum string `json:"full_content_checksum"`

	// Result - 任务执行结果(可选)
	// 流传输完成后携带的最终结果
	Result any `json:"result,omitempty"`
}

4.4 流式传输生命周期

调用方                         服务端
  |                              |
  |-- POST /v1/tasks/submit --->|
  |     (TransportMode: sync)    | 启动异步任务
  |                              |
  |<--- StreamChunk{seq:1} -----| 数据块 1
  |<--- StreamChunk{seq:2} -----| 数据块 2
  |<--- StreamChunk{seq:3} -----| 数据块 3
  |<--- StreamChunk{seq:4} -----| 数据块 4(Final=true)
  |<--- StreamComplete ---------| 完成通知
  |                              |

客户端收到 StreamComplete 后:
  1. 确认 TotalChunks == 实际收到的块数
  2. 计算完整数据的 SHA256 校验和
  3. 对比 FullContentChecksum 验证完整性
  4. 读取 Result 获取任务执行结果

4.5 校验和验证

// ValidateStreamChecksum 验证流式传输数据的完整性
//
// 客户端在收到 StreamComplete 后应调用此函数
// 验证收到的数据是否完整。
func ValidateStreamChecksum(receivedChecksum, computedChecksum string) bool {
	return receivedChecksum == computedChecksum
}

4.6 传输模式与流式传输的组合规则

传输模式 是否支持流式 说明
callback 否 回调模式仅通知结果,不承载流数据
polling 否 轮询模式通过分块获取,非实时流
sync 是 同步模式下可实时流式返回数据
hybrid 是(回调阶段) 混合模式中回调路径支持流式

5. 传输模式交互流程

5.1 回调模式(Callback)

调用方                          Agent
  |                              |
  |--- SubmitTask ------------>| 提交任务
  |   (callback_endpoint: URL)  |
  |                              | Agent 处理任务
  |                              |---> HTTP POST --->| 调用方回调端点
  |         (异步回调)          |<--- 200 OK -------| 回调响应
  |                              |
  |         [处理完成]           |

5.2 轮询模式(Polling)

调用方                          Agent
  |                              |
  |--- SubmitTask ------------>| 提交任务
  |                              |
  |--- GET /v1/tasks/{id} ---->| 轮询状态(间隔 5s)
  |<--- TaskInfo(status=running)|
  |--- GET /v1/tasks/{id} ---->|
  |<--- TaskInfo(status=running)|
  |--- GET /v1/tasks/{id} ---->|
  |<--- TaskInfo(status=completed, result=...)
  |                              |

5.3 同步模式(Sync)

调用方                          Agent
  |                              |
  |--- SubmitTask + Sync ----->| 提交任务
  |                              | Agent 立即处理
  |<-- Result (同步返回) -------| 直接返回结果
  |                              |

5.4 混合模式(Hybrid)

调用方                          Agent
  |                              |
  |--- SubmitTask ------------>| 提交任务
  |   (preferred: callback,     |
  |    fallback: polling)       |
  |                              | Agent 处理任务
  |                              |
  |         [回调成功]           |
  |<-- AsyncCallback -----------| 回调通知结果
  |                              |
  |         [回调失败]           |
  |--- GET /v1/tasks/{id} ---->| 轮询兜底
  |<-- TaskInfo(result=...) ----| 获取结果
  |                              |

6. 错误处理

6.1 SynapseError 结构

// SynapseError 协议错误信息
type SynapseError struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

6.2 传输模式相关错误码

错误码 名称 说明
4001 CALLBACK_FAILED 回调端点不可达或返回非 2xx
4002 POLLING_TIMEOUT 轮询超时,任务未在预期时间内完成
4003 INVALID_CALLBACK_ENDPOINT 回调端点 URL 格式无效
4004 MODE_NOT_SUPPORTED Agent 不支持请求的传输模式
4005 STREAM_SEQUENCE_GAP 流式传输出现序列号跳变

附录:Go 类型汇总

// 传输模式枚举
type TransportMode string
const (
    TransportModeCallback TransportMode = "callback"
    TransportModePolling  TransportMode = "polling"
    TransportModeSync     TransportMode = "sync"
    TransportModeHybrid   TransportMode = "hybrid"
)

// 传输偏好配置
type TransportPreferences struct {
    Preferred        TransportMode `json:"preferred"`
    Fallback         TransportMode `json:"fallback,omitempty"`
    CallbackEndpoint string        `json:"callback_endpoint,omitempty"`
    PollingInterval  int           `json:"polling_interval,omitempty"`
    ProgressUpdates  bool          `json:"progress_updates"`
    ProgressInterval int           `json:"progress_interval,omitempty"`
}

func DefaultTransportPreferences() *TransportPreferences { ... }

// 轮询 API 类型
type TaskStatusResponse struct { ... }
type TaskInfo struct { ... }
type TaskListResponse struct { ... }
type TaskEvent struct { ... }
type TaskEventsResponse struct { ... }

// 流式传输类型
type StreamChunk struct { ... }
type StreamComplete struct { ... }

本文档对应代码实现在 types/content.go 中。

参考源文档:06-implementation-details.md §8