POST /api/chat 端点设计

clawline 提取。Gateway 新增的 POST /api/chat 端点和虚拟连接机制详细设计。

POST /api/chat 端点设计

新增 HTTP API 端点 POST /api/chat,支持外部通过 REST API 方式向已注册 Agent 发送消息并接收回复,类似之前 Mattermost 的 API 机器人交互方式。

核心设计:通过「虚拟连接」模拟 WebSocket 客户端,使后端 Channel 插件完全感知不到这是 API 调用还是真实 WS 客户端。

请求参数

{
  "channelId": "string",     // 必填
  "chatId": "string",        // 可选
  "senderId": "string",      // 可选
  "agentId": "string",       // 可选
  "message": "string",       // 必填
  "timeout": 30000           // 可选,默认 30s
}

虚拟连接机制

  1. 创建临时 connectionIdrandomUUID()
  2. 注册到 clientConnectionsws: null(无真实 WebSocket)
  3. EventEmitter 作为 _apiCallback 收集回复
  4. 向 backend 发 relay.client.open + relay.client.event (message.receive)
  5. 等待 message.send 回复或超时
  6. 清理虚拟连接,发 relay.client.close

server.js 改动清单(3 处,~80 行)

改动点位置行数说明
POST /api/chat handlerHTTP 路由区(~1590行后)~70行新增端点
relay.server.event 分发~989行~8行_apiCallback 分支
closeSocket 空值守卫~636行1行防 null ws

API Source 标识(meta.source)

API 调用的消息通过 meta.source = "api" 字段贯穿全链路:

POST /api/chat → relay.client.event 携带 source:"api"
→ channel 插件透传给 agent
→ agent 回复时 meta.source 透传
→ persistMessageAsync 存入 cl_messages.meta
→ 前端渲染时读取 meta.source 展示标识

全链路改动汇总

文件改动行数
gateway-repo/server.jscloseSocket守卫 + apiCallback分支 + POST /api/chat handler,inbound meta.source~80行
channel-repo/src/generic/bot.tssend.ts透传 meta.source 到回复~8行
repo/src/components/chat/types.tsMessage 加 meta 字段2行
repo/src/screens/ChatRoom.tsx解析 meta 字段5行
repo/src/components/chat/MessageItem.tsx渲染 API 标识 badge10行

关键决策:Channel 插件、Client-Web、SDK 都不需要改核心逻辑 — 虚拟连接走标准 relay 协议。

相关页面