需按流式/非流式区分解析:非流式直接json.loads();流式须按行切割、剥离"data: "前缀或用sseclient-py库,再逐块提取choices[0].delta.content(r1)或choices[0].message.content(v3),并累积拼接、校验finish_reason。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

火山引擎DeepSeek API返回结果怎么解析?你需要从流式响应的分隔符、JSON结构嵌套层级、字段命名差异三个维度入手,否则直接用常规JSON解析器会报错或丢数据。
确认返回模式是流式还是非流式
先看请求体中是否设置了"stream": true。R1模型在火山引擎MLP上默认启用流式输出,V3模型则需显式开启。流式响应不是单个JSON对象,而是多个以data:开头的文本块拼接而成,每个块都是独立JSON片段。
非流式响应才是标准单层JSON,可直接用json.loads()解析;流式响应必须按行切割、逐块解析,跳过空行和data:前缀。
流式响应的分块解析方法
方法一:按行读取+手动剥离前缀
用Python读取响应流时,对每行调用line.strip().removeprefix("data: ").strip()。注意:有些厂商(如xllm)要求分隔符为\r\n\r\n,而sglang默认用\n,火山引擎MLP实际使用\n作为块分隔符。
方法二:用SSE客户端库自动处理
推荐使用sseclient-py库,它内置识别data:前缀和多行事件格式,避免手动容错。安装后只需SSEClient(response)即可迭代获取纯JSON字符串。
【关键点】流式响应中"choices"数组每次只含一个元素,且"delta"字段可能为空字符串或仅含部分文本,必须累积拼接才能得到完整回复。
提取核心内容字段
第一步:定位到choices[0].delta.content路径。R1模型返回结构固定为{"choices": [{"delta": {"content": "...", "reasoning_content": "..."}}]},其中content是最终答案,reasoning_content是思维链中间步骤。
第二步:判断finish_reason是否为"stop"或"length"。只有该字段出现才表示生成结束,否则需继续接收后续chunk。
第三步:若需获取完整思维链,不要忽略reasoning_content字段——它在R1模型中独立存在,与content并列,不是嵌套在content里的子串。
处理R1与V3模型字段差异
第一步:检查响应中的"model"字段值。若为"deepseek-reasoner",则启用R1解析逻辑;若为"deepseek-chat",则按V3结构处理——此时reasoning_content字段不存在,content直接位于choices[0].message.content。
第二步:V3响应中"message"对象是完整消息体,R1响应中"delta"对象仅含增量内容。两者结构不兼容,不能共用同一段解析代码。
第三步:R1模型的"reasoning_content"可能包含换行符和缩进,直接拼接会导致格式错乱,建议用strip()清洗后再合并。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










