Skip to main content
调用 兼容模式 时,无论你用的是 OpenAI、Claude、Gemini、Grok、Qwen、GLM 还是其它模型,响应都遵循同一套 OpenAI schema。绝大多数解析逻辑是通用的——只要按本页的统一写法处理,换模型不用改代码。 本页帮你把「响应数据处理」一次做对:先讲共性,再用一张表列出少数需要兼容、但不影响接入的差异点。
请求侧(base_url、鉴权、换模型)见 兼容模式调用。本页只讲响应侧:拿到响应后怎么解析。

两种模式,同一端点

同一个 /v1/chat/completions,只由 stream 参数决定返回形态:

非流式响应

结构稳定,取 choices[0].message.content 即可:
非流式下七家主流模型高度一致,choices[0].message.content 可无差别取值。部分模型(如 OpenAI 系)message 里还会带 annotationsrefusal 等字段,按需读取,不用则忽略即可。

流式响应(SSE)

流式以 Server-Sent Events 逐块推送,每行形如 data: {...},以 data: [DONE] 收尾:
用官方 SDK 时迭代即可,核心是累加 delta.content

接入要点:少数差异,统一处理

不同模型的流式细节略有出入,但只要遵守下面几条,就能用同一套代码兼容全部模型
结束块的 choices 可能是空数组。 携带 usage 的最后一块,部分模型是 "choices":[](如 gpt-4.1-mini、grok、qwen、glm),直接取 choices[0] 会越界报错。解析每块前先判 choices 是否非空。

健壮解析参考实现

不依赖 SDK、直接处理原始 SSE 时,按下面的写法可覆盖上述全部差异:
推理模型(grok、qwen、glm 等)流式时会先推送 delta.reasoning_content(思考链),再推送 delta.content(正文)。上面的解析只取了 content,因此思考链被自动跳过。需要展示思考过程时的处理见 推理模型输出

usage 与计费

  • usage 在非流式响应里随结果一起返回;流式则在尾部某一块里返回(位置见上表,建议「读到即覆盖」)。
  • 各家字段细分不同:OpenAI 系有 completion_tokens_details,Gemini/Claude 额外带 input_tokens/output_tokens,推理模型带 reasoning_tokens。统一以 prompt_tokens / completion_tokens / total_tokens 三个标准字段为准。
流式 usage 的 total_tokens 不要全信。 实测个别模型(如 gpt-5.4-mini)流式尾块出现 total ≠ prompt + completion 的异常帧,同模型非流式则正常。计费请以账单为准,不要用流式那一帧的 total 做结算。

相关链接