Skip to main content
Realtime

建立 Conversation 连接

使用已有 Conversation 建立 WebSocket 连接,进行实时语音、文本交互和后台任务事件传输。

Realtime 目前为 Beta 功能,接口定义、事件结构和行为可能发生变化。请关注文档更新,并在生产环境使用前完成兼容性验证。
GET /api/v1/forward/realtime 单个 Realtime 连接的最长持续时间为 60 分钟。

请求头

Header是否必填说明
AuthorizationBearer <PAT 或 SAT>
Upgradewebsocket,由 WebSocket 客户端生成。
ConnectionUpgrade,由 WebSocket 客户端生成。

查询参数

参数类型是否必填说明
conversation_idstring当前凭据可访问、状态为 ready 的 Conversation ID。

示例请求

wss://api.qoder.com.cn/api/v1/forward/realtime?conversation_id=conv_xxx
GET /api/v1/forward/realtime?conversation_id=conv_xxx HTTP/1.1
Host: api.qoder.com.cn
Authorization: Bearer <PAT 或 SAT>
Upgrade: websocket
Connection: Upgrade

示例响应

HTTP 101 Switching Protocols WebSocket 连接就绪后,服务端发送 voice.ready
{
  "version": "voice.realtime.v1",
  "type": "voice.ready",
  "event_id": "evt_xxx",
  "sequence": 2,
  "conversation_id": "conv_xxx",
  "timestamp": "2026-08-31T02:00:01Z",
  "payload": {
    "config": {
      "audio": {
        "output": {
          "voice": "longanlingxin"
        }
      }
    },
    "provider": "qoder",
    "input_audio": {
      "format": "pcm16",
      "sample_rate": 16000,
      "channels": 1
    },
    "output_audio": {
      "format": "pcm16",
      "sample_rate": 24000,
      "channels": 1
    },
    "capabilities": {
      "graceful_close": true
    }
  }
}

voice.ready.payload 字段

事件公共字段见实时事件
字段类型说明
configobject当前连接生效的 Conversation 配置。
config.audio.output.voicestring当前连接生效的音色标识。
providerstring服务提供方,公开环境固定为 qoder
input_audioobjectaudio.append 使用的音频格式。
input_audio.formatstring固定为 pcm16:裸 PCM、小端有符号 16 位,不含 WAV 文件头。
input_audio.sample_rateinteger固定为 16000,单位 Hz。
input_audio.channelsinteger固定为 1,单声道。
output_audioobjectaudio.delta 使用的音频格式。
output_audio.formatstring固定为 pcm16,编码与输入音频相同。
output_audio.sample_rateinteger固定为 24000,单位 Hz。
output_audio.channelsinteger固定为 1,单声道。
capabilitiesobject当前连接支持的协议能力。
capabilities.graceful_closeboolean是否支持正常关闭协议,当前为 true。

错误

握手完成前返回 HTTP 错误:
HTTPCode触发条件
400conversation_id_requiredunsupported_query_parameterWSS Query 参数缺失或不受支持。
401authentication_required、入口层 TOKEN_INVALIDPAT 或 SAT 无效、已过期,或直接使用了 Service Account Key。
403permission_errorSAT 未绑定可用的 Workspace。
404conversation_not_foundConversation 不存在,或当前凭据无权访问其所属用户、Workspace 或 Identity。
409conversation_not_ready会话未就绪。
500conversation_persistence_error服务内部错误。
502forward_unavailableforward_protocol_error依赖服务异常。
503gateway_unavailable服务暂不可用。
握手完成后的错误通过 error 事件返回,见 WebSocket 错误

实时事件

事件通过 UTF-8 JSON 文本消息传输,不接受二进制消息。客户端单条消息上限为 256 KiB(含 JSON 和 Base64);收到 voice.ready 后才能发送音频或文本。

公共字段

字段类型说明
versionstring双向必填,固定为 voice.realtime.v1
typestring双向必填,事件类型。
payloadobject双向必填,事件数据;无业务字段时为 {}
event_idstring服务端必返,本次 WSS 投递 ID,不是历史事件 ID。客户端不传该字段。
sequenceinteger服务端必返,当前连接内递增,重连后重置,不作为续传游标。
conversation_idstring服务端必返,所属 Conversation。
timestampstring服务端必返,RFC 3339 时间,可含纳秒精度小数。
work_idstring服务端可选,所属任务。
announcement_idstring服务端可选,所属播报。

客户端事件

{
  "version": "voice.realtime.v1",
  "type": "text.message",
  "payload": {
    "text": "你好,请简单介绍一下你自己"
  }
}
typepayload 字段说明
audio.appendaudio: string分块发送非空 Base64 PCM16,编码见 voice.ready.payload.input_audio。服务端检测语音活动,无需提交事件。
text.messagetext: string去除首尾空白后非空,UTF-8 最多 16 KiB。
interrupt打断当前响应;客户端停止播放并清空队列。
playback.startedwork_id: stringannouncement_id: string;对应音频事件携带时必填。实际开始播放。原样回传对应音频事件顶层标识;无标识时传 {}
playback.endedwork_id: stringannouncement_id: string;对应音频事件携带时必填。当前音频段播放完毕、队列排空。
playback.cancelledwork_id: stringannouncement_id: string;对应音频事件携带时必填。无法播放或取消播放。打断时停止播放、清空队列,并按原音频标识发送此回执。
ping探活,响应为 pong
connection.closerequest_id: string停止采集与播放后发送,等待同一 request_idconnection.closed。标识非空、最多 128 字节,无首尾空白、换行或空字符。

服务端事件

事件结构示例见示例响应
typepayload 字段说明
voice.statestate: stringconnectingreadyidleinterrupted
voice.readyconfig: objectprovider: stringinput_audio: objectoutput_audio: objectcapabilities: object连接就绪,返回最终生效的 Conversation 配置和音频传输格式。
voice.replacedreason: string连接被替换。
transcript.deltarole: stringtext: string;可选 item_id: stringresponse_id: string用户识别文本更新或助手字幕增量。
transcript.final同上最终字幕,覆盖临时字幕。
audio.deltaaudio: stringBase64 PCM16 音频,编码见 voice.ready.payload.output_audio
audio.done当前音频段输出结束,不代表客户端播放完毕。
playback.interruptreason: string停止播放并清空队列。
work.acceptedstatus: "accepted"objective: string任务已接受。
work.runningstatus: "running"任务执行中。
work.progresskind: stringdetail: string;可选 title: stringis_error: booleanevent_id: string任务进度。payload 中的 event_id 是 Forward 持久化事件 ID。
work.milestoneannouncement_id: stringmilestone_type: stringsummary: string任务阶段信息。
work.completedstatus: "completed"result: string;可选 event_id: string任务完成,播报可能尚未结束。payload 中的 event_id 是 Forward 持久化事件 ID。
work.failedstatus: "failed"error.code: string;可选 event_id: string任务失败或取消,与连接状态独立。payload 中的 event_id 是 Forward 持久化事件 ID。
pongping 的响应。
connection.closedrequest_id: stringoutcome: string关闭确认,返回原 request_idoutcomeno_active_responseno_contentsavedsaved_interrupted
errorcode: stringmessage: string;可选 retryable: booleanretry_after_ms: integer协议或服务错误。

WebSocket 错误

Code是否结束连接触发条件
invalid_eventtext_too_long事件无效或文本超限。
voice_not_ready实时连接尚未就绪。
invalid_playback_receipt播放回执无效。
connection_closing正在关闭,不再接受业务事件。
invalid_work_requestwork_busywork_unavailablework_persistence_errorforward_request_failedforward_cancel_failedforward_protocol_error任务请求或执行异常。
provider_initialization_failedvoice_configuration_failedcontext_restore_failed实时模型初始化、音色确认或上下文恢复失败。
provider_unavailableservice_restarting服务不可用;重连间隔见 retry_after_ms(如有)。
event_persistence_failed事件保存失败,最后一条历史可能缺失。

HTTP 错误响应

{
  "type": "error",
  "request_id": "req_xxx",
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_idempotency_key",
    "message": "Idempotency-Key is required and must be at most 256 characters"
  }
}

响应字段

字段类型说明
typestring固定为 error
request_idstring请求追踪 ID。
error.typestring错误大类,例如 invalid_request_errorauthentication_errorpermission_errornot_found_errorconflict_errorapi_error
error.codestring稳定的业务错误码。
error.messagestring错误描述。
服务端同时通过响应 Header 返回请求追踪 ID:
X-Request-Id: req_xxx
入口鉴权错误使用以下结构(HTTP 401):
{
  "code": "TOKEN_INVALID",
  "message": "missing authorization token"
}
代理或标准 WebSocket 握手失败可能返回非 JSON 响应。

相关