Realtime API 参考
本接口是一个 WebSocket 长连接。网关把百炼 Qwen-Omni-Realtime 协议原样双向转发,不做协议转换;事件字段的完整定义与工具调用(Function Calling / MCP)事件以百炼官方客户端事件与服务端事件为准。本页覆盖接入所需的握手、鉴权、事件清单与音频约定。
请求
| 项 | 值 |
|---|---|
| 方法 | GET(WebSocket 升级) |
| 路径 | /api-ws/v1/realtime |
| 完整地址 | {{ ws_endpoint }}/api-ws/v1/realtime?model=<逻辑模型名> |
| Query | model(必填)——平台逻辑模型名,不是上游模型名 |
| Header | Authorization: Bearer <mgk_ API Key>(必填) |
| Header | X-Request-ID(可选)——透传到调用日志,request_id 以 gw_rt_ 开头 |
只有 public_protocols 声明了 dashscope_realtime 的逻辑模型才能走本入口。
握手错误码
握手(升级为 WebSocket 之前)失败时,以 HTTP 状态码返回,body 为:
{"error":{"type":"invalid_request_error","code":"unauthorized","message":"unauthorized: api_key_not_found"}}| HTTP | code | 触发条件 | 实测 message(cn 生产,2026-10-08) |
|---|---|---|---|
| 401 | unauthenticated | 未携带 API Key | missing api key |
| 401 | unauthorized | Key 无效 / 已禁用 | unauthorized: api_key_not_found |
| 404 | model_not_found | 模型不在目录 | unknown model: <model> |
| 403 | model_protocol_not_offered | 模型未声明 dashscope_realtime | model <model> is not offered on the realtime protocol |
| 404 | no_route | 策略(含回落链)中没有该模型的路由 | no route for model <model> |
| 503 | no_provider | 有路由但无可用上游实例 | no provider available for <model> |
| 402 | insufficient_funds / budget_exceeded | 预授权失败(余额/预算不足) | billing: insufficient funds |
握手通过(HTTP 101)后再出现的问题,会以带内 error 事件下发,然后关闭连接:
{"type":"error","error":{"type":"upstream_error","code":"provider_unavailable","message":"upstream connection failed"}}会话配置 session.update
建连后服务端先发 session.created,客户端用 session.update 覆盖配置,配置合法则回 session.updated。常用字段:
| 字段 | 可选值 | 默认 |
|---|---|---|
modalities | ["text","audio"] / ["text"] | ["text","audio"] |
voice / audio.output.voice | 见百炼音色列表 | Tina |
turn_detection | {"type":"server_vad"} / {"type":"semantic_vad"} / null | 服务端 VAD |
audio.input.format | {"type":"pcm","sample_rate":16000} | pcm / 16000 |
audio.output.format | {"type":"pcm","sample_rate":24000} | pcm / 24000 |
instructions | 任意文本 | 空 |
input_audio_transcription | {"model":"qwen3-asr-flash-realtime"} / null | 开启 |
turn_detection: null 表示关闭服务端 VAD,改由客户端手动提交与触发响应。
客户端事件
| 事件 | 作用 |
|---|---|
session.update | 更新会话配置(模态、音色、音频格式、VAD、instructions 等) |
input_audio_buffer.append | 追加 Base64 音频到输入缓冲区 |
input_image_buffer.append | 追加 Base64 图片(JPG/JPEG,需先发过音频) |
input_audio_buffer.commit | 手动模式下提交音频缓冲区(提交不触发响应) |
input_audio_buffer.clear | 清空音频缓冲区 |
conversation.item.create | 创建对话项:纯文本输入、function_call_output、mcp_approval_response |
response.create | 触发一次模型响应 |
response.cancel | 取消正在进行的响应(打断) |
服务端事件
| 事件 | 说明 |
|---|---|
session.created / session.updated | 会话建立 / 配置生效 |
input_audio_buffer.speech_started / speech_stopped | VAD 检测到用户开始 / 停止说话(打断依据) |
input_audio_buffer.committed / cleared | 音频缓冲区提交 / 清空 |
conversation.item.created | 对话项已创建 |
conversation.item.input_audio_transcription.delta / .completed | 输入语音转写(流式预览 / 最终结果) |
response.created | 一轮响应开始 |
response.output_item.added / response.content_part.added | 输出项 / 内容片段开始 |
response.text.delta / response.text.done | 仅文本模式的流式 / 完整文本 |
response.audio_transcript.delta / .done | 含音频模式下,音频对应的文本 |
response.audio.delta / response.audio.done | Base64 输出音频(24 kHz PCM)/ 音频结束 |
response.output_item.done / response.content_part.done | 输出项 / 内容片段完成 |
response.done | 一轮响应结束,response.usage 携带分模态 token 用量 |
工具调用(response.function_call_arguments.delta / .done)与 MCP 相关事件(mcp_*)字段见百炼服务端事件文档。
一次完整语音问答的实测事件序(cn 生产,2026-10-08):
session.created
session.updated
input_audio_buffer.speech_started
input_audio_buffer.speech_stopped
input_audio_buffer.committed
conversation.item.input_audio_transcription.completed
response.created
response.output_item.added
response.audio_transcript.delta …
response.audio.delta …
response.done音频格式
| 方向 | 格式 | 事件 / 字段 |
|---|---|---|
| 上行(输入) | 16000 Hz、16-bit 小端、单声道 PCM,Base64 | input_audio_buffer.append 的 audio |
| 下行(输出) | 24000 Hz、16-bit 小端、单声道 PCM,Base64 | response.audio.delta 的 delta |
实测满 100 ms 一包推送输入音频(3200 字节 / 帧)最稳。input_audio_buffer.append 只入缓冲,不触发响应;是否提交由 VAD 或客户端 input_audio_buffer.commit 决定。
VAD 与打断
turn_detection非null时,服务端自动检测语音起止并在静音silence_duration_ms(默认 800ms)后自动提交、触发响应。- 用户再次说话:服务端下发
input_audio_buffer.speech_started→ 客户端停止播放并发response.cancel→ 收到response.done(cancelled)→ 新一轮。 turn_detection: null为手动模式:客户端在录音结束后依次发送input_audio_buffer.commit(等input_audio_buffer.committed)与response.create。
用量与计费
每轮响应的 response.done.response.usage 携带分模态 token:
{
"type": "response.done",
"response": {
"status": "completed",
"usage": {
"total_tokens": 843,
"input_tokens": 693,
"output_tokens": 150,
"input_tokens_details": { "text_tokens": 693 },
"output_tokens_details": { "text_tokens": 28, "audio_tokens": 122 }
}
}
}网关按整段连接的累计用量在关闭时结算:连接时按会话级预估预授权(当前约 ¥1.2,余额不足则握手 402),关闭连接后按实际用量多退少补,无用量则释放预授权。详见使用指南。
限制
| 项 | 值 |
|---|---|
| 单连接最长时长 | 30 分钟(网关强制) |
| 全部输入 Token 上限 | 196,608 |
| 最大输出 Token | 65,536 |
| 上游限流 | 60 RPM |