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 条评论

登录 后参与评论

还没有评论,来抢沙发~