实时语音识别接口通过一条 WebSocket 连接完成「边送音频、边出文本」的流式转写。
接口地址
WebSocket 地址固定如下:
wss://convai-platform.aliyuncs.com/api-ws/v1/convai-asr/inference请按上述地址原样填写:路径区分大小写,结尾不要带 /。
支持的模型
模型 | 采样率 | language_hints 可选值 | 适用场景 |
Qwen-Audio-ASR-VoicePica | 8000 / 16000,须与实际音频一致 | zh | 中文实时识别;支持任务级热词 hotwords,能力范围见「关键概念与限制」 |
鉴权
客户端类型 | 鉴权方式 | 示例 |
服务端(Java / Python / Node / Go 等) | 握手请求头 |
|
浏览器 | URL 查询参数 |
|
API Key 由 Voice Studio 签发,形如
sk-+ 32 位十六进制,与实时语音合成使用同一套 Key。百炼原生 Key 无法通过鉴权,返回 HTTP 401。有效 API Key 不等于已具备服务使用权益:账号未开通服务或已停服时,握手返回 HTTP 403。
鉴权在握手阶段完成。握手被拒时不会升级为 WebSocket,也没有应用层关闭帧,浏览器通常只能观察到关闭码 1006。
请求头
握手阶段只传鉴权与追踪信息;识别模型、音频格式、采样率及识别功能参数均在每个任务的 run-task 中指定,同一连接上的不同任务可以使用不同参数。
请求头 | 必填 | 取值 | 说明 |
Authorization | 服务端必填 |
| Voice Studio 签发的 API Key |
X-Request-Id | 否(强烈建议) | 非空字符串,建议 ≤ 64 字符 | 自带的追踪 ID,原样回写到握手响应头 |
User-Agent | 否 | 客户端标识 | 建议包含应用名称和版本,便于排障 |
URL 查询参数
参数 | 必填 | 默认值 | 说明 |
token | 浏览器必填 | - | 浏览器场景的鉴权凭证;服务端请用 Authorization 请求头 |
请记录建连时间(精确到秒并注明时区)、客户端生成的 task_id 以及收到的 task_uuid,用于事后排障。
握手示例(服务端):
GET /api-ws/v1/convai-asr/inference HTTP/1.1
Host: convai-platform.aliyuncs.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: <WEBSOCKET_KEY>
Authorization: Bearer <VOICE_STUDIO_API_KEY>
X-Request-Id: svc-example-0001握手示例(浏览器,参数值需进行 URL 编码):
wss://convai-platform.aliyuncs.com/api-ws/v1/convai-asr/inference?token=<URL_ENCODED_API_KEY>交互流程
建立连接:携带鉴权信息发起 WebSocket 握手,收到
101 Switching Protocols。建连后服务端不会主动下发任何帧,没有connected事件。发送 run-task:使用 TEXT 帧指定识别模型与音频参数,开启一个任务;需要热词时同时传入词库引用
vocabulary_id和/或任务级热词hotwords。task_id由你生成(UUID),同一任务的所有指令必须一致。等待 task-started:收到该事件后才可以发送音频;保存
header.task_uuid(如有),便于排障。发送 BINARY 音频帧:建议每 100 ms 一帧,按约 1 倍速持续推流。音频直接以二进制发送,不做 JSON 或 Base64 包装。
接收 result-generated:同一句话会多次返回中间结果用于覆盖刷新,
sentence_end=true为该句最终结果。发送 finish-task:所有音频(含不足一帧的尾部完整采样)发送完毕后发送,不可省略。
继续接收直到 task-finished:finish-task 之后仍可能返回尾句识别结果,提前关闭连接会丢失尾句。task-finished 中带回本任务最终音频用量。
复用或关闭:任务正常结束后,可以在同一条连接上用新的
task_id发起下一个 run-task,也可以直接关闭连接。
任一阶段收到 task-failed 时,停止上行并保存错误信息;服务端随后关闭连接,需要重试时重新建连。
状态约束
约束 | 违反后果 |
必须先 run-task,收到 task-started 后再发音频 | run-task 之前发送音频、continue-task 或 finish-task:task-failed(CLIENT_ERROR) 并关闭连接 |
同一任务所有指令的 task_id 必须完全一致 | 可能导致任务失败或结果无法关联 |
一条连接同时只允许 1 个任务 | 任务未结束又发 run-task:task-failed(CLIENT_ERROR: run-task while a task is already running) 并关闭连接 |
指令必须是 TEXT 帧,音频必须是 BINARY 帧 | 混用会导致参数或协议错误 |
finish-task 不可省略 | 尾部音频的识别结果不会返回,任务最终可能因超时失败 |
finish-task 后必须继续收流直到 task-finished | 提前关闭会丢失尾句结果 |
收到 task-failed 后不再复用该连接 | 服务端随后关闭连接,重试必须重新建连 |
客户端事件(上行)
上行分为 JSON 指令(TEXT 帧)和音频(BINARY 帧)。JSON 指令统一使用如下信封:
{
"header": {
"action": "<事件名>",
"task_id": "<你生成的 UUID>",
"streaming": "duplex"
},
"payload": {}
}header 字段 | 类型 | 必填 | 取值 | 说明 |
action | String | 是 | run-task / finish-task | 本模型接入只需这两种指令。缺失返回 |
task_id | String | 是 | UUID 字符串,32 位或带连字符均可 | 由你生成;同一任务的全部指令相同,每个新任务更换 UUID |
streaming | String | 是 | 固定 duplex | 双向流式交互 |
header 与 payload 必须是 JSON 对象,否则返回 CLIENT_ERROR: header and payload must be JSON objects;非法 JSON 返回 CLIENT_ERROR: invalid JSON message。事件名和参数名区分大小写。
1. run-task —— 开启任务
发送时机:连接建立后的第一帧,或上一个任务已收到 task-finished 之后。
响应事件:成功返回 task-started,失败返回 task-failed 并关闭连接。
数量限制:一条连接同时只允许 1 个任务;上一个任务正常结束后可以用新 task_id 再次发送。
payload 顶层
参数 | 类型 | 必填 | 说明 |
task_group | String | 是 | 固定 |
task | String | 是 | 固定 |
function | String | 是 | 固定 |
model | String | 是 | 固定 |
parameters | Object | 是 | 识别参数,见下两表 |
input | Object | 是 | 固定传 |
parameters —— 音频参数
参数 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
format | String | 是 | - | pcm / wav / opus | 音频编码格式,实时场景推荐 pcm;封装要求见「BINARY 音频帧」 |
sample_rate | Integer | 是 | - | 8000 / 16000,单位 Hz | 须与实际音频一致;修改此值不会对音频做重采样 |
parameters —— 功能参数
参数 | 类型 | 必填 | 默认值 | 取值 / 约束 | 说明 |
hotwords | Object | 否 | - |
| 任务级热词,只对当前任务生效。与 vocabulary_id 同传时合并,规则见「热词与托管词库」 |
language_hints | Array[String] | 否 | 自动识别 | 如 | 目标语言提示,仅第一个元素生效 |
max_sentence_silence | Integer | 否 | 引擎默认 | [200, 6000],单位 ms | VAD 断句静音阈值 |
speech_noise_threshold | Float | 否 | 引擎默认 | [-1.0, 1.0] | 越接近 -1 越易把噪音当语音,越接近 +1 越易把语音当噪音;建议以 0.1 步长小幅调整并验证 |
special_word_filter | String | 否 | - | JSON 字符串,不是 Object | 自定义敏感词过滤,见下方说明 |
special_word_filter 内层字段(内层 JSON 必须序列化为字符串)
内层字段 | 类型 | 说明 |
filter_with_signed.word_list | Array[String] | 命中词替换为等长 |
filter_with_empty.word_list | Array[String] | 命中词从识别文本中删除 |
自定义词过滤作用于中间结果和最终结果。不合法的 JSON 字符串可能被忽略,请在接入侧校验并验证实际过滤效果。
示例
{
"header": {
"action": "run-task",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"streaming": "duplex"
},
"payload": {
"task_group": "audio",
"task": "asr",
"function": "recognition",
"model": "Qwen-Audio-ASR-VoicePica",
"parameters": {
"format": "pcm",
"sample_rate": 16000,
"language_hints": ["zh"],
"max_sentence_silence": 800,
"special_word_filter": "{\"filter_with_signed\":{\"word_list\":[\"示例敏感词\"]},\"filter_with_empty\":{\"word_list\":[\"示例删除词\"]}}"
},
"input": {}
}
}2. BINARY 音频帧 —— 上行音频
发送时机:收到 task-started 之后、发送 finish-task 之前,可多次发送。
响应事件:识别过程中持续返回 result-generated;一个音频帧不一定对应一个结果事件。
项目 | 要求 |
消息类型 | BINARY,直接发送音频字节,不做 JSON 或 Base64 包装 |
声道 | 单声道 |
PCM 位深 | 16 bit 有符号整数、小端字节序,每个采样 2 字节,帧长应为 2 的整数倍 |
单帧大小 | ≤ 65,536 字节(64 KiB),超限连接以 1009 关闭 |
推荐分帧 | 100 ms 一帧:8 kHz PCM 为 1,600 字节,16 kHz PCM 为 3,200 字节 |
发送节奏 | 按实时产生节奏或约 1 倍速推流;离线文件同样按约 1 倍速发送 |
帧间隔 | 建议 ≤ 20 秒;长时间无人说话时继续发送静音帧 |
格式与封装
format | 音频要求 |
pcm | 裸 PCM16 单声道,不带 WAV 文件头;静音可使用值为 0 的采样 |
wav | PCM16 单声道 WAV;文件头只在音频流开始时发送一次,不要给每个网络分片补头 |
opus | Ogg 封装,包含流头与音频页;不接受裸编码包 |
约束
format 与 sample_rate 必须和实际音频一致,填写参数不会替音频完成转码、混音或重采样;采样率填错会导致识别结果严重错误。
压缩音频同样按音频时长节奏发送,不能用 PCM 的字节数公式估算其时长;不要把不同录音文件直接拼成一个连续的容器流。
浏览器 MediaRecorder 常见的 WebM / Opus 不等于这里要求的 Ogg / Opus,浏览器实时采集建议转换为 PCM16 单声道再发送。
服务端对单连接未处理的上行帧设有积压上限。瞬时灌入整段文件会返回
task-failed(CLIENT_ERROR: client input overflow ...)并以 1011 关闭。收发必须分离,持续读取下行消息;长时间不读取下行会导致连接被断开。
3. finish-task —— 结束任务(不可省略)
发送时机:音频全部发送完毕后。
响应事件:剩余 result-generated,最后是 task-finished。
payload 字段 | 类型 | 必填 | 取值 | 说明 |
input | Object | 是 |
| 正常结束固定传空对象 |
{
"header": {
"action": "finish-task",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"streaming": "duplex"
},
"payload": {"input": {}}
}发送前先发完所有音频(含不足 100 ms 的尾部完整采样);发送后不再上行音频,也不要重复发送 finish-task。
发送后必须继续接收,直到 task-finished。
本接口没有
input.directive=cancel或flush指令。需要中途停止时可以直接关闭连接,但这不是正常完成:不保证能收到尾句结果和终态用量,也不代表已处理的音频不计费。
服务端事件(下行)
下行共 4 类 TEXT 事件,没有 BINARY 帧。所有事件统一 header / payload 信封,请按 header.event 分派消息,header.task_id 回显你的任务 ID。
请忽略未知字段,并容忍可选字段缺失:未出现的sentence_begin、sentence_end一律按 false 处理;时间戳和用量出现 null 时不要强制转换为 0。本模型不下发识别心跳结果。
事件 | 何时出现 | 关键字段 |
task-started | run-task 被受理 | header.task_id、header.task_uuid |
result-generated | 识别过程中,多次 | payload.output.sentence、payload.usage |
task-finished | finish-task 后任务正常结束 | payload.usage.duration |
task-failed | 任务失败,随后关闭连接 | header.error_code、header.error_message |
1. task-started —— 任务确认
{
"header": {
"event": "task-started",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"task_uuid": "1008340206f44c8eabd587930b125614",
"attributes": {}
},
"payload": {}
}字段 | 类型 | 说明 |
header.event | String | 固定 task-started |
header.task_id | String | 回显你的 task_id |
header.task_uuid | String / 缺省 | 识别引擎侧任务 ID,有则保存并在报障时提供;不要把它写回后续上行的 task_id |
header.attributes | Object | 示例为空对象,不依赖其中的扩展字段 |
payload | Object | 示例为空对象 |
收到此事件后方可发送音频。
2. result-generated —— 识别结果
同一句话会连续收到多条结果:首条带 sentence_begin=true(文本通常为空),之后是不断刷新的中间结果(sentence_end=false,文本可能被改写),最后一条 sentence_end=true 为该句最终结果。
结果类型(依据 payload.output.sentence)
判断条件 | 含义 | 客户端处理 |
sentence_begin=true | 新句子开始,文本通常为空 | 建立该句的显示状态 |
sentence_end=false | 中间结果,文本可能改写 | 按 sentence_id 覆盖当前句,不要逐条追加 |
sentence_end=true | 该句最终结果 | 定稿,可交给下游业务处理 |
最终结果示例
{
"header": {
"event": "result-generated",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"attributes": {}
},
"payload": {
"output": {
"sentence": {
"sentence_id": 1,
"begin_time": 240,
"end_time": 1620,
"text": "你好,我是银行的,",
"channel_id": 0,
"speaker_id": null,
"sentence_end": true,
"words": [
{"begin_time": 240, "end_time": 1620, "text": "你好,我是银行的", "punctuation": ",", "fixed": false, "speaker_id": null}
]
}
},
"usage": {"duration": 2}
}
}中间结果与最终结果结构相同,区别是 sentence_end 为 false、end_time 为 null,且通常不携带 usage。本模型不提供字 / 词级时间戳,示例中的 words 使用整句文本及句级时间。
字段说明
字段 | 类型 | 出现条件 | 说明 |
output.sentence.sentence_id | Integer | 恒有 | 句子序号,从 1 递增 |
output.sentence.begin_time | Integer | 恒有 | 句子起始时间(毫秒,相对本任务音频起点);中间结果可能调整 |
output.sentence.end_time | Integer / null | 恒有 | 句子结束时间(毫秒);中间结果为 null |
output.sentence.text | String | 恒有 | 识别文本,含标点;句首或静音时可为空串 |
output.sentence.channel_id | Integer | 恒有 | 声道号,单声道固定为 0 |
output.sentence.speaker_id | Integer / null | 恒有 | 说话人标识,当前恒为 null |
output.sentence.sentence_begin | Boolean | 仅新句子首个结果 | 为 true 表示新句子开始 |
output.sentence.sentence_end | Boolean | 恒有 | true=该句最终结果;false=中间结果 |
output.sentence.words[ ].text | String | 按需 | 整句文本,末尾标点另列;空文本时 words 可为空数组 |
output.sentence.words[ ].punctuation | String | 按需 | 标点,无标点时为空串 |
output.sentence.words[ ].begin_time / end_time | Integer | 按需 | 整句起止时间(毫秒,相对本任务音频起点),不表示字 / 词级时间戳 |
output.sentence.words[ ].fixed | Boolean | 按需 | 不依赖此字段判断稳定性;整句定稿以 sentence_end=true 为准 |
payload.usage.duration | Integer / null | sentence_end=true 时;其他结果若携带同样有效 | 截至当前本任务累计音频时长快照(秒)。不是本句发声时长,不能逐条相加;最终以 task-finished 为准 |
客户端处理建议
实时字幕:用同一 sentence_id 的中间结果覆盖刷新当前行,sentence_end=true 时定稿换行。
对话 / 外呼:只把 sentence_end=true 的文本交给下游(如大模型),中间结果仅用于界面展示或打断检测。
整段转写:按 sentence_id 顺序拼接所有 sentence_end=true 的 text。
3. task-finished —— 任务结束
{
"header": {
"event": "task-finished",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"attributes": {}
},
"payload": {
"output": {},
"usage": {"duration": 8}
}
}字段 | 类型 | 说明 |
header.event | String | 固定 task-finished |
header.task_id | String | 回显你的 task_id |
header.attributes | Object | 示例为空对象 |
payload.usage.duration | Integer / null | 本任务最终音频用量(整数秒),由平台计算并补齐;口径见「音频用量」 |
收到此事件表示识别结果已全部传输,可关闭连接或复用连接发起新任务(新 task_id)。
4. task-failed —— 任务失败
{
"header": {
"event": "task-failed",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"error_code": "CLIENT_ERROR",
"error_message": "not supported by model Qwen-Audio-ASR-VoicePica: heartbeat",
"attributes": {}
},
"payload": {}
}此例为任务开始前传入不支持参数的错误,因此不带音频用量。
字段 | 类型 | 说明 |
header.event | String | 固定 task-failed |
header.task_id | String | 关联的任务 ID;run-task 之前的错误回带出错帧中的值,帧里没有 task_id(如非法 JSON)时为空串 |
header.error_code | String | 错误码,用于程序判断,见「错误码与关闭码」 |
header.error_message | String | 可读错误描述,报障时请提供完整原文 |
header.attributes | Object | 示例为空对象 |
payload.usage.duration | Integer / null / 缺省 | 在途任务失败时为按已成功发送音频确认的终态用量;任务开始前的错误不带此字段 |
收到 task-failed 后服务端会立即关闭连接,不要在该连接上继续发送;需要重试时重新建连并使用新的 task_id。
本接口不下发
payload.error.type,请按header.error_code和错误码表决定处理方式。失败回包中的 duration 是音频用量,不等于收费结论。
关键概念与限制
约束速查
约束 | 值 |
上行指令帧类型 | TEXT |
上行音频帧类型 | BINARY,单声道;pcm 为 16 bit 小端 |
单帧大小(指令 / 音频) | ≤ 64 KiB(超限以 1009 关闭),建议音频每 100 ms 一帧 |
发送节奏 | 约 1 倍速;瞬时灌入大量音频触发积压保护 |
任务内音频间隔 | 建议 ≤ 20 秒 |
连接空闲(无任何上下行数据、无 ping) | < 70 秒 |
单连接同时进行的任务 | 1 个(正常结束后可串行复用) |
任务失败后的连接 | 被关闭,不能复用 |
并发 | 按工作空间统计同时在线的 WebSocket 连接数 |
音频用量
payload.usage.duration 是任务音频用量,单位为秒,不是连接时长、识别文本长度或当前句子的发声时长。用量由平台计算,不使用识别引擎返回的时长。
累计已成功发送给识别引擎的完整音频采样量,包含前置、句间和尾部静音;连接等待、发送失败的音频及尚未发送的缓冲不计入。
PCM 按声明采样率计算;WAV 按真实采样率且只计音频数据;压缩格式按完整编码帧 / 封装采样信息计算,不按压缩字节大小估算。
每个任务累计后按四舍五入(HALF_UP)取整到整数秒,不逐网络帧取整,不设最低用量。不同任务分别取整再汇总。
result-generated 中的 duration 是累计快照,不能逐条相加;正常任务以 task-finished 的终态值为准。
实际累计音频时长 | 终态 usage.duration |
0 秒 | 0 |
0.49 秒 | 0 |
0.5 秒 | 1 |
2.5 秒 | 3 |
8.245 秒 | 8 |
例如两个任务各 2.5 秒,分别取整为 3 秒,汇总为 6 秒;不能先合并为 5 秒再取整。
用量回包不是扣费成功凭证。正常完成的任务、以及客户主动以正常关闭码 1000 中断的任务,按已处理的有效音频用量纳入计费,中途关闭不代表免费;平台 / 引擎失败、无法确认原因的网络断连或服务维护中断,不因回包中出现 duration 就认定收费。0 秒或计量不可用的任务不产生有效计费秒数。具体价格与结算以账号服务约定和账单为准。
超时矩阵
超时项 | 阈值 | 触发条件 | 结果 |
任务内音频间隔 | 20 秒 | 长时间未收到音频,具体超时与报错以服务返回为准 | 任务失败并关闭连接;请持续推流,不要依赖固定的引擎超时秒数 |
连接空闲 | 60 秒 | 连续 60 秒无任何上下行数据(含 ping) | 以 1001 关闭,reason 含 |
服务维护等待在途任务 | 最长 5 分钟 | 实例发布 / 缩容时任务仍在进行 | 任务间隙的连接立即以 1001 关闭;在途任务等 task-finished 后以 1001 关闭;超时则下发 task-failed(SERVICE_DRAINING) 后以 1001 关闭 |
上行积压 | 服务端积压上限 | 瞬时灌入大量音频 |
|
并发限制
按工作空间限制同时在线的 WebSocket 连接数:连接建立即占用一路,连接关闭即释放一路。
空闲连接同样占用额度。挂着不识别的连接不会自动让出槽位,用完请主动关闭。
一条连接不能并行执行多个任务,并行识别请使用多条连接。
超限的新连接在建立后立即以关闭码 4429 关闭(reason 为
CONCURRENCY_LIMIT_EXCEEDED,不下发 task-failed),已建立的连接不受影响。额度以服务开通约定为准,需要提升并发额度请联系平台。
错误码与关闭码
业务错误码(task-failed)
error_code | 典型 error_message | 关闭码 | 说明与处理 |
CLIENT_ERROR |
| 1000 | 指令格式错误,修正后重试;原样重试无效 |
CLIENT_ERROR |
| 1000 | 未开启任务就发音频或指令;先 run-task,收到 task-started 再推流 |
CLIENT_ERROR |
| 1000 | 同一连接上一任务未结束;等 task-finished 后再发,或另开连接 |
CLIENT_ERROR |
| 1000 | vocabulary_id 不是标准 UUID;改用平台词库 ID |
CLIENT_ERROR |
| 1000 | 凭证未归属工作空间,无法引用词库;改用工作空间凭证 |
CLIENT_ERROR |
| 1000 | 词库不存在、不属于当前工作空间或已删除;核对词库 ID |
CLIENT_ERROR |
| 1000 | 词库尚未就绪;确认词库创建 / 更新成功后重试 |
CLIENT_ERROR |
| 1000 | 词库与任务级热词合并后超限;精简热词 |
CLIENT_ERROR |
| 1000 | 当前模型不支持的格式或能力;按错误信息去掉相应参数或转换音频格式 |
CLIENT_ERROR |
| 1000 | 发起任务时服务使用权益被拒绝或暂不可用;核对账号服务状态并联系平台,不要持续无条件重试 |
CLIENT_ERROR |
| 1011 | 瞬时灌入音频导致积压;按实时节奏推流,重新建连重做任务 |
MODEL_NOT_ALLOWED |
| 1000 | model 须填写 |
CONFIG_MISSING |
| 1000 | 平台侧配置未就绪;联系平台,重试无效 |
UPSTREAM_ERROR |
| 1000 | 识别引擎连接或词库读取暂时不可用;指数退避后重新建连 |
UPSTREAM_ERROR | 识别引擎连接异常 / 中断 | 1011 | 指数退避后重新建连重试 |
SERVICE_DRAINING |
| 1001 | 实例维护,在途任务被中断;立即重新建连并重做该任务 |
其他(如 InvalidParameter) | 识别引擎原文 | 1011 | 识别引擎拒绝了参数(如 format / sample_rate / language_hints 不合法)或其他引擎侧错误;按错误信息修正参数,无法判断时联系平台 |
WebSocket 关闭码
关闭码 | 含义 | 处理建议 |
1000 | 正常关闭;也出现在平台校验失败(CLIENT_ERROR / MODEL_NOT_ALLOWED / CONFIG_MISSING 等)之后 | 关闭码不代表任务成功,以是否收到 task-finished 及前一条 task-failed 判断 |
1001 | 服务端实例下线(发布 / 缩容),或连接空闲 70 秒被回收 | 立即重连(会路由到其他实例),无需退避;连续建连失败时短暂退避 |
1006 | 网络异常断开,或浏览器握手被拒(读不到真实状态码) | 检查网络与凭证后重连,对照下方握手阶段错误排查 |
1009 | 单帧超过 64 KiB | 减小分帧,音频建议每 100 ms 一帧 |
1011 | 识别引擎任务失败或连接中断、上行积压溢出、服务内部错误(关闭前通常先收到 task-failed) | 按 error_code 处理;引擎 / 内部错误指数退避重连 |
4429 | 工作空间同时在线连接数已达上限,连接建立后立即关闭,不下发 task-failed | 关闭闲置连接,延迟重连或申请提额 |
网络或传输异常时,task-failed 可能无法送达。未收到 task-finished 的任务不能仅因正常关闭码而视为完整完成。
握手阶段错误
握手阶段失败不会升级为 WebSocket,没有 task-failed,也没有应用层 Close 帧。
HTTP 状态码 | 原因 | 处理建议 |
401 | 凭证缺失、无效或过期;使用了百炼原生 Key | 检查 Key 来源与 |
403 | 服务使用权益被拒绝,如未开通或已停服 | 核对账号服务状态,保存响应信息并联系平台 |
404 | 接口地址错误(拼写、大小写、结尾多了 | 使用本文给出的完整地址 |
503 | 服务实例正在下线,或连接容量暂满 | 立即重试(新连接会落到其他实例),连续失败时短暂退避 |