OpenAI API 流式輸出(streaming)怎麼寫:stream=True、response.output_text.delta 事件、Python 和 Node 示例

用 OpenAI API 做聊天介面,想邊生成邊顯示?在 Responses 請求裏設 stream 為 true,按事件類型讀取 response.output_text.delta。本文給 Python 和 Node 各一段可運行示例,講事件生命週期、拼接完整文本、錯誤事件,以及官方提到的審核風險。

NNathaniel bigo··原創首發·AI 輔助撰寫
8 分鐘讀完
資料核對於 2026-11-05 · 依據官方文檔與公開資料整理 其他 帳號
本文根據 OpenAI 官方《Streaming API responses》和 Quickstart 整理,資料核對於 2026-11-05。代碼裏的模型名取自官方當天示例,請以官方模型頁為準。本站(bigolab.com)不是 OpenAI 官方網站。API 是按用量計費的獨立服務,與 ChatGPT 訂閱分開計算,Key 的獲取見 /guides/openai-api-key。

適用於誰

  • 用 OpenAI API 做聊天介面、寫作工具,希望文字邊生成邊顯示的開發者;
  • 已經能發出第一個請求(見 /guides/openai-api-python-quickstart),想了解流式事件到底是什麼的人;
  • 用 Node.js / TypeScript 的前端或全棧開發者。

結論先說

  1. 預設不是流式的。 官方說,普通請求會等整個輸出生成完才一次性返回,輸出長的時候要等。
  2. 流式的寫法:在 Responses 請求裏加 stream=True(Node 裏是 stream: true),得到的不是一個結果,而是一串事件。
  3. 事件是帶類型的,用 event.type 區分。寫文本時常看四個:response.created、response.output_text.delta、response.completed、error。
  4. 文字增量在 response.output_text.delta 裏,用 event.delta 取。
  5. 流式讓內容審核更難。 官方明確提醒,生產應用裏流式輸出會讓部分內容更難評估,審核分數也要等完整輸出生成後才有。

OpenAI 流式輸出的事件順序:created、多次 output_text.delta、completed,出錯時是 error 事件

圖:本站根據 OpenAI 官方《Streaming API responses》 整理的示意圖

一、事件長什麼樣

官方說,Responses API 用語義事件來流式返回,每種事件有預先定義的結構。其中有的只出現一次,有的會隨着生成多次出現:

  • response.created:響應開始創建,出現一次;
  • response.output_text.delta:一小段新文字,出現很多次;
  • response.completed:整個響應完成,出現一次;
  • error:出錯。

完整事件列表見官方 API 參考裏的 streaming 部分,正文不全部列出。

二、Python 示例

先安裝並設定密鑰(Windows 的設定方式見 /guides/openai-api-key):

pip install openai
python
from openai import OpenAI

client = OpenAI()  # 從環境變量 OPENAI_API_KEY 讀取密鑰

stream = client.responses.create(
    model="gpt-6-astra",  # 以官方模型頁當天為準
    input="用三句話介紹什麼是流式輸出。",
    stream=True,
)

full_text = ""
for event in stream:
    if event.type == "response.output_text.delta":
        full_text += event.delta
        print(event.delta, end="", flush=True)
    elif event.type == "response.completed":
        print("\n--- 完成 ---")
    elif event.type == "error":
        print("\n出錯:", event.message)

print("完整文本長度:", len(full_text))

flush=True 讓文字立即顯示在終端裏。full_text 把增量拼起來,方便流結束後儲存或再處理。

三、Node.js 示例

新建一個 stream.mjs 文件(.mjs 可以直接使用 import 和頂層 await):

npm install openai
javascript
import OpenAI from "openai";

const client = new OpenAI(); // 從環境變量 OPENAI_API_KEY 讀取密鑰

const stream = await client.responses.create({
  model: "gpt-6-astra", // 以官方模型頁當天為準
  input: "用三句話介紹什麼是流式輸出。",
  stream: true,
});

let fullText = "";
for await (const event of stream) {
  if (event.type === "response.output_text.delta") {
    fullText += event.delta;
    process.stdout.write(event.delta);
  } else if (event.type === "response.completed") {
    console.log("\n--- 完成 ---");
  } else if (event.type === "error") {
    console.error(event.message);
  }
}
console.log("完整文本長度:", fullText.length);

運行:node stream.mjs。官方示例裏的判斷結構與上面一致。

四、常見的幾個坑

流式輸出出問題怎麼辦:什麼都沒顯示、文字一次性出現、中途斷掉、需要儲存完整文本、前端拿不到增量

圖:本站根據 OpenAI 官方《Streaming API responses》 整理的示意圖,排查表為本站補充

  • 什麼也沒顯示:檢查有沒有真的加 stream=True;再檢查有沒有隻打印 response.completed 之類的事件,漏掉了 response.output_text.delta;
  • 文字還是一次性出來:終端沒有立即刷新(Python 要 flush=True),或者中間的代理、網關把響應緩衝了;
  • 中途斷掉:把已收到的文本先儲存,再按業務決定要不要重試。重試會重新計費,429 等限流問題見 /guides/openai-api-429-error;
  • 要儲存完整答案:像示例那樣拼接增量,或者在 response.completed 事件裏讀完整響應;
  • 想知道用了多少 token:用量見 /guides/openai-api-pricing-billing,價格以官方頁面當前顯示為準。

五、要給用戶看,怎麼轉給瀏覽器

官方流式頁講的是 API 和伺服器之間的流。網頁前端怎麼拿到,官方這一頁沒有展開。本站的一般性建議:密鑰只放在你自己的伺服器上,不要寫進網頁或手機 App;伺服器收到 OpenAI 的事件後,用你自己的方式(例如伺服器發送事件或 WebSocket)轉給前端,只轉發文字增量就夠了。

官方提到的另外兩個方向:想要持久的 WebSocket 連接並用 previous_response_id 增量輸入,看官方的 Responses WebSocket 模式;流式的函數調用和結構化輸出,官方另有專門的指南。

六、關於審核風險

官方在流式頁專門有一節“Moderation risk”:生產應用裏流式輸出會讓內容審核更困難,因為部分輸出更難評估,這可能影響獲批的使用。如果在生成請求時請求審核分數,分數會在完整輸出可用後才到,不會跟着增量事件一起出現。

所以做面向公眾的產品時,要把審核放進設計裏,比如先在伺服器收齊、檢查,再決定怎麼展示,具體做法以官方審核指南為準。

什麼時候值得用流式

  • 適合:聊天介面、寫作助手、需要讓用戶儘早看到開頭的長回答。官方的理由就是:模型還在繼續生成時,你已經可以開始顯示或處理開頭部分;
  • 不一定需要:後台批處理、只需要最終結果的腳本、要先整體校驗再使用的輸出。這些場景用普通請求更簡單,代碼也更短;
  • 需要先想清楚:出錯後怎麼辦。非流式請求要麼成功要麼失敗,流式請求可能已經給用戶顯示了一半文字才斷開,介面上要有“生成中斷、重試”的處理,這是本站的一般性建議。

常見問題

Q:舊資料裏的 Chat Completions 流式寫法還能用嗎?

官方流式頁對 Chat Completions 單獨有一段:流式返回的是 chunk.choices[0].delta,取的是 delta 裏的內容,和 Responses 的 event.delta 不是一回事。新項目建議優先用 Responses,兩者區別見 /guides/openai-responses-api。

Q:流式會比非流式貴嗎?

官方流式頁沒有這樣說明,計費看的是用量,以官方價格頁為準,見 /guides/openai-api-price-official-table。

Q:模型名報錯怎麼辦?

示例模型名會更新,先到官方模型頁確認你的帳號可用的模型。

參考資料

  • OpenAI 官方:Streaming API responses — https://platform.openai.com/docs/guides/streaming-responses
  • OpenAI 官方:Quickstart — https://developers.openai.com/api/docs/quickstart

Nathaniel 的更多內容

  1. 01

    Claude Code 在 Windows 上的常見坑:Git Bash 還是 PowerShell、路徑反斜槓、假報錯、WSL 怎麼選

    Windows 上用 Claude Code,裝好之後最容易踩的是:用哪個 shell、路徑寫法不一致、grep 沒匹配就報錯、鉤子沒生效、WSL 和原生怎麼選。本文逐條按官方文檔整理原因和處理辦法,附三段提示詞和一張對照表。

    Claude0
  2. 02

    Claude Code Hooks 實戰「提交前自動跑測試」:PreToolUse 攔住 git commit,測試不過就退出碼 2,附 Windows 注意點

    只寫一個完整例子:讓 Claude Code 每次要執行 git commit 之前,先自動跑項目測試,沒通過就攔下並把輸出交給它修。本文按官方 Hooks 文檔給出腳本、settings.json 配置、測試方法、排錯和 Windows 的兩處坑。

    Claude0
  3. 03

    Claude Code 自定義斜槓命令與 Skill 實戰:從零寫一個「生成更新日誌」的 /release-notes,含傳參、預執行命令和調試

    概念看過了,還是不知道從哪下手?本文按 Claude Code 官方「Extend Claude with skills」寫一個完整可用的例子:用 /release-notes 根據 git 記錄生成更新日誌,覆蓋目錄、frontmatter、傳參、預執行命令、預授權和調試。

    Claude0
  4. 04

    Claude Code 部署網站:先寫 Dockerfile 和 compose 在本機跑通,再按清單上雲伺服器,別讓它直接改線上

    想讓 Claude Code 幫你把網站部署到雲伺服器。本文只寫通用做法,按 Docker 官方文檔講:讓它寫 Dockerfile、.dockerignore 和 compose,在本機跑通,端口和數據卷怎麼設,再給出上線清單,並說明為什麼不要讓它直接動線上機器。

    Claude0
  5. 05

    Claude Code 寫爬蟲與數據清洗:先查 robots.txt 和網站條款,控制頻率,原始數據留一份再清洗

    想讓 Claude Code 寫爬蟲抓數據再清洗。本文先講合規:robots.txt 不是授權也不是安全措施、網站條款要自己讀;再講怎麼用 Python 標準庫檢查規則、小樣本先試、儲存原始數據,以及用 pandas 清洗,附四段提示詞。

    Claude0
  6. 06

    Claude Code 寫 Chrome 擴展:按 Manifest V3 起步,加載未打包的擴展,改了哪些文件要重新加載

    想讓 Claude Code 幫你寫一個 Chrome 擴展。本文按 Chrome 官方擴展文檔講:manifest.json 的最小寫法、在 chrome://extensions 加載未打包的擴展、哪些改動要刷新、怎麼看控制檯和報錯,再給四段提示詞,以及權限要盡量少。

    Claude0

同產品的其他教學

  1. 01

    OpenAI API 的 token 怎麼算、怎麼估算費用:input_tokens 計數接口、tiktoken 和隱藏的輸出 token

    發請求前想知道會用多少 token?官方有 Responses 的 input_tokens 計數接口,能把文字、圖片、文件、工具定義一起算準;本地 tiktoken 只適合純文本。本文給 Python 和 Node 示例,講輸出 token 為什麼可能比看到的多,以及怎麼估算費用。

    ChatGPT0
  2. 02

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一個請求,到流式、函數調用、聯網搜尋

    用 Node.js 調 OpenAI API:設定 OPENAI_API_KEY 環境變量,npm install openai,新建 example.mjs,用 client.responses.create 發出第一個請求。並列出圖片、文件、流式、函數調用、聯網搜尋和錯誤捕獲的 Node 寫法。

    ChatGPT0
  3. 03

    OpenAI API 用量層級(usage tiers)與速率限制怎麼提升:Free、Build、Launch、Grow 和後台 Limits 頁

    OpenAI API 的限速不是固定的:官方按累計購買額度把組織分成 Free、Build、Launch、Grow 四個層級,達到門檻自動升級。本文講 RPM、TPM 等指標、怎麼在後台查自己的限額、響應頭怎麼讀、花費上限和限速的區別,以及怎麼讓限額變得夠用。

    ChatGPT0
  4. 04

    OpenAI API 報錯 400、401、403、404、429、500、503 怎麼排查:按官方錯誤碼頁逐個看原因和解決辦法

    調用 OpenAI API 返回 400、401、403、404、429、500、503,各自什麼意思?本文按官方 Error codes 頁,每個狀態碼一節,寫清官方給的原因和解決辦法,並說明 404 在官方頁面裏的位置、429 的六種情形,附 Python 和 Node 的錯誤捕獲寫法。

    ChatGPT0
  5. 05

    OpenAI Realtime API 是什麼:語音到語音會話、WebRTC 與 WebSocket、臨時密鑰和事件機制

    Realtime API 讓模型直接處理音頻,做可以隨時打斷的語音助手。本文按官方文檔講它是什麼、什麼時候用、瀏覽器接入的流程、session 與事件、可用聲音、60 分鐘會話上限、安全標識,以及它和轉寫、文字轉語音的分工。

    ChatGPT0
  6. 06

    OpenAI 圖像生成 API 怎麼用:gpt-image 系列、images.generate 與 Responses 工具、尺寸質素和遮罩編輯

    用 OpenAI API 生成或編輯圖片,有 Image API 和 Responses 裏的 image_generation 工具兩條路。本文按官方文檔給 Python 和 Node 示例,講 gpt-image 模型選擇、尺寸質素格式參數、遮罩編輯、被攔截時的錯誤處理,以及需要組織驗證的提醒。

    ChatGPT0

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~