OpenAI Batch API 批量請求怎麼用:.jsonl 文件、24 小時完成、官方寫明的 50% 折扣和限額

一次要處理幾千條分類、評測或向量化任務?Batch API 把請求寫進 jsonl 文件異步執行,官方寫明 24 小時內完成、費用比同步接口低 50%、限速是獨立的一池。本文給 Python 示例,講文件格式、狀態、結果對應、取消與過期。

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

適用於誰

  • 有一大批不需要馬上出結果的任務:給幾千條評論分類、跑一遍評測、給內容庫批量做向量;
  • 同步請求被限速卡住(見 /guides/openai-api-429-error),想換一條獨立限額的通道的人;
  • 想在不改提示詞的前提下降低成本的人。

結論先說

  1. Batch API 是異步的:你把一批請求寫進一個 .jsonl 文件,上載後創建批處理,過一陣再取結果。
  2. 官方在頁面上寫明三個好處:費用比同步接口低 50%;有獨立的、高得多的限速池;每個批次 24 小時內完成,往往更快。這是官方 2026-11-05 的寫法,價格以官方頁面當天為準,見 /guides/openai-api-price-official-table。
  3. 不適合要立刻看到結果的場景,比如聊天。
  4. 結果順序可能和輸入不同,必須用每個請求裏的 custom_id 來對應。
  5. 同一個輸入文件只能用一個模型。

Batch API 的五步流程:準備 jsonl、上載、創建、查狀態、下載結果

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

一、準備 jsonl 文件

jsonl 是“每行一個 JSON”。每行是一個完整請求,含 custom_id(你自己起的唯一編號)、method、url 和 body。body 裏的參數就和直接調用那個端點時一樣。官方的兩行示例:

{"custom_id": "request-1", "method": "POST", "url": "/v1/responses", "body": {"model": "gpt-6-luna", "input": "Reply with the word blue.", "reasoning": {"effort": "none"}, "max_output_tokens": 64}}
{"custom_id": "request-2", "method": "POST", "url": "/v1/responses", "body": {"model": "gpt-6-luna", "input": "Reply with the word green.", "reasoning": {"effort": "none"}, "max_output_tokens": 64}}

官方列出的可用端點有:/v1/responses、/v1/chat/completions、/v1/embeddings、/v1/completions、/v1/moderations、/v1/images/generations、/v1/images/edits。

幾條規矩:

  • 每個 custom_id 必須唯一;
  • 一個文件只能含一個模型的請求,要用兩個模型就拆成兩個批次;
  • 做 embeddings 時,一個批次的嵌入輸入總數同樣最多 50,000;
  • 帶圖片時,官方建議盡量用 image_url 引用遠程圖,而不是把 Base64 內容塞進文件,免得文件超過 200 MB 的上載上限。

二、一份完整的 Python 腳本

下面把官方的幾個步驟按順序串起來。輪詢等待和解析結果的部分是本站補充:

python
import json
import time
from openai import OpenAI

client = OpenAI()

# 1. 上載輸入文件,purpose 要填 batch
batch_input_file = client.files.create(
    file=open("batchinput.jsonl", "rb"),
    purpose="batch",
)

# 2. 創建批處理,completion_window 目前只能是 24h
batch = client.batches.create(
    input_file_id=batch_input_file.id,
    endpoint="/v1/responses",
    completion_window="24h",
    metadata={"description": "nightly eval job"},
)
print("批次編號:", batch.id, "狀態:", batch.status)

# 3. 定時查詢狀態(也可以過幾小時再手動查)
while batch.status in ("validating", "in_progress", "finalizing"):
    time.sleep(60)
    batch = client.batches.retrieve(batch.id)
    print("狀態:", batch.status)

# 4. 讀取結果;輸出順序可能和輸入不同,用 custom_id 對應
if batch.output_file_id:
    text = client.files.content(batch.output_file_id).text
    for line in text.splitlines():
        row = json.loads(line)
        body = row["response"]["body"]
        for item in body["output"]:
            if item["type"] == "message":
                print(row["custom_id"], item["content"][0]["text"])

# 5. 失敗的請求在 error_file_id 裏
if batch.error_file_id:
    print(client.files.content(batch.error_file_id).text)

Node.js 的調用方法名對應是 openai.files.create、openai.batches.create、openai.batches.retrieve、openai.files.content,參數名與上面一致,官方頁面有各步驟的 Node 示例。

三、狀態有哪些

官方列出的狀態:

  • validating:正在校驗輸入文件;
  • failed:輸入文件沒有通過校驗;
  • in_progress:校驗通過,正在運行;
  • finalizing:已跑完,正在準備結果;
  • completed:完成,結果可取;
  • expired:24 小時窗口內沒跑完;
  • cancelling:正在取消,最長可能要 10 分鐘;
  • cancelled:已取消。

Batch 的狀態與限制:failed、expired、cancelling、50000 個請求、200 MB、每小時 2000 個批次、30 天保留

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

四、結果和失敗的請求

輸出文件裏,成功的請求每個對應一行,裏面有 custom_id 和 response。失敗的請求資訊寫在錯誤文件裏,通過批次對象的 error_file_id 取。官方還說:輸出文件會在批次完成 30 天后自動刪除,需要的話要及時下載儲存。

結果裏的文字要從 response.body.output 裏讀 output_text 內容,這對應上面腳本里的解析部分。

五、過期與取消

  • 取消:調用取消後狀態先變成 cancelling,等執行中的請求結束(最長約 10 分鐘)後變成 cancelled;
  • 過期:沒在 24 小時內完成的批次進入 expired,未完成的請求被取消;已經完成的請求結果仍在輸出文件裏,這部分消耗的 token 會計費。過期的請求會寫進錯誤文件,錯誤碼是 batch_expired,可以用 custom_id 找回它們的原始請求,再重新提交。

六、限額

官方說 Batch 有獨立的限速池,有三類限制:

  1. 單個批次:最多 50,000 個請求,輸入文件最大 200 MB;
  2. 每個模型的排隊 prompt token 數:具體數字在平台設定裏的限額頁面查看;
  3. 創建頻率:每小時最多創建 2,000 個批次。請求更多時,應該增加每個批次裏的請求數,而不是多建批次。

官方還說目前沒有輸出 token 的上限,並且用 Batch 不會消耗你常規的按模型限速額度,所以它也是提高處理量的一個辦法。想知道自己帳號的層級和提額條件,見 /guides/openai-api-usage-tiers-rate-limits。

常見問題

Q:所有模型都支持 Batch 嗎?

官方說大多數模型支持,具體看模型參考頁。圖像生成方面,官方頁面列出了 GPT Image 系列的部分模型支持批量生成和編輯,名稱以官方當天頁面為準。

Q:批次一直是 validating 或最後 failed?

failed 表示輸入文件沒通過校驗。先檢查 jsonl 是不是每行一個完整 JSON、custom_id 是否重複、整個文件是否只有一個模型、url 是否和創建批處理時的 endpoint 一致。這幾條裏前三條來自官方規則,最後一條是本站的合理推斷,官方沒有逐條列出校驗項。

Q:能隨時看到進度嗎?

批次對象裏有 request_counts,包含總數、已完成數、失敗數,查詢狀態時可以一併看到。

Q:怎麼用 Batch 做向量化?

端點選 /v1/embeddings,向量的用法見 /guides/openai-api-embeddings。

參考資料

  • OpenAI 官方:Batch API — https://developers.openai.com/api/docs/guides/batch

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 條評論

登入 後參與評論

還沒有評論,來搶沙發~