模型BYOK与搜索接口

本文供客户开发人员实现模型与搜索 API。客户提供符合本文协议的服务地址、模型 ID 和可选 API Key,由 QwenWork 发起调用。

调用方向:QwenWork → 客户服务;响应方向相反。 客户只需实现需要接入的能力。示例中的域名、模型 ID、内容和请求标识均可替换,字段名称、层级、状态值及事件名保持不变。

按能力阅读:对话 · 异步任务 · 图片 · 视频 · 音乐 · 实时语音识别 · 搜索。

1. 协议与接口清单

能力接入合同Method / 传输客户服务的完成响应
主模型、视觉理解、语音润色Chat CompletionsPOST;JSON 或 SSEchoices[].message 或 choices[].delta
同步生图 / 编辑QwenWork Image SyncPOST;JSON同一次响应返回 output.choices[].message.content[].image
异步生图 / 编辑QwenWork Image AsyncPOST 提交 + GET 查询提交返回任务 ID;查询成功返回图片列表
视频生成QwenWork VideoPOST 提交 + GET 查询提交返回任务 ID;查询成功返回 output.video_url
音乐生成QwenWork MusicPOST;JSON同一次响应返回 output.audio.url,音频为 MP3
实时 ASRQwenWork RealtimeWebSocket实时双向流;音频为二进制或 Base64,见第 8 节
网页搜索QwenWork SearchPOST;JSONpageItems
图片搜索QwenWork SearchPOST;JSONimageItems

协议名称不进入请求体。model 使用实际模型 ID;搜索不发送 model。

各能力的请求与响应按对应章节实现;不支持的参数应明确报错。

2. 公共连接约定

2.1 Endpoint 与协议选择

客户提供完整调用地址;异步图片和视频另外交付包含 {task_id} 的完整查询地址。例如:

合同调用 Endpoint 示例查询 Endpoint 示例
Chat Completionshttps://service.example/chat/completions无
QwenWork Image Synchttps://service.example/images/generate无
QwenWork Image Asynchttps://service.example/images/jobshttps://service.example/images/jobs/{task_id}
QwenWork Videohttps://service.example/videos/jobshttps://service.example/videos/jobs/{task_id}
QwenWork Musichttps://service.example/music/generate无
QwenWork Realtime,二进制音频wss://service.example/api-ws/v1/inference无
QwenWork Realtime,Base64 音频wss://service.example/api-ws/v1/realtime无
网页 / 图片搜索https://service.example/search/web / https://service.example/search/images无
  • 图片须明确选择 Sync 或 Async;两者均可使用自定义路径。Sync 无查询接口,Async 必须提供查询接口。
  • ASR 路径须保留 /api-ws/v1/inference 或 /api-ws/v1/realtime 后缀,可增加网关前缀。
  • K8S 支持 HTTP(S) 和 WS(S)、集群域名、私网 IP、自定义端口;地址必须从 QwenWork 服务所在网络可达。使用 TLS 时证书链须有效。
  • HTTP Endpoint 不带 query、fragment 或 URL 用户名密码;ASR 的 model query 例外见第 8 节。接口直接响应,不依赖重定向。完整 Endpoint 不会自动追加 /v1。

2.2 Header 与鉴权

Header发送条件要求
Content-Type: application/jsonHTTP JSON 请求按 UTF-8 JSON 解析
Authorization: Bearer <API Key>配置了 API Key校验约定的接入密钥
无 Authorization未配置 API Key按约定提供无密钥接口;不要求占位 Key
OpenAI-Beta: realtime=v1Base64 音频 ASR 握手见第 8.2 节
X-QwenWork-External-User-Id开启“透传第三方用户 ID”,且第三方用户 ID 可用用户关联标识
X-QwenWork-Session-Id主模型 Agent 对话开启“透传第三方用户 ID”,且会话 ID 可用会话关联标识
X-QwenWork-Turn-Id主模型 Agent 对话开启“透传第三方用户 ID”,且轮次 ID 可用轮次关联标识

三个关联 Header 共用“透传第三方用户 ID”开关,无需另行开启会话或轮次透传。主模型 Agent 对话按各字段的可用值独立发送,缺失字段省略;专项模型和搜索服务只透传第三方用户 ID。

表中 Header 按约定处理。客户服务应允许未使用的额外请求头;异步接口无需识别或校验异步标记 Header。

API Key 均可选。 关联 Header 不替代鉴权;网页搜索的 userId/requestId 保留其请求体语义。

2.3 成功、失败与文件结果

同步成功须返回最终结果;异步提交须返回任务 ID,成功查询须返回产物。使用规定的字段和层级,不额外包装响应。

产物返回可下载的绝对 URL,文件格式须正确且非空。下载请求不携带接口 Bearer;需要鉴权时提供有效期充足的签名 URL。

输入图片支持约定的 URL 或 Data URI。客户服务须能读取 URL,或解码 Data URI。

3. Chat Completions:主模型、视觉理解与语音润色

3.1 普通请求与响应

QwenWork 对已配置的完整 Endpoint 发送 POST:

{
  "model": "company-chat",
  "messages": [{"role": "user", "content": "你好,请介绍一下自己。"}],
  "stream": false
}

客户服务返回:

{
  "id": "chat-001",
  "object": "chat.completion",
  "created": 1789420800,
  "model": "company-chat",
  "choices": [{"index": 0, "message": {"role": "assistant", "content": "你好,我是企业助手。"}, "finish_reason": "stop"}],
  "usage": {"prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20}
}

model 使用实际模型 ID。messages 保持 system、user、assistant、tool 的顺序;消息内容可能是字符串,也可能是内容块数组。

3.2 流式输出和工具调用

stream=true 时,返回 Content-Type: text/event-stream,逐条发送 SSE;每条 data: 记录后有一个空行:

data: {"id":"chat-001","object":"chat.completion.chunk","created":1789420800,"model":"company-chat","choices":[{"index":0,"delta":{"role":"assistant","content":"你好"},"finish_reason":null}]}

data: {"id":"chat-001","object":"chat.completion.chunk","created":1789420800,"model":"company-chat","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]

用于 Agent 的模型还需支持 tools、tool_choice、assistant 的 tool_calls 和 tool 角色的 tool_call_id。流式工具调用通过 delta.tool_calls 返回,各工具用稳定的 index/id 区分;function.arguments 是可分段拼接的 JSON 字符串。完成工具调用时使用 finish_reason: "tool_calls"。

支持 stream_options.include_usage=true,在结束前返回 usage;未知用量不伪造为 0。推理及其他扩展参数由双方约定。

工具请求示例:

{
  "model": "company-chat",
  "messages": [{"role":"user","content":"查询订单 order-demo 的状态。"}],
  "tools": [{"type":"function","function":{"name":"lookup_order","description":"查询订单状态","parameters":{"type":"object","properties":{"order_id":{"type":"string"}},"required":["order_id"]}}}],
  "tool_choice": "auto",
  "stream": false
}

模型要求调用工具时,响应示例:

{
  "id":"chat-tool-001","object":"chat.completion","created":1789420800,"model":"company-chat",
  "choices":[{"index":0,"message":{"role":"assistant","content":null,"tool_calls":[{"id":"call-001","type":"function","function":{"name":"lookup_order","arguments":"{\"order_id\":\"order-demo\"}"}}]},"finish_reason":"tool_calls"}]
}

后续请求会包含这条 assistant 消息,以及例如 {"role":"tool","tool_call_id":"call-001","content":"已发货"} 的工具结果消息。客户服务必须保留它们的对应关系,不把工具结果重写成无关联的普通 user 文本。

3.3 图片输入

视觉理解使用同一 POST 接口,图片作为消息内容块传入:

{
  "model": "company-vl",
  "messages": [{"role": "user", "content": [
    {"type": "text", "text": "这张图片里有什么?"},
    {"type": "image_url", "image_url": {"url": "https://assets.example/input.png"}}
  ]}],
  "stream": false
}

图片也可能以 Data URI 传入;客户服务应按双方确认的输入方式处理。语音润色使用纯文本消息,返回优化后的文字。

3.4 接入预检请求

QwenWork 的主模型连通性预检会向 Chat Endpoint 发送短请求,接口需支持以下字段组合:

{"model":"company-chat","messages":[{"role":"user","content":"OK"}],"max_tokens":1,"stream":false,"enable_thinking":false}

预检包含 enable_thinking=false。客户服务须接受该字段并关闭推理。

4. 图片与视频共用的异步任务流程

QwenWork → 提交 Endpoint:POST 生成请求
客户服务 → QwenWork:task_id + task_status
QwenWork → 查询 Endpoint:GET,替换 {task_id}
客户服务 → QwenWork:任务状态;成功后附产物 URL
QwenWork → 产物 URL:下载文件并保存到企业对象存储

异步提交由接口协议确定,无需通过额外 Header 开启。客户服务直接接收提交请求并返回任务 ID。

提交和查询使用同一模型配置的可选 API Key。查询使用约定的完整地址,例如 https://media.example/tasks/{task_id};占位符必须恰好出现一次,并单独占一个路径段。不要通过提交响应另行指定查询服务器。

提交成功返回 2xx JSON,不要求 202 + Location:

{"request_id":"req-submit-001","output":{"task_id":"task-001","task_status":"PENDING"}}

处理中查询返回:

{"request_id":"req-query-001","output":{"task_id":"task-001","task_status":"RUNNING"}}
output.task_status客户服务 表达的状态
PENDING已接受,等待执行
RUNNING执行中
SUCCEEDED成功,查询结果必须包含可下载产物
FAILED执行失败,返回 output.code/message
CANCELED已取消
UNKNOWN任务不存在、已过期或状态无法确定

任务 ID 使用字母、数字、-、_、.、:,最长 200 个字符,不能是单独的 . 或 ..。查询返回的 ID 必须与请求一致,任务完成后不能回到处理中。已知任务需要在约定保留期内持续可查,包括 客户服务 实例重启之后。

任务失败示例:

{"request_id":"req-query-002","output":{"task_id":"task-001","task_status":"FAILED","code":"InvalidParameter","message":"Unsupported size."}}

提交响应丢失不等于任务未创建。对接方应按“结果未知”处理,不依赖 QwenWork 重发生成 POST;查询可以继续查询原任务。

5. QwenWork Image Sync / Async:图片生成与编辑

5.1 两种合同的区别

项目QwenWork Image SyncQwenWork Image Async
请求体第 5.2 节的 model/input/parameters同左
第一次 HTTP 响应最终图片结果output.task_id/task_status
后续查询无GET 配置的查询 Endpoint
最终图片字段output.choices[].message.content[].image同一字段,位于成功查询响应中

Sync 和 Async 共用以下请求结构。Sync 须在同一次响应中返回图片;Async 须提供任务提交和查询接口。

5.2 共用请求体

文生图的 POST 请求:

{
  "model": "company-image",
  "input": {
    "messages": [{
      "role": "user",
      "content": [{"text": "一间明亮的花店。"}]
    }]
  },
  "parameters": {"n": 1, "size": "1024*1024", "watermark": false}
}

图像编辑时,参考图在前、文字在后;同一接口接收:

{
  "model": "company-image",
  "input": {
    "messages": [{
      "role": "user",
      "content": [
        {"image": "https://assets.example/source.png"},
        {"text": "把背景改成浅蓝色,保留主体。"}
      ]
    }]
  },
  "parameters": {"n": 1, "watermark": false}
}
字段类型 / 必需性约束
model必传 string使用约定的实际模型 ID
input.messages必传 array,一个 user 消息读取 content,不能按 Chat 的 messages 顶层位置解析
content[].text非空 string提示词,最多 2500 字符
content[].image编辑时提供,一项一张图接收 URL / 已约定的 Data URI,保留参考顺序
parameters.n必传 integer请求数量,1–4
parameters.size可选 string宽*高;自动尺寸时省略,不发送 auto 字符串
parameters.watermark必传 boolean执行水印要求;若无法支持须在接入时明确

输出 PNG,编辑输入 1–3 张。支持尺寸: 1024*1024、1536*1024、1024*1536、2048*2048、2048*1152,以及省略 size 的自动尺寸。接入前确认服务支持这些参数。

5.3 Sync 成功与失败响应

对同一次 POST 返回 HTTP 200、Content-Type: application/json:

{
  "request_id": "req-image-sync-001",
  "output": {
    "choices": [{
      "finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": [{"image": "https://assets.example/result-001.png"}]
      }
    }]
  }
}

QwenWork 按顺序读取 output.choices[].message.content[].image。每张图片一个 image 项,type 不是必填字段。至少返回一张有效图片,不超过请求的 n;返回后这些地址必须可以下载。Sync 不要求 task_id/task_status,也不会因为响应中出现它们而开始轮询。

失败使用非 2xx,例如参数不支持时返回 HTTP 400:

{"request_id":"req-image-sync-002","code":"InvalidParameter","message":"Unsupported image size."}

缺少图片、图片地址无效或文件无法下载均不能视为生成成功。Sync 接口及中间网关要允许完整生成所需的请求时长;生成响应超时应保留“结果未知”的判断,不自动重新提交生成。

5.4 Async 提交与查询响应

向 Async Endpoint 提交相同请求体,先返回任务:

{"request_id":"req-image-async-001","output":{"task_id":"image-001","task_status":"PENDING"}}

随后按第 4 节轮询。任务成功时的 GET 响应:

{
  "request_id": "req-image-query-001",
  "output": {
    "task_id": "image-001",
    "task_status": "SUCCEEDED",
    "choices": [{
      "message": {"role": "assistant", "content": [{"image": "https://assets.example/result-001.png"}]}
    }]
  }
}

任务状态使用第 4 节的固定枚举。查询必须返回相同的 task_id;SUCCEEDED 的查询必须有图片。提交接口即使直接返回 SUCCEEDED,也应确保后续查询可以取得最终产物,不能依赖提交响应替代查询接口。

6. QwenWork Video:视频生成

使用第 4 节的异步提交与查询。基础请求:

{
  "model": "company-video",
  "input": {"prompt": "镜头缓慢掠过山间湖泊。"},
  "parameters": {"duration": 5, "resolution": "720P", "watermark": false, "prompt_extend": false}
}

6.1 基础参数

字段类型要求
modelstring实际模型 ID
input.promptstring非空提示词,最多 2500 字符
input.mediaarray,可选参考图片,格式见下表
parameters.durationinteger,可选时长,4–15 秒
parameters.resolutionstring,可选480P、720P、1080P
parameters.watermarkboolean是否添加水印
parameters.prompt_extendboolean固定发送 false;接受该值,不需要提供提示词扩写能力

生成方式由 input.media 决定,不另传 operation:

方式media 内容
文生视频省略
图生视频[{"type":"first_frame","url":"https://assets.example/first.png"}]
首尾帧一个 first_frame 和一个 last_frame,各含 url
多参考图多个 reference_image,各含 url

6.2 可选扩展

以下字段仅在指定时发送;未指定时省略。接入前确认支持范围,有效值不得静默忽略,不支持时返回参数错误。

字段类型含义
parameters.ratiostring画幅:adaptive、16:9、4:3、1:1、3:4、9:16
parameters.audiobooleantrue 生成音轨,false 不生成音轨
parameters.seedinteger随机种子,0–2147483647

6.3 成功查询

{"request_id":"req-video-001","output":{"task_id":"video-001","task_status":"SUCCEEDED","video_url":"https://assets.example/result.mp4"}}

video_url 必须指向可下载的 MP4。失败状态和格式见第 4、10 节。

7. QwenWork Music:音乐生成

对完整音乐 Endpoint 发送 POST,在同一次 HTTP 响应中返回音频地址:

{
  "model": "company-music",
  "input": {
    "prompt": "温暖轻快的原声吉他音乐。",
    "lyrics": "清晨的风吹过窗前",
    "format": "mp3",
    "enable_aigc_watermark": false
  }
}
字段类型约束
modelstring实际模型 ID
input.promptstring非空音乐描述,最多 2000 字符
input.lyricsstring,可选歌词,最多 20000 字符;提供时按歌词生成
input.is_instrumentalboolean,可选true 表示生成纯音乐,此时不提供 lyrics
input.formatstring固定为 mp3
input.enable_aigc_watermarkboolean是否添加水印
{"request_id":"req-music-001","output":{"audio":{"url":"https://assets.example/song.mp3","id":"audio-001"},"finish_reason":"stop"}}

同一次 HTTP 响应返回 output.audio.url;audio.id 仅为音频标识,无任务查询。接口和网关应支持生成所需的长请求。

8. QwenWork Realtime:实时语音识别

两种接口均为实时双向流式识别:持续发送音频,同时接收转写结果。按 Endpoint 选择音频编码和控制事件。

8.1 实时流式 ASR(二进制音频)

Endpoint 为 /api-ws/v1/inference,模型 ID 放在消息体中,地址不带 query。

  1. 完成 WebSocket 握手;如配置密钥,握手包含 Bearer Header。
  2. QwenWork 发送 run-task,客户服务回应 task-started。
  3. QwenWork 开始发送 PCM16、单声道、16 kHz 的二进制音频帧;客户服务持续返回识别结果。
  4. QwenWork 发送 finish-task;客户服务返回剩余结果和 task-finished。

启动消息:

{
  "header": {"action": "run-task", "task_id": "asr-001", "streaming": "duplex"},
  "payload": {
    "task_group": "audio", "task": "asr", "function": "recognition",
    "model": "company-asr-streaming",
    "parameters": {"format": "pcm", "sample_rate": 16000}, "input": {}
  }
}

客户服务 就绪消息:

{"header":{"event":"task-started","task_id":"asr-001"},"payload":{}}

识别结果:

{
  "header": {"event": "result-generated", "task_id": "asr-001"},
  "payload": {
    "output": {"sentence": {"sentence_id": 1, "text": "现在开始会议。", "sentence_end": true, "heartbeat": false}},
    "usage": {"duration": 2.5}
  }
}

sentence_id 从 1 开始标识句子。sentence_end=false 的文本可被同句后续结果修订,true 才是该句最终文本。usage.duration 为任务累计用量,不逐句相加。句子结束不等于整个任务结束。

结束消息及确认:

{"header":{"action":"finish-task","task_id":"asr-001","streaming":"duplex"},"payload":{"input":{}}}
{"header":{"event":"task-finished","task_id":"asr-001"},"payload":{}}

任务失败发送 header.event: "task-failed",并提供同一 task_id、header.error_code 和 header.error_message。断开连接不能代替正常结束事件。

8.2 实时流式 ASR(Base64 音频)

Endpoint 为 /api-ws/v1/realtime。URL 携带 ?model=<模型ID>。握手还包含 OpenAI-Beta: realtime=v1。

客户服务返回 session.created;QwenWork 发送配置并等待 session.updated:

{
  "event_id": "event-001", "type": "session.update",
  "session": {
    "modalities": ["text"], "input_audio_format": "pcm", "sample_rate": 16000,
    "turn_detection": {"type": "server_vad", "threshold": 0.5, "silence_duration_ms": 800}
  }
}

音频以 JSON 文本帧发送,audio 是 PCM 字节的 Base64:

{"event_id":"event-002","type":"input_audio_buffer.append","audio":"AAAAAA=="}

客户服务 用 conversation.item.input_audio_transcription.text 返回预览,用 conversation.item.input_audio_transcription.completed 的 transcript 返回最终文字;通过 item_id 对应同一条转写。QwenWork 最后发送 session.finish,客户服务 发送 session.finished 后结束会话。错误使用原生 error 事件。

最小服务端事件示例(每个 JSON 独立作为一条 WebSocket 文本消息):

{"event_id":"server-001","type":"session.created","session":{"id":"session-001"}}
{"event_id":"server-002","type":"session.updated","session":{"id":"session-001"}}
{"event_id":"server-003","type":"conversation.item.input_audio_transcription.text","item_id":"item-001","text":"现在开始","stash":"会"}
{"event_id":"server-004","type":"conversation.item.input_audio_transcription.completed","item_id":"item-001","transcript":"现在开始会议。"}

QwenWork 的结束请求与服务端确认:

{"event_id":"event-003","type":"session.finish"}
{"event_id":"server-005","type":"session.finished","session":{"id":"session-001"}}

两种实时语音接口的错误格式见第 10.3 节。

9. QwenWork Search:网页与图片搜索

两类搜索均使用 POST / JSON、可选密钥,请求和响应结构分别如下。

9.1 网页搜索

基础请求如下。实际请求还可能包含下表中的扩展字段;空字符串、null 或空数组表示未指定条件,可忽略。

{
  "query": "Kubernetes 部署指南",
  "count": 5,
  "contents": {"mainText": false, "markdownText": true, "summary": false}
}

基础字段

字段类型含义
querystring非空搜索词
countinteger 或 null请求结果数量
contentsobject 或 nullmainText、markdownText、summary 均为 boolean,指定需要的正文格式或摘要

可选扩展

字段类型含义
timeRangestringOneDay、OneWeek、OneMonth、OneYear、NoLimit 或空,分别表示近一天、一周、一月、一年、不限时间
sitestring限定站点
allowed_domainsstring[] 或 null允许的域名
blockSites、blocked_domainsstring[] 或 null排除的站点或域名;均须接收
category、recencystring分类或时间扩展,非空值的含义由双方约定
userId、requestIdstring可选关联标识,不作为鉴权凭据

扩展字段可能以空值随请求发送。非空筛选条件须执行;不支持或条件冲突时明确报错,不返回未筛选结果伪装成功。

成功响应:

{
  "requestId": "search-001",
  "pageItems": [{
    "title": "部署指南", "link": "https://docs.example/deployment",
    "snippet": "部署入门说明", "markdownText": "# 部署指南\n这是正文。"
  }]
}

pageItems 为有序数组;正文与摘要按 contents 返回。可选结果字段包括 mainText、summary、publishedTime、hostname、hostLogo。未知字段省略,空结果返回 {"pageItems":[]}。默认超时 3 秒。错误格式见第 10.4 节。

9.2 图片搜索

客户服务只收到搜索词:

{"query":"山间湖泊"}

成功响应:

{"imageItems":[{"title":"Mountain lake","imageUrl":"https://assets.example/lake.jpg","width":1024,"height":768}]}

imageUrl 指向可访问的图片文件,宽高可省略或为 null。无结果返回 {"imageItems":[]}。请求不发送 count。

成功时省略 errorCode/errorMsg,不返回 errorCode=0。默认超时 5 秒,响应体上限 4 MiB;错误格式见第 10.4 节。

10. 错误码与失败响应

通用要求

  • 错误码用于程序识别,必须稳定、非空;错误消息必须非空且可读,不含密钥或堆栈。
  • 请求未被接受时使用对应的非 2xx 状态;已接受的异步任务失败通过任务查询返回。
  • 搜索业务错误允许 HTTP 200,但必须返回错误字段。其他接口不能仅在普通成功响应中附一段错误文字。
  • 不用空结果、空产物或成功状态掩盖失败。

HTTP 状态与建议错误码

场景HTTP 状态建议 code(string)
参数非法或不支持400InvalidParameter / UnsupportedParameter
密钥缺失或无效401Unauthorized
配额不足402"402"(固定业务码)
无访问权限403Forbidden
模型或任务不存在404ModelNotFound / TaskNotFound
请求体过大413PayloadTooLarge
请求频率或并发限流429RateLimitExceeded
服务内部异常500InternalError
服务暂不可用503ServiceUnavailable
依赖调用超时504Timeout

402 为固定业务码,表示配额不足;429 仅表示请求限流。 其余码名为建议值;已有稳定业务码可沿用,并随接口说明交付含义表。HTTP 语义与下述响应结构必须一致。429/503 可携带 Retry-After;返回该 Header 不代表调用方一定重试。生成提交超时或响应丢失可能已创建任务,不能据此重复生成。

配额不足:402

因配额不足而拒绝新请求时,返回 HTTP 402,并按接口结构携带业务码。配额恢复前,不应把此错误作为短暂限流进行重试。

返回场景错误字段值
对话请求 / SSE 错误事件error.codestring:"402"
图片、视频、音乐请求失败codestring:"402"
已接受的异步任务失败output.code,同时 output.task_status=FAILEDstring:"402"
二进制音频 ASR 失败事件header.error_codestring:"402"
Base64 音频 ASR 失败事件error.codestring:"402"
网页 / 图片搜索业务失败errorCodeinteger:402

SSE / WebSocket 已建立后,通过错误事件返回,不能改写握手或响应状态。异步任务查询和搜索业务错误可保持 HTTP 200,此时以对应字段中的 402 表达配额不足。

对话请求被拒绝(HTTP 402):

{"error":{"code":"402","type":"insufficient_quota","message":"配额不足,请补充配额后重试。"}}

网页搜索业务失败(HTTP 200):

{"requestId":"search-001","pageItems":[],"errorCode":402,"errorMsg":"配额不足,请补充配额后重试。"}

10.1 对话接口

非 2xx 响应的 error.code、error.type、error.message 为非空 string;error.param 可选:

{"error":{"code":"ModelNotFound","type":"invalid_request_error","param":"model","message":"Requested model was not found."}}

SSE 已开始后无法修改 HTTP 状态,应发送相同 error 对象并结束流,不再发送正常完成结果:

data: {"error":{"code":"InternalError","type":"server_error","message":"Generation failed."}}

10.2 图片、视频与音乐

提交或同步请求失败使用非 2xx。code、message 为非空 string,request_id 用于排查:

{"request_id":"req-error-001","code":"UnsupportedParameter","message":"Unsupported parameter value."}

已接受的异步任务执行失败,GET 查询返回 HTTP 200;task_id 保持一致,错误放在 output 内:

{"request_id":"req-query-002","output":{"task_id":"task-001","task_status":"FAILED","code":"GenerationFailed","message":"Unable to generate the requested media."}}

取消使用 CANCELED;任务状态无法确定或已过期可使用 UNKNOWN,不得返回 SUCCEEDED。查询请求本身失败时使用非 2xx 和顶层 code/message;不存在的任务也可明确返回 404 / TaskNotFound。

10.3 实时语音识别

握手前失败使用非 2xx。连接建立后,错误通过对应事件返回。

二进制音频接口:header.error_code、header.error_message 为非空 string,task_id 与请求一致。

{"header":{"event":"task-failed","task_id":"asr-001","error_code":"InvalidAudio","error_message":"Unsupported audio format."},"payload":{}}

Base64 音频接口:error.code、error.type、error.message 为非空 string。

{"event_id":"error-001","type":"error","error":{"code":"InvalidAudio","type":"invalid_request_error","message":"Unsupported audio format."}}

失败事件不能用正常结束事件代替。

10.4 网页与图片搜索

HTTP 200 的业务错误必须包含 integer 类型的 errorCode 和非空 string 类型的 errorMsg。建议使用与上表 HTTP 状态对应的数值,也可使用双方约定的非零整数业务码。

网页搜索失败:

{"requestId":"search-001","pageItems":[],"errorCode":503,"errorMsg":"Search service unavailable."}

图片搜索失败:

{"imageItems":[],"errorCode":400,"errorMsg":"Invalid search query."}

成功时省略 errorCode/errorMsg,不使用 errorCode: 0。真实空结果仍是成功,只返回空结果数组。HTTP 非 2xx 表示请求失败,可附 {"code":"ServiceUnavailable","message":"Search service unavailable."}。

11. 联调与交付要求

11.1 交付接口说明

每项能力提供一份接口登记信息:协议名称、模型 ID(搜索除外)、完整 Endpoint、鉴权方式,以及异步图片/视频的查询 Endpoint。图片必须明确写 Sync 或 Async;ASR 须明确 Endpoint 及音频编码(二进制或 Base64)。

同时说明实际支持的输入类型、图片数量/尺寸、视频模式/时长、素材访问方式、产物 URL 有效期、任务保留期、超时及并发限制。密钥单独交付,不放在协议示例或联调日志中。

11.2 最小协议验收用例

接口必须覆盖的用例
Chat CompletionsJSON、SSE 正常结束、usage、工具调用 ID 与 arguments 增量;VL 还需验证图片内容块
Image Sync文生图、编辑、多图响应;同一次 POST 返回真实图片,无后续查询
Image Async提交、处理中查询、成功图片、失败、实例重启后原任务可查
Video每个已开放模式的输入映射、任务状态、MP4 可下载
Musicmodel、prompt、可选歌词、水印、同次响应返回可播放 MP3
ASR握手、就绪事件、音频编码、临时与最终文本、正常结束、失败事件
WebSearch全字段/空值、正常结果、空结果、非 2xx 和业务错误
ImageSearchquery-only、imageItems、空结果、errorCode=0 被识别为失败
公共行为按约定验证有/无密钥、错误凭据、非法参数、超时、无效产物和过期 URL

真实生成与协议解析分别验收:正确的 JSON 形状不等于图片、视频、音频可用。调用成功记录请求标识、HTTP 状态、任务状态与产物校验结果,避免保存密钥或用户原始内容。

11.3 常见问题

表现优先检查
HTTP 200,但生成被判失败是否返回了协议要求的结果字段;是否又包了一层通用 data;产物 URL 是否可下载
同步生图一直没有结果是否返回最终图片;网关是否提前超时
异步任务查不到task_id 是否稳定;GET 路径替换是否正确;不同实例是否能查询同一任务
图像编辑内容不正确是否按顺序处理 image 内容块;是否按 input.messages 读取请求
图片搜索“成功”却报错是否发送了 errorCode=0;是否误用了 pageItems/data 等结果字段
ASR 没有转写或无法结束是否混用了 binary 与 Base64;是否遗漏就绪或 task-finished/session.finished 事件