Skip to content
广告 · 本站推荐广告

网关协议

Gateway 使用 WebSocket 作为主要通信协议。本文档定义了帧格式、消息类型和通信模式。

连接

WebSocket 端点:

text
ws://127.0.0.1:18789/ws     (本地)
wss://gateway.example.com/ws  (远程 TLS)

帧格式

所有 WebSocket 帧(Frame)使用 JSON 编码,包含以下公共字段:

json
{
  "type": "message-type",
  "id": "msg_unique_id",
  "timestamp": "2025-01-15T10:30:00Z",
  "payload": {}
}
字段类型必填说明
typestring消息类型标识
idstring消息唯一 ID
timestampstringISO 8601 时间戳
payloadobject消息负载

消息类型

连接管理

类型方向说明
connectClient → Gateway认证连接请求
hello-okGateway → Client认证成功
unauthorizedGateway → Client认证失败
ping双向心跳检测
pong双向心跳响应
disconnect双向优雅断开

会话管理

类型方向说明
session-createClient → Gateway创建新会话
session-createdGateway → Client会话创建成功
session-resumeClient → Gateway恢复已有会话
session-end双向结束会话

对话消息

类型方向说明
user-messageClient → Gateway用户消息
assistant-messageGateway → Client助手回复
assistant-deltaGateway → Client流式回复增量
message-completeGateway → Client回复完成

工具调用

类型方向说明
tool-callGateway → Client请求执行工具
tool-resultClient → Gateway工具执行结果
tool-approveClient → Gateway批准工具执行
tool-denyClient → Gateway拒绝工具执行

请求 / 响应模式

认证流程

json
// 1. Client → Gateway: connect
{
  "type": "connect",
  "id": "msg_001",
  "payload": {
    "token": "your-token",
    "clientId": "device_abc",
    "clientName": "MacBook Pro",
    "version": "1.0"
  }
}

// 2. Gateway → Client: hello-ok
{
  "type": "hello-ok",
  "id": "msg_002",
  "payload": {
    "sessionId": "sess_xyz",
    "gatewayVersion": "0.5.0",
    "capabilities": ["streaming", "tools"]
  }
}

对话流程

json
// 1. Client → Gateway: user-message
{
  "type": "user-message",
  "id": "msg_010",
  "payload": {
    "sessionId": "sess_xyz",
    "content": "请帮我写一个 Python 脚本",
    "model": "gpt-4o"
  }
}

// 2. Gateway → Client: assistant-delta (流式)
{
  "type": "assistant-delta",
  "id": "msg_011",
  "payload": {
    "sessionId": "sess_xyz",
    "delta": "好的,",
    "index": 0
  }
}

// 3. Gateway → Client: assistant-delta (继续)
{
  "type": "assistant-delta",
  "id": "msg_012",
  "payload": {
    "sessionId": "sess_xyz",
    "delta": "我来帮你写一个脚本",
    "index": 1
  }
}

// 4. Gateway → Client: message-complete
{
  "type": "message-complete",
  "id": "msg_013",
  "payload": {
    "sessionId": "sess_xyz",
    "usage": {
      "promptTokens": 25,
      "completionTokens": 150,
      "totalTokens": 175
    }
  }
}

工具调用流程

json
// 1. Gateway → Client: tool-call
{
  "type": "tool-call",
  "id": "msg_020",
  "payload": {
    "sessionId": "sess_xyz",
    "toolCallId": "tc_001",
    "toolName": "read_file",
    "arguments": {
      "path": "/src/main.py"
    },
    "requiresApproval": false
  }
}

// 2. Client → Gateway: tool-result
{
  "type": "tool-result",
  "id": "msg_021",
  "payload": {
    "toolCallId": "tc_001",
    "result": "print('hello world')",
    "success": true
  }
}

事件类型

Gateway 会主动推送(Push)以下事件:

事件说明
channel-statusChannel 状态变更(连接/断开)
session-timeout会话超时警告
config-reload配置已重新加载
gateway-shutdownGateway 即将关闭
json
{
  "type": "event",
  "id": "evt_001",
  "payload": {
    "event": "channel-status",
    "channel": "openai-main",
    "status": "connected"
  }
}

错误处理

错误消息格式:

json
{
  "type": "error",
  "id": "err_001",
  "payload": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests. Please retry after 30 seconds.",
    "retryAfter": 30
  }
}
错误码说明
unauthorized认证失败
session_not_found会话不存在
rate_limit_exceeded速率限制
model_not_available模型不可用
tool_execution_failed工具执行失败
internal_error内部错误

重试策略

收到 rate_limit_exceeded 时,使用 retryAfter 字段指定的秒数进行退避重试(Backoff Retry)。

相关文档

基于MIT协议开源 | 内容翻译自 官方文档,同步更新