簡短回答
同一段內容,流式和非流式遇到內容過濾時的結果可能完全不同:
- 非流式:某條官方線路觸發內容安全過濾時,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 模型拒答長什麼樣?
被模型自己拒答時的輸出體與識別方法
流式和非流式呼叫有什麼區別?
兩種呼叫方式的接入、計費與常見誤區
如何避免介面超時?
非流式長輸出的超時設定
內容安全如何合規性?
平臺內容安全與合規政策