Saiba como usar a API Batch da OpenAI para enviar grupos de requisições assíncronas com custos 50% menores, limites de taxa independentes e significativamente mais altos e prazo de conclusão de até 24 horas. O serviço é ideal para processar tarefas que dispensam respostas imediatas. Você também pode consultar diretamente a referência da API.
Visão geral
Alguns usos da plataforma da OpenAI exigem o envio de requisições síncronas. Em muitos casos, porém, você não precisa de uma resposta imediata ou os limites de taxa impedem a execução de muitas consultas em pouco tempo. O processamento em lote costuma ser útil para tarefas como estas:
- Executar avaliações
- Classificar grandes conjuntos de dados
- Gerar embeddings para o conteúdo de repositórios
Com os endpoints da API Batch, você pode reunir várias requisições em um único arquivo, iniciar o processamento em lote e consultar o status do lote enquanto as requisições são executadas. Quando o lote for concluído, você poderá recuperar todos os resultados.
Em comparação com o uso direto dos endpoints padrão, a API Batch oferece:
- Custos menores: desconto de 50% em relação às APIs síncronas
- Limites de taxa mais altos: capacidade significativamente maior em relação às APIs síncronas
- Processamento rápido: cada lote é concluído em até 24 horas, muitas vezes antes desse prazo
Primeiros passos
1. Prepare o arquivo do lote
O ponto de partida de cada lote é um arquivo .jsonl em que cada linha contém os detalhes de uma requisição à API. Atualmente, os endpoints disponíveis são:
/v1/responses(API Responses)/v1/chat/completions(API chat completions)/v1/embeddings(API de embeddings)/v1/completions(API Completions)/v1/moderations(Guia de moderação)/v1/images/generations(API de imagens)/v1/images/edits(API de imagens)
Em cada linha do arquivo de entrada, o campo body recebe os mesmos parâmetros que o endpoint correspondente. Cada requisição deve incluir um valor exclusivo de custom_id, que permite identificar o resultado após a conclusão do lote. Veja abaixo um exemplo de arquivo de entrada com duas requisições. Todas as requisições de um mesmo arquivo devem usar o mesmo modelo.
Ao usar /v1/moderations, inclua o campo input no corpo de cada requisição. A API Batch aceita entradas de texto simples e arrays de conteúdo com entradas de texto ou imagem quando você usa omni-moderation-latest. Assim como o endpoint síncrono de moderação, o processo que executa o lote rejeita requisições que definem stream=true.
{"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}}
Exemplos de entrada para moderação
Requisição apenas com texto:
{
"custom_id": "moderation-text-1",
"method": "POST",
"url": "/v1/moderations",
"body": {
"model": "omni-moderation-latest",
"input": "This is a harmless test sentence."
}
}
Requisição com texto e imagem:
{
"custom_id": "moderation-mm-1",
"method": "POST",
"url": "/v1/moderations",
"body": {
"model": "omni-moderation-latest",
"input": [
{
"type": "text",
"text": "Describe this image"
},
{
"type": "image_url",
"image_url": {
"url": "https://api.nga.gov/iiif/a2e6da57-3cd1-4235-b20e-95dcaefed6c8/full/!800,800/0/default.jpg"
}
}
]
}
}
Prefira referenciar imagens remotas com image_url em vez de incluir os dados em base64.
Assim, seus arquivos .jsonl ficam bem abaixo do limite de upload de 200 MB da API Batch,
especialmente em requisições de moderação multimodal.
2. Envie o arquivo de entrada do lote
Assim como na API de ajuste fino, você precisa primeiro enviar o arquivo de entrada para poder referenciá-lo ao iniciar um lote. Envie o arquivo .jsonl usando a API de arquivos.
import fs from "fs";
import OpenAI from "openai";
const openai = new OpenAI();
const file = await openai.files.create({
file: fs.createReadStream("fixtures/batchinput.jsonl"),
purpose: "batch",
});
console.log(file);3. Crie o lote
Após enviar o arquivo de entrada, use o ID do objeto File correspondente para criar um lote. Neste exemplo, suponha que o ID do arquivo seja file-abc123. No momento, o único valor aceito para o prazo de conclusão é 24h. Você também pode fornecer metadados personalizados com o parâmetro opcional metadata.
import OpenAI from "openai";
const openai = new OpenAI();
const batch = await openai.batches.create({
input_file_id: "file-abc123",
endpoint: "/v1/responses",
completion_window: "24h",
});
console.log(batch);Essa requisição retorna um objeto Batch com os metadados do lote:
{
"id": "batch_abc123",
"object": "batch",
"endpoint": "/v1/responses",
"errors": null,
"input_file_id": "file-abc123",
"completion_window": "24h",
"status": "validating",
"output_file_id": null,
"error_file_id": null,
"created_at": 1714508499,
"in_progress_at": null,
"expires_at": 1714536634,
"completed_at": null,
"failed_at": null,
"expired_at": null,
"request_counts": {
"total": 0,
"completed": 0,
"failed": 0
},
"metadata": null
}
4. Consulte o status de um lote
Você pode consultar o status de um lote a qualquer momento. Essa consulta também retorna um objeto Batch.
import OpenAI from "openai";
const openai = new OpenAI();
const batch = await openai.batches.retrieve("batch_abc123");
console.log(batch);O status de um objeto Batch pode ter qualquer um dos seguintes valores:
| Status | Descrição |
|---|---|
validating |
O arquivo de entrada está em validação antes do início do lote. |
failed |
O arquivo de entrada não passou na validação. |
in_progress |
O arquivo de entrada passou na validação e o lote está em execução. |
finalizing |
O processamento do lote terminou e os resultados estão sendo preparados. |
completed |
O lote foi concluído e os resultados estão disponíveis. |
expired |
O lote não foi concluído dentro do prazo de 24 horas. |
cancelling |
O cancelamento do lote está em andamento e pode levar até 10 minutos. |
cancelled |
O lote foi cancelado. |
5. Recupere os resultados
Quando o lote for concluído, faça uma requisição à API de arquivos usando o campo output_file_id do objeto Batch para baixar os resultados. Salve o conteúdo em um arquivo na sua máquina. Neste exemplo, o arquivo se chama batch_output.jsonl.
import OpenAI from "openai";
const openai = new OpenAI();
const fileResponse = await openai.files.content("file-xyz123");
const fileContents = await fileResponse.text();
console.log(fileContents);O arquivo de saída .jsonl contém uma linha de resposta para cada linha do arquivo de entrada cuja requisição foi bem-sucedida. Se alguma requisição falhar, os detalhes da falha serão gravados em um arquivo de erros, que você pode localizar pelo campo error_file_id do lote.
A ordem das linhas de saída pode ser diferente da ordem das linhas de entrada.
Ao processar os resultados, use o campo custom_id, presente em cada linha do arquivo de saída,
para associar cada requisição de entrada ao resultado correspondente, sem depender da ordem das linhas.
O exemplo de saída a seguir foi abreviado para mostrar a correspondência entre os IDs e o texto gerado. Para cada mensagem, leia o conteúdo do tipo output_text em response.body.output.
{"id": "batch_req_2", "custom_id": "request-2", "response": {"status_code": 200, "request_id": "req_2", "body": {"id": "resp_2", "object": "response", "status": "completed", "output": [{"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "green"}]}]}}, "error": null}
{"id": "batch_req_1", "custom_id": "request-1", "response": {"status_code": 200, "request_id": "req_1", "body": {"id": "resp_1", "object": "response", "status": "completed", "output": [{"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "blue"}]}]}}, "error": null}
O arquivo de saída será excluído automaticamente 30 dias após a conclusão do lote.
6. Cancele um lote
Se necessário, você pode cancelar um lote em andamento. O status do lote muda para cancelling até que as requisições em execução terminem, o que pode levar até 10 minutos. Em seguida, o status muda para cancelled.
import OpenAI from "openai";
const openai = new OpenAI();
const batch = await openai.batches.cancel("batch_abc123");
console.log(batch);7. Liste todos os lotes
Você pode listar todos os seus lotes a qualquer momento. Se tiver muitos lotes, use os parâmetros limit e after para paginar os resultados.
import OpenAI from "openai";
const openai = new OpenAI();
const list = await openai.batches.list();
for await (const batch of list) {
console.log(batch);
}Disponibilidade dos modelos
A maioria dos modelos oferece suporte à API Batch. Consulte a referência de modelos para verificar a compatibilidade do seu modelo. Os modelos GPT-6 Sol e Luna oferecem suporte à residência de dados na União Europeia nas modalidades de processamento Standard, Flex e Batch. Consulte os critérios de elegibilidade para residência de dados.
O GPT Image 2.5 oferece suporte à geração e à edição de imagens em lote com gpt-image-2.5-flare e gpt-image-2.5-sunburst, inclusive nas versões de 2026-09-08. Use /v1/images/generations ou /v1/images/edits e consulte os preços de geração de imagens para saber quanto custa o processamento em lote.
Limites de taxa
Os limites de taxa da API Batch são independentes dos limites de taxa existentes por modelo. A API Batch tem três tipos de limites de taxa:
- Limites por lote: cada lote pode incluir até 50.000 requisições, e o arquivo de entrada pode ter até 200 MB. Para lotes que usam
/v1/embeddings, há também um limite de 50.000 entradas para geração de embeddings, somadas todas as requisições do lote. - Tokens de prompt na fila por modelo: cada modelo tem um limite de tokens de prompt que podem ficar na fila de processamento em lote. Consulte esses limites na página de configurações da plataforma.
- Limite de taxa de criação de lotes: você pode criar até 2.000 lotes por hora. Se precisar enviar mais requisições, aumente o número de requisições por lote.
Atualmente, a API Batch não impõe limite de tokens de saída. Como ela tem limites de taxa próprios e adicionais, os tokens usados na API Batch não contam para os limites de taxa padrão de cada modelo. Isso permite enviar mais requisições e processar mais tokens ao consultar a API.
Expiração de lotes
Os lotes que não terminam dentro do prazo passam para o status expired. A API cancela as requisições pendentes e disponibiliza as respostas das requisições concluídas no arquivo de saída do lote. Você paga pelos tokens consumidos pelas requisições concluídas.
As requisições expiradas são registradas no arquivo de erros com a mensagem exibida abaixo. Use o custom_id para recuperar os dados de cada requisição expirada.
{"id": "batch_req_123", "custom_id": "request-3", "response": null, "error": {"code": "batch_expired", "message": "This request could not be executed before the completion window expired."}}
{"id": "batch_req_123", "custom_id": "request-7", "response": null, "error": {"code": "batch_expired", "message": "This request could not be executed before the completion window expired."}}