简短回答
同一段内容,流式和非流式遇到内容过滤时的结果可能完全不同:
- 非流式:某条官方线路触发内容安全过滤时,API易 会自动换一条官方线路重新生成。客户端拿到的是完整结果,只计费一次。
- 流式:内容一开始输出就已经发给客户端了,中途没法再换线路。这次请求会以
finish_reason: "content_filter"结束,已经生成的部分照常计费。 - 怎么选:需要逐字展示给用户的(对话、Agent 回复)用流式;程序生成完才使用的(剧本、分镜、翻译、结构化数据)用非流式。
过滤发生的两个时机
原厂的内容安全过滤会在两个时机介入,流式下两种形态都会出现:
两种情况的 HTTP 状态码都是
200,响应以 data: [DONE] 正常收尾,HTTP 错误日志里看不到,只能从流的最后一个事件判断。
流式与非流式对照
非流式的自动切换能大幅提高成功率,但不是 100%:如果内容明显违反原厂使用政策,换一条线路后也可能被模型自己拒答,形态见 OpenAI 模型拒答长什么样?。
实测对照
2026-09-25 (UTC+8),用gpt-5.6-terra、相同的参数(max_tokens=35000、temperature=0、reasoning_effort=high),对同一批影视分镜剧本分别发流式和非流式请求:
同一段内容原样重试,流式下的结果基本一样。决定是否触发的主要是内容本身,不是运气。
流式被截断时的输出形态
最后一个带choices 的事件没有正文,只有结束原因:
怎么选
用流式
- 聊天、客服、Agent 对话回复,用户需要立刻看到输出
- 需要中途打断(用户点「停止」)的场景
- 日常对话触发内容过滤的概率很低,流式的体验优势更重要
用非流式
- 剧本、分镜、小说章节等创作类长文本
- 批量翻译、信息抽取、结构化 JSON
- 结果要先解析、落库,再展示给用户
- 容易碰到敏感情节的内容(打斗、伤亡、犯罪)
stream 改成 false,其他参数不变。
非流式要等整段生成完才返回,长输出的推理模型可能要 30~100 秒甚至更久,请把这类请求的客户端超时设到 300 秒以上,见 如何避免接口超时?。前端如果需要进度感,可以先显示「生成中」,完成后一次性展示。
必须用流式时怎么处理
1
读流时记下 finish_reason
最后一个带
choices 的事件里,finish_reason 为 content_filter 就说明被过滤了。不要只看 HTTP 状态码。2
去掉末尾的拒答句
生成阶段被截断时,正文末尾带着一句英文拒答,先把它去掉,再决定怎么用已生成的部分。
3
改走非流式重试
对被截断的那一段,改用非流式重新请求,让平台自动切换线路。这比流式续写的成功率高得多。
4
连续被拦就调整表述
同一任务非流式也拿不到结果时,把敏感细节写得概括一些再试,不要原样重试。
常见问题
流式被截断的那次也扣费吗?
流式被截断的那次也扣费吗?
扣。原厂已经实际生成了这些内容,按实际输入、输出 tokens 计费。所以容易触发过滤的内容,用非流式更划算:非流式只计成功的那一次。
能关闭内容过滤吗?
能关闭内容过滤吗?
不能。过滤由原厂执行,API易 无法关闭,也无法调整尺度。平台能做的是在非流式请求被过滤时换一条官方线路重试。
同样的内容,为什么有时通过、有时被截断?
同样的内容,为什么有时通过、有时被截断?
不同官方线路的过滤尺度不完全一致,模型每次生成的措辞也不同,所以边界附近的内容可能时而通过、时而被截断。明显敏感的内容会被稳定拦截。
平台为什么不对流式请求也自动重试?
平台为什么不对流式请求也自动重试?
生成阶段的截断发生在正文已经发出之后,客户端已经收到并展示了前半段,这时再换线路从头生成,内容会对不上。所以流式请求只能由客户端识别
content_filter 后自行处理。相关文档
OpenAI 模型拒答长什么样?
被模型自己拒答时的输出体与识别方法
流式和非流式调用有什么区别?
两种调用方式的接入、计费与常见误区
如何避免接口超时?
非流式长输出的超时设置
内容安全如何合规性?
平台内容安全与合规政策