Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A API de Lote do OpenAI do Azure foi projetada para lidar com tarefas de processamento em grande escala e de alto volume com eficiência. Processe grupos assíncronos de solicitações com cota separada, com prazo de resposta de 24 horas, a custos 50% menores que o padrão global. Com o processamento em lote, em vez de enviar uma solicitação por vez, você deve enviar um grande número de solicitações em um único arquivo. As solicitações em lotes globais têm uma cota de token enfileirada separada, evitando qualquer interrupção de suas cargas de trabalho online.
Os casos de uso incluem:
Processamento de dados em larga escala: analisar rapidamente conjuntos de dados extensos em paralelo.
Geração de Conteúdo: Criar grandes volumes de texto, como descrições de produto ou artigos.
Revisão e Resumo de Documentos: automatizar a revisão e o resumo de documentos longos.
Automação de Suporte ao Cliente: lidar com várias consultas simultaneamente para obter respostas mais rápidas.
Extração e Análise de Dados: extrair e analisar informações de grandes quantidades de dados não estruturados.
Tarefas do Processamento de Linguagem Natural (NLP): execute tarefas como análise de sentimento ou tradução em grandes conjuntos de dados.
Marketing e Personalização: gere conteúdo personalizado e recomendações em escala.
Dica
Se os seus trabalhos em lote são tão grandes que você está atingindo o limite de token na fila mesmo depois de maximizar a cota para a implantação, algumas regiões já dão suporte a um novo recurso que permite colocar vários trabalhos em lote na fila com a retirada exponencial.
Quando sua cota de tokens em fila estiver disponível, o próximo trabalho em lote poderá ser criado e iniciado automaticamente. Para saber mais, consulte Automatização de novas tentativas de grandes trabalhos em lote com retirada exponencial.
Importante
Pretendemos processar solicitações em lotes dentro de 24 horas; não expiramos os trabalhos que levam mais tempo. Você poderá cancelar o trabalho a qualquer momento. Quando você cancela o trabalho, qualquer trabalho restante é cancelado e qualquer trabalho já concluído é retornado. Você será cobrado por qualquer trabalho concluído.
Os dados armazenados em repouso permanecem na geografia designada do Azure, enquanto os dados podem ser processados para inferência em qualquer local do Azure OpenAI. Saiba mais sobre residência de dados.
Suporte ao Lote
Disponibilidade do modelo de lote global
| Região | gpt-5, 2025-08-07 | o3, 2025-04-16 | o4-mini, 2025-04-16 | gpt-4.1, 2025-04-14 | gpt-4.1-nano, 2025-04-14 | gpt-4.1-mini, 2025-04-14 | o3-mini, 2025-01-31 | gpt-4o, 2024-05-13 | gpt-4o, 2024-08-06 | gpt-4o, 2024-11-20 | gpt-4o-mini, 2024-07-18 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| australiaeast | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Brasil Sul | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Canadá Oriental | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| centralus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| eastus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| eastus2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| francecentral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| alemanhacentro-oeste | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| japaneast | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| koreacentral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| northcentralus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| noruega-leste | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Polônia Central | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| southafricanorth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| southcentralus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| sul da Índia | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| swedencentral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Suíça Norte | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| uksouth | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| westeurope | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| westus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| westus3 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
O registro é necessário para acesso gpt-5 e o3 para obter mais informações, consulte nosso guia de modelos de raciocínio.
Os seguintes modelos são compatíveis com o lote global:
| Modelo | Versão | Formato de entrada |
|---|---|---|
gpt-5 |
2025-08-7 |
texto + imagem |
o3 |
2025-04-16 |
texto + imagem |
o3-mini |
31/01/2025 | enviar SMS |
gpt-4o |
06/08/2024 | texto + imagem |
gpt-4o-mini |
18/07/2024 | texto + imagem |
gpt-4o |
13/05/2024 | texto + imagem |
Observação
Embora o Lote Global dê suporte a versões de API mais antigas, alguns modelos exigem versões de API de versão prévia mais recentes. Por exemplo, o3-mini não é compatível com 2024-10-21 porque foi lançado após essa data. Para acessar os modelos mais recentes com o lote global, use a versão mais recente da API de visualização.
Suporte de funcionalidades
No momento, não há suporte para o seguinte:
- Integração com a API de Assistentes.
- Integração com o recurso do OpenAI do Azure em Seus Dados.
Implantação em lote
Observação
No portal do Microsoft Foundry , os tipos de implantação em lote serão exibidos como Global-Batch e Data Zone Batch. Para saber mais sobre os tipos de implantação do OpenAI do Azure, confira nosso guia de tipos de implantação.
Dica
Recomendamos habilitar cota dinâmica para todas as implantações globais de modelo em lotes para ajudar a evitar falhas de trabalho devido à cota de token enfileirada insuficiente. A utilização de cota dinâmica permite que sua implantação aproveite de forma oportunista mais cota disponível quando houver capacidade extra. Quando a cota dinâmica for definida como desativada, sua implantação só poderá processar solicitações até o limite de token enfileirado definido quando você criou a implantação.
Pré-requisitos
- Uma assinatura do Azure – Crie uma gratuitamente.
- Um recurso com um modelo do tipo de implantação
GlobalBatchouDataZoneBatchimplantado.
Preparar seu arquivo em lote
Assim como o ajuste fino, o processamento em lote usa arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns arquivos de exemplo com diferentes tipos de conteúdo com suporte:
Formato de entrada
API de Respostas
{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}
API de finalizações de chat
{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}
O custom_id é necessário para permitir que você identifique quais solicitações em lote individuais correspondem a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no arquivo em lote .jsonl.
O atributo model deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência.
Importante
O atributo model deve ser configurado para corresponder ao nome da implantação do Lote Global que você deseja direcionar para as respostas de inferência. O mesmo nome de implantação do modelo do Lote Globa deve estar presente em cada linha do arquivo de lote. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo de lote/trabalho separado.
Para obter um melhor desempenho, recomendamos enviar arquivos grandes para processamento em lote, em vez de muitos arquivos pequenos com apenas algumas linhas em cada um.
Criar arquivo de entrada
Para este artigo, criaremos um arquivo nomeado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo.
Criar um trabalho em lotes
Depois que o arquivo de entrada estiver preparado, primeiro você precisará carregar o arquivo para poder iniciar um trabalho em lotes. O upload de arquivo pode ser feito programaticamente ou por meio do portal do Microsoft Foundry. Este exemplo demonstra o carregamento de um arquivo diretamente para o recurso do Azure OpenAI. Como alternativa, você pode configurar o Armazenamento de Blobs do Azure para o Azure OpenAI Batch.
-
Entre no Microsoft Foundry. Certifique-se de que o botão New Foundry está desativado. Essas etapas se referem à Fábrica (clássica).
Selecione o recurso do OpenAI do Azure em que você tem uma implantação de modelo de lote global disponível.
Selecione Trabalhos em lote>+Criar trabalhos em lote.
Na lista suspensa, em Dados em lote>Carregar arquivos>, selecione Carregar arquivo e indique o caminho para o arquivo
test.jsonlcriado na etapa anterior >Avançar.
Selecione Criar para iniciar o trabalho em lotes.
-
Entre no Microsoft Foundry. Certifique-se de que a chave New Foundry está ativada. Essas etapas se referem à Fábrica (nova).
No canto superior direito, selecione Compilar
No painel esquerdo, selecione Modelos
Selecione Trabalhos em Lote>criar um trabalho em lote
Acompanhar o progresso do trabalho em lotes
Após criar o trabalho, você poderá monitorar o progresso do trabalho selecionando a ID do trabalho para o trabalho criado mais recentemente. Por padrão, você será direcionado para a página de status do trabalho em lotes criado mais recentemente.
Você pode acompanhar o status da tarefa no painel à direita.
Recuperar o arquivo de saída do trabalho em lote
Quando o trabalho for concluído ou atingir um estado terminal, ele vai gerar um arquivo de erro e um arquivo de saída que podem ser baixados para revisão selecionando o respectivo botão com o ícone de seta para baixo.
Cancelar lote
Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de ser alterado para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.
Acompanhar o progresso do trabalho em lotes
Após criar o trabalho, você poderá monitorar o progresso do trabalho selecionando a ID do trabalho para o trabalho criado mais recentemente. Por padrão, você será direcionado para a página de status do trabalho em lotes criado mais recentemente.
Você pode acompanhar o status da tarefa no painel à direita.
Recuperar o arquivo de saída do trabalho em lote
Quando o trabalho for concluído ou atingir um estado terminal, ele vai gerar um arquivo de erro e um arquivo de saída que podem ser baixados para revisão selecionando o respectivo botão com o ícone de seta para baixo.
Cancelar lote
Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de ser alterado para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.
Pré-requisitos
- Uma assinatura do Azure – Crie uma gratuitamente.
- Python 3.8 ou versão posterior
- A seguinte biblioteca do Python:
openai - Jupyter Notebooks
- Um recurso do OpenAI do Azure com um modelo do tipo
Global-Batchde implantação implantado. Consulte a guia de criação de recursos e implantação de modelo para obter ajuda com esse processo.
As etapas neste artigo devem ser executadas sequencialmente no Jupyter Notebooks. Por esse motivo, só instanciaremos o cliente do OpenAI do Azure uma vez no início dos exemplos. Caso queira executar uma etapa fora de ordem, geralmente é necessário configurar um cliente Azure OpenAI como parte desta chamada.
Mesmo se você já tiver a biblioteca do Python do OpenAI instalada, talvez seja necessário atualizar sua instalação para a versão mais recente:
!pip install openai --upgrade
Preparar seu arquivo em lote
Assim como o ajuste fino, o lote global usa arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns arquivos de exemplo com diferentes tipos de conteúdo com suporte:
Formato de entrada
API de Respostas
{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}
API de finalizações de chat
{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}
O custom_id é necessário para permitir que você identifique quais solicitações em lote individuais correspondem a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no arquivo em lote .jsonl.
O atributo model deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência.
Importante
O atributo model deve ser configurado para corresponder ao nome da implantação do Lote Global que você deseja direcionar para as respostas de inferência. O mesmo nome de implantação do modelo do Lote Globa deve estar presente em cada linha do arquivo de lote. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo de lote/trabalho separado.
Para obter um melhor desempenho, recomendamos enviar arquivos grandes para processamento em lote, em vez de muitos arquivos pequenos com apenas algumas linhas em cada um.
Criar arquivo de entrada
Para este artigo, criaremos um arquivo nomeado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo. Salve esse arquivo no mesmo diretório que você está executando seu Jupyter Notebook.
Carregar arquivo em lote
Depois que o arquivo de entrada estiver preparado, primeiro você precisará carregar o arquivo para poder iniciar um trabalho em lotes. O upload de arquivo pode ser feito programaticamente ou por meio do portal do Microsoft Foundry. Este exemplo demonstra o carregamento de um arquivo diretamente para o recurso do Azure OpenAI. Como alternativa, você pode configurar o Armazenamento de Blobs do Azure para o Azure OpenAI Batch.
import os
from datetime import datetime
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)
client = OpenAI(
base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
api_key=token_provider,
)
# Upload a file with a purpose of "batch"
file = client.files.create(
file=open("test.jsonl", "rb"),
purpose="batch",
extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}} # Optional you can set to a number between 1209600-2592000. This is equivalent to 14-30 days
)
print(file.model_dump_json(indent=2))
print(f"File expiration: {datetime.fromtimestamp(file.expires_at) if file.expires_at is not None else 'Not set'}")
file_id = file.id
Ao cancelar o comentário e adicionar extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}} , você está definindo nosso arquivo de upload para expirar em 14 dias. Há um limite máximo de 500 arquivos de lote de entrada por recurso quando nenhuma expiração é definida. Ao definir um valor para expiração, o número de arquivos de lote de entrada por recurso é aumentado para 10.000 arquivos por recurso. Para remover os limites de arquivo de entrada em lote, use Batch com Azure Blob Storage.
Saída:
{
"id": "file-655111ec9cfc44489d9af078f08116ef",
"bytes": 176064,
"created_at": 1743391067,
"filename": "test.jsonl",
"object": "file",
"purpose": "batch",
"status": "processed",
"expires_at": 1744600667,
"status_details": null
}
File expiration: 2025-04-13 23:17:47
Criar um trabalho em lotes
Após carregar o arquivo, você poderá enviar o arquivo para processamento em lote.
# Submit a batch job with the file
batch_response = client.batches.create(
input_file_id=file_id,
endpoint="/chat/completions", # While passing this parameter is required, the system will read your input file to determine if the chat completions or responses API is needed.
completion_window="24h",
# extra_body={"output_expires_after":{"seconds": 1209600, "anchor": "created_at"}} # Optional you can set to a number between 1209600-2592000. This is equivalent to 14-30 days
)
# Save batch ID for later use
batch_id = batch_response.id
print(batch_response.model_dump_json(indent=2))
Observação
Atualmente, a janela de conclusão deve ser definida como 24h. Se você definir qualquer valor que não seja 24h, seu trabalho falhará. Os trabalhos que levam mais de 24 horas continuarão a ser executados até serem cancelados.
Saída:
{
"id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
"completion_window": "24h",
"created_at": 1722476583,
"endpoint": null,
"input_file_id": "file-655111ec9cfc44489d9af078f08116ef",
"object": "batch",
"status": "validating",
"cancelled_at": null,
"cancelling_at": null,
"completed_at": null,
"error_file_id": null,
"errors": null,
"expired_at": null,
"expires_at": 1722562983,
"failed_at": null,
"finalizing_at": null,
"in_progress_at": null,
"metadata": null,
"output_file_id": null,
"request_counts": {
"completed": 0,
"failed": 0,
"total": 0
}
}
Se os seus trabalhos em lotes são tão grandes que você está atingindo o limite de tokens na fila mesmo depois de maximizar a cota para a implantação, algumas regiões já dão suporte a um novo recurso de fail fast que permite colocar vários trabalhos em lotes na fila com a retirada exponencial. Portanto, logo que um trabalho em lotes grande é concluído, o próximo pode ser iniciado automaticamente. Para saber mais sobre quais regiões dão suporte a esse recurso e como adaptar seu código para tirar proveito dele, consulte encaminhamento de trabalhos em lotes.
Acompanhar o progresso do trabalho em lotes
Depois de criar um trabalho em lote com êxito, você poderá monitorar seu progresso no Studio ou programaticamente. Ao verificar o progresso do trabalho em lotes, recomendamos aguardar pelo menos 60 segundos entre cada chamada de status.
import time
import datetime
status = "validating"
while status not in ("completed", "failed", "canceled"):
time.sleep(60)
batch_response = client.batches.retrieve(batch_id)
status = batch_response.status
print(f"{datetime.datetime.now()} Batch Id: {batch_id}, Status: {status}")
if batch_response.status == "failed":
for error in batch_response.errors.data:
print(f"Error code {error.code} Message {error.message}")
Saída:
2024-07-31 21:48:32.556488 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: validating
2024-07-31 21:49:39.221560 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: in_progress
2024-07-31 21:50:53.383138 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: in_progress
2024-07-31 21:52:07.274570 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: in_progress
2024-07-31 21:53:21.149501 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: finalizing
2024-07-31 21:54:34.572508 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: finalizing
2024-07-31 21:55:35.304713 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: finalizing
2024-07-31 21:56:36.531816 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: finalizing
2024-07-31 21:57:37.414105 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde, Status: completed
Os seguintes valores de status são possíveis:
| Estado | Descrição |
|---|---|
validating |
O arquivo de entrada está sendo validado antes que o processamento em lote possa começar. |
failed |
O arquivo de entrada falhou no processo de validação. |
in_progress |
O arquivo de entrada foi validado com êxito e o lote está em execução no momento. |
finalizing |
O lote foi concluído e os resultados estão sendo preparados. |
completed |
O lote foi concluído e os resultados estão prontos. |
expired |
O lote não pôde ser concluído dentro da janela de tempo de 24 horas. |
cancelling |
O lote está sendo cancelled (isso pode levar até 10 minutos para entrar em vigor.) |
cancelled |
o lote era cancelled. |
Para examinar os detalhes do status do trabalho, você poderá executar:
print(batch_response.model_dump_json(indent=2))
Saída:
{
"id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
"completion_window": "24h",
"created_at": 1722476583,
"endpoint": null,
"input_file_id": "file-9f3a81d899b4442f98b640e4bc3535dd",
"object": "batch",
"status": "completed",
"cancelled_at": null,
"cancelling_at": null,
"completed_at": 1722477429,
"error_file_id": "file-c795ae52-3ba7-417d-86ec-07eebca57d0b",
"errors": null,
"expired_at": null,
"expires_at": 1722562983,
"failed_at": null,
"finalizing_at": 1722477177,
"in_progress_at": null,
"metadata": null,
"output_file_id": "file-3304e310-3b39-4e34-9f1c-e1c1504b2b2a",
"request_counts": {
"completed": 3,
"failed": 0,
"total": 3
}
}
Observe que há tanto error_file_id quanto um output_file_id separado. Use o error_file_id para ajudar na depuração de quaisquer problemas que ocorram com seu trabalho em lote.
Recuperar o arquivo de saída do trabalho em lote
import json
output_file_id = batch_response.output_file_id
if not output_file_id:
output_file_id = batch_response.error_file_id
if output_file_id:
file_response = client.files.content(output_file_id)
raw_responses = file_response.text.strip().split('\n')
for raw_response in raw_responses:
json_response = json.loads(raw_response)
formatted_json = json.dumps(json_response, indent=2)
print(formatted_json)
Saída:
Para simplificar, incluímos apenas uma resposta de preenchimento de chat da saída. Caso siga as etapas neste artigo, deverá ter três respostas semelhantes à seguinte:
Finalizações de chat
{
"custom_id": "task-0",
"response": {
"body": {
"choices": [
{
"content_filter_results": {
"hate": {
"filtered": false,
"severity": "safe"
},
"self_harm": {
"filtered": false,
"severity": "safe"
},
"sexual": {
"filtered": false,
"severity": "safe"
},
"violence": {
"filtered": false,
"severity": "safe"
}
},
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "Microsoft was founded on April 4, 1975, by Bill Gates and Paul Allen in Albuquerque, New Mexico.",
"role": "assistant"
}
}
],
"created": 1722477079,
"id": "chatcmpl-9rFGJ9dh08Tw9WRKqaEHwrkqRa4DJ",
"model": "gpt-4o-2024-05-13",
"object": "chat.completion",
"prompt_filter_results": [
{
"prompt_index": 0,
"content_filter_results": {
"hate": {
"filtered": false,
"severity": "safe"
},
"jailbreak": {
"filtered": false,
"detected": false
},
"self_harm": {
"filtered": false,
"severity": "safe"
},
"sexual": {
"filtered": false,
"severity": "safe"
},
"violence": {
"filtered": false,
"severity": "safe"
}
}
}
],
"system_fingerprint": "fp_a9bfe9d51d",
"usage": {
"completion_tokens": 24,
"prompt_tokens": 27,
"total_tokens": 51
}
},
"request_id": "660b7424-b648-4b67-addc-862ba067d442",
"status_code": 200
},
"error": null
}
API de Respostas
{
"custom_id": "task-0",
"response": {
"body": {
"id": "resp_0e5c78eb05ee70cf00690cc6d988e4819587556df17436a206",
"created_at": 1762445017.0,
"error": null,
"incomplete_details": null,
"instructions": null,
"metadata": {},
"model": "gpt-4.1-batch",
"object": "response",
"output": [
{
"id": "msg_0e5c78eb05ee70cf00690cc6da3c548195aae483031113df16",
"content": [
{
"annotations": [],
"text": "Microsoft was founded on **April 4, 1975** by **Bill Gates** and **Paul Allen**.",
"type": "output_text",
"logprobs": []
}
],
"role": "assistant",
"status": "completed",
"type": "message"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"tools": [],
"top_p": 1.0,
"background": false,
"max_output_tokens": null,
"max_tool_calls": null,
"previous_response_id": null,
"prompt_cache_key": null,
"reasoning": {
"effort": null,
"summary": null
},
"safety_identifier": null,
"service_tier": "default",
"status": "completed",
"text": {
"format": {
"type": "text"
},
"verbosity": "medium"
},
"top_logprobs": 0,
"truncation": "disabled",
"usage": {
"input_tokens": 16,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 25,
"output_tokens_details": {
"reasoning_tokens": 0
},
"total_tokens": 41
},
"user": null,
"content_filters": null,
"store": true
},
"request_id": "809b30c2-fa0b-4613-b5cc-c30f6b780c9a",
"status_code": 200
},
"error": null
}
Comandos de lote adicionais
Cancelar lote
Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de ser alterado para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.
client.batches.cancel("batch_abc123") # set to your batch_id for the job you want to cancel
Listar lote
Liste os trabalhos em lote para um recurso específico do OpenAI do Azure.
client.batches.list()
Os métodos de lista na biblioteca do Python são paginados.
Para listar todos os trabalhos:
all_jobs = []
# Automatically fetches more pages as needed.
for job in client.batches.list(
limit=20,
):
# Do something with job here
all_jobs.append(job)
print(all_jobs)
Lote de lista (Versão prévia)
Use a API REST para listar todos os trabalhos em lote com opções adicionais de classificação/filtragem.
Nos exemplos abaixo, estamos fornecendo a generate_time_filter função para facilitar a construção do filtro. Se você não quiser usar essa função, o formato da cadeia de caracteres de filtro será semelhante a created_at gt 1728860560 and status eq 'Completed'.
import requests
import json
from datetime import datetime, timedelta
from azure.identity import DefaultAzureCredential
token_credential = DefaultAzureCredential()
token = token_credential.get_token('https://cognitiveservices.azure.com/.default')
endpoint = "https://{YOUR_RESOURCE_NAME}.openai.azure.com/"
api_version = "2025-03-01-preview"
url = f"{endpoint}openai/batches"
order = "created_at asc"
time_filter = lambda: generate_time_filter("past 8 hours")
# Additional filter examples:
#time_filter = lambda: generate_time_filter("past 1 day")
#time_filter = lambda: generate_time_filter("past 3 days", status="Completed")
def generate_time_filter(time_range, status=None):
now = datetime.now()
if 'day' in time_range:
days = int(time_range.split()[1])
start_time = now - timedelta(days=days)
elif 'hour' in time_range:
hours = int(time_range.split()[1])
start_time = now - timedelta(hours=hours)
else:
raise ValueError("Invalid time range format. Use 'past X day(s)' or 'past X hour(s)'")
start_timestamp = int(start_time.timestamp())
filter_string = f"created_at gt {start_timestamp}"
if status:
filter_string += f" and status eq '{status}'"
return filter_string
filter = time_filter()
headers = {'Authorization': 'Bearer ' + token.token}
params = {
"api-version": api_version,
"$filter": filter,
"$orderby": order
}
response = requests.get(url, headers=headers, params=params)
json_data = response.json()
if response.status_code == 200:
print(json.dumps(json_data, indent=2))
else:
print(f"Request failed with status code: {response.status_code}")
print(response.text)
Saída:
{
"data": [
{
"cancelled_at": null,
"cancelling_at": null,
"completed_at": 1729011896,
"completion_window": "24h",
"created_at": 1729011128,
"error_file_id": "file-472c0626-4561-4327-9e4e-f41afbfb30e6",
"expired_at": null,
"expires_at": 1729097528,
"failed_at": null,
"finalizing_at": 1729011805,
"id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
"in_progress_at": 1729011493,
"input_file_id": "file-f89384af0082485da43cb26b49dc25ce",
"errors": null,
"metadata": null,
"object": "batch",
"output_file_id": "file-62bebde8-e767-4cd3-a0a1-28b214dc8974",
"request_counts": {
"total": 3,
"completed": 2,
"failed": 1
},
"status": "completed",
"endpoint": "/chat/completions"
},
{
"cancelled_at": null,
"cancelling_at": null,
"completed_at": 1729016366,
"completion_window": "24h",
"created_at": 1729015829,
"error_file_id": "file-85ae1971-9957-4511-9eb4-4cc9f708b904",
"expired_at": null,
"expires_at": 1729102229,
"failed_at": null,
"finalizing_at": 1729016272,
"id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43",
"in_progress_at": 1729016126,
"input_file_id": "file-686746fcb6bc47f495250191ffa8a28e",
"errors": null,
"metadata": null,
"object": "batch",
"output_file_id": "file-04399828-ae0b-4825-9b49-8976778918cb",
"request_counts": {
"total": 3,
"completed": 2,
"failed": 1
},
"status": "completed",
"endpoint": "/chat/completions"
}
],
"first_id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
"has_more": false,
"last_id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43"
}
Como colocar trabalhos em lotes na fila
Se os seus trabalhos em lotes são tão grandes que você está atingindo o limite de token na fila mesmo depois de maximizar a cota para sua implantação, algumas regiões já dão suporte a um novo recurso de fail fast que permite colocar vários trabalhos em lotes na fila com a retirada exponencial. Depois que um trabalho em lotes grande for concluído e sua cota de tokens em fila estiver novamente disponível, os próximos trabalhos em lotes poderão ser criados e iniciados automaticamente.
Comportamento antigo:
- Trabalhos em lotes grandes já em execução e usando todos os tokens disponíveis para sua implementação.
- Novo trabalho em lotes enviado.
- O novo trabalho em lote entra em fase de validação que pode durar até alguns minutos.
- A contagem de tokens para o novo trabalho é verificada em relação à cota atualmente disponível.
- O novo trabalho em lotes falha com o limite de token de relatório de erros excedido.
Novo comportamento:
- Trabalhos em lotes grandes já em execução e usando todos os tokens disponíveis para sua implantação
- Novo trabalho em lotes enviado
- A contagem aproximada de tokens de um novo trabalho é imediatamente comparada com a cota de lote atualmente disponível e o fail fast de trabalhos, permitindo que você lide com as repetições com mais facilidade por meio de programação.
Suporte de regiões
As seguintes regiões dão suporte ao novo comportamento de fail fast:
- australiaeast
- eastus
- alemanhacentro-oeste
- italynorth
- northcentralus
- Polônia Central
- swedencentral
- Suíça Norte
- eastus2
- westus
O código abaixo demonstra a mecânica básica de lidar com o comportamento de fail fast para permitir a automatização de novas repetições e o enfileiramento de trabalhos em lotes com a retirada exponencial.
Dependendo do tamanho dos trabalhos em lotes, talvez seja necessário aumentar as max_retries ou alterar ainda mais este exemplo.
import time
from openai import BadRequestError
max_retries = 10
retries = 0
initial_delay = 5
delay = initial_delay
while True:
try:
batch_response = client.batches.create(
input_file_id=file_id,
endpoint="/chat/completions",
completion_window="24h",
)
# Save batch ID for later use
batch_id = batch_response.id
print(f"✅ Batch created successfully after {retries} retries")
print(batch_response.model_dump_json(indent=2))
break
except BadRequestError as e:
error_message = str(e)
# Check if it's a token limit error
if 'token_limit_exceeded' in error_message:
retries += 1
if retries >= max_retries:
print(f"❌ Maximum retries ({max_retries}) reached. Giving up.")
raise
print(f"⏳ Token limit exceeded. Waiting {delay} seconds before retry {retries}/{max_retries}...")
time.sleep(delay)
# Exponential backoff - increase delay for next attempt
delay *= 2
else:
# If it's a different error, raise it immediately
print(f"❌ Encountered non-token limit error: {error_message}")
raise
Saída:
⏳ Token limit exceeded. Waiting 5 seconds before retry 1/10...
⏳ Token limit exceeded. Waiting 10 seconds before retry 2/10...
⏳ Token limit exceeded. Waiting 20 seconds before retry 3/10...
⏳ Token limit exceeded. Waiting 40 seconds before retry 4/10...
⏳ Token limit exceeded. Waiting 80 seconds before retry 5/10...
⏳ Token limit exceeded. Waiting 160 seconds before retry 6/10...
⏳ Token limit exceeded. Waiting 320 seconds before retry 7/10...
✅ Batch created successfully after 7 retries
{
"id": "batch_1e1e7b9f-d4b4-41fa-bd2e-8d2ec50fb8cc",
"completion_window": "24h",
"created_at": 1744402048,
"endpoint": "/chat/completions",
"input_file_id": "file-e2ba4ccaa4a348e0976c6fe3c018ea92",
"object": "batch",
"status": "validating",
"cancelled_at": null,
"cancelling_at": null,
"completed_at": null,
"error_file_id": "",
"errors": null,
"expired_at": null,
"expires_at": 1744488444,
"failed_at": null,
"finalizing_at": null,
"in_progress_at": null,
"metadata": null,
"output_file_id": "",
"request_counts": {
"completed": 0,
"failed": 0,
"total": 0
}
}
Pré-requisitos
- Uma assinatura do Azure – Crie uma gratuitamente.
- Um recurso do OpenAI do Azure com um modelo do tipo
Global-Batchde implantação implantado. Consulte a guia de criação de recursos e implantação de modelo para obter ajuda com esse processo.
Preparar seu arquivo em lote
Assim como o ajuste fino, o lote global usa arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns arquivos de exemplo com diferentes tipos de conteúdo com suporte:
Formato de entrada
API de Respostas
{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}
API de finalizações de chat
{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}
O custom_id é necessário para permitir que você identifique quais solicitações em lote individuais correspondem a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no arquivo em lote .jsonl.
O atributo model deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência.
Importante
O atributo model deve ser configurado para corresponder ao nome da implantação do Lote Global que você deseja direcionar para as respostas de inferência. O mesmo nome de implantação do modelo do Lote Globa deve estar presente em cada linha do arquivo de lote. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo de lote/trabalho separado.
Para obter um melhor desempenho, recomendamos enviar arquivos grandes para processamento em lote, em vez de muitos arquivos pequenos com apenas algumas linhas em cada um.
Criar arquivo de entrada
Para este artigo, criaremos um arquivo nomeado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo.
Carregar arquivo em lote
Depois que o arquivo de entrada estiver preparado, primeiro você precisará carregar o arquivo para poder iniciar um trabalho em lotes. O upload de arquivo pode ser feito programaticamente ou por meio do portal do Microsoft Foundry. Este exemplo demonstra o carregamento de um arquivo diretamente para o recurso do Azure OpenAI. Como alternativa, você pode configurar o Armazenamento de Blobs do Azure para o Azure OpenAI Batch.
Importante
Use as chaves de API com cuidado. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente. Se você usar uma chave de API, armazene-a com segurança no Azure Key Vault. Para obter mais informações sobre como usar chaves de API com segurança em seus aplicativos, confira Chaves de API com o Azure Key Vault.
Para obter mais informações sobre a segurança dos serviços de IA, veja Autenticar solicitações para serviços de IA do Azure.
curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files \
-H "Content-Type: multipart/form-data" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-F "purpose=batch" \
-F "file=@C:\\batch\\test.jsonl;type=application/json" \
-F "expires_after.seconds=1209600" \
-F "expires_after.anchor=created_at"
O código acima pressupõe um caminho de arquivo específico para o arquivo test.jsonl. Ajuste esse caminho de arquivo conforme necessário para seu sistema local.
Ao adicionar os parâmetros opcionais "expires_after.seconds=1209600" e "expires_after.anchor=created_at", você está definindo seu arquivo carregado para expirar em 14 dias. Há um limite máximo de 500 arquivos de entrada em lote por recurso quando nenhuma expiração é definida. Ao definir um valor para expiração, o número de arquivos em lote por recurso é aumentado para 10.000 arquivos por recurso. Você pode defini-lo como um número entre 1.209.600-2.592.000. Isso equivale a 14 a 30 dias. Para remover os limites de arquivos de entrada em lote, use o recurso Lote com o Armazenamento de Blobs do Azure.
Saída:
{
"status": "processed",
"bytes": 817,
"purpose": "batch",
"filename": "test.jsonl",
"expires_at": 1744607747,
"id": "file-7733bc35e32841e297a62a9ee50b3461",
"created_at": 1743398147,
"object": "file"
}
Acompanhar o status de upload de arquivo
Dependendo do tamanho do arquivo de carregamento, pode levar algum tempo até que ele seja totalmente carregado e processado. Para verificar o status do upload do arquivo, execute:
curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files/{file-id} \
-H "api-key: $AZURE_OPENAI_API_KEY"
Saída:
{
"status": "processed",
"bytes": 686,
"purpose": "batch",
"filename": "test.jsonl",
"expires_at": 1744607747,
"id": "file-7733bc35e32841e297a62a9ee50b3461",
"created_at": 1721408291,
"object": "file"
}
Criar um trabalho em lotes
Após carregar o arquivo, você poderá enviar o arquivo para processamento em lote.
curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input_file_id": "file-abc123",
"endpoint": "/chat/completions",
"completion_window": "24h",
"output_expires_after": {
"seconds": 1209600
},
"anchor": "created_at"
}'
Aqui você pode, opcionalmente, adicionar "output_expires_after":{"seconds": 1209600}, e "anchor": "created_at" para que os arquivos de saída expirem em 14 dias.
Observação
Atualmente, a janela de conclusão deve ser definida como 24h. Se você definir qualquer valor que não seja 24h, seu trabalho falhará. Os trabalhos que levam mais de 24 horas continuarão a ser executados até serem cancelados.
Saída:
{
"cancelled_at": null,
"cancelling_at": null,
"completed_at": null,
"completion_window": "24h",
"created_at": "2024-07-19T17:13:57.2491382+00:00",
"error_file_id": null,
"expired_at": null,
"expires_at": "2024-07-20T17:13:57.1918498+00:00",
"failed_at": null,
"finalizing_at": null,
"id": "batch_fe3f047a-de39-4068-9008-346795bfc1db",
"in_progress_at": null,
"input_file_id": "file-21006e70789246658b86a1fc205899a4",
"errors": null,
"metadata": null,
"object": "batch",
"output_file_id": null,
"request_counts": {
"total": null,
"completed": null,
"failed": null
},
"status": "Validating"
}
Acompanhar o progresso do trabalho em lotes
Depois de criar um trabalho em lote com êxito, você poderá monitorar seu progresso no Studio ou programaticamente. Ao verificar o progresso do trabalho em lotes, recomendamos aguardar pelo menos 60 segundos entre cada chamada de status.
curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches/{batch_id} \
-H "api-key: $AZURE_OPENAI_API_KEY"
Saída:
{
"cancelled_at": null,
"cancelling_at": null,
"completed_at": null,
"completion_window": "24h",
"created_at": "2024-07-19T17:33:29.1619286+00:00",
"error_file_id": null,
"expired_at": null,
"expires_at": "2024-07-20T17:33:29.1578141+00:00",
"failed_at": null,
"finalizing_at": null,
"id": "batch_e0a7ee28-82c4-46a2-a3a0-c13b3c4e390b",
"in_progress_at": null,
"input_file_id": "file-c55ec4e859d54738a313d767718a2ac5",
"errors": null,
"metadata": null,
"object": "batch",
"output_file_id": null,
"request_counts": {
"total": null,
"completed": null,
"failed": null
},
"status": "Validating"
}
Os seguintes valores de status são possíveis:
| Estado | Descrição |
|---|---|
validating |
O arquivo de entrada está sendo validado antes que o processamento em lote possa começar. |
failed |
O arquivo de entrada falhou no processo de validação. |
in_progress |
O arquivo de entrada foi validado com êxito e o lote está em execução no momento. |
finalizing |
O lote foi concluído e os resultados estão sendo preparados. |
completed |
O lote foi concluído e os resultados estão prontos. |
expired |
O lote não pôde ser concluído dentro da janela de tempo de 24 horas. |
cancelling |
O lote está sendo cancelled (isso pode levar até 10 minutos para entrar em vigor.) |
cancelled |
o lote era cancelled. |
Recuperar o arquivo de saída do trabalho em lote
curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files/{output_file_id}/content \
-H "api-key: $AZURE_OPENAI_API_KEY" > batch_output.jsonl
Comandos de lote adicionais
Cancelar lote
Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de ser alterado para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.
curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches/{batch_id}/cancel \
-H "api-key: $AZURE_OPENAI_API_KEY"
Listar lote
Liste os trabalhos em lotes existentes para um determinado recurso do OpenAI do Azure.
curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches \
-H "api-key: $AZURE_OPENAI_API_KEY"
A chamada à API de lista é paginada. A resposta contém um booliano has_more para indicar quando há mais resultados para iterar.
Lote de lista (Versão prévia)
Use a API REST para listar todos os trabalhos em lote com opções adicionais de classificação/filtragem.
curl "YOUR_RESOURCE_NAME.openai.azure.com/batches?api-version=2025-04-01-preview&$filter=created_at%20gt%201728773533%20and%20created_at%20lt%201729032733%20and%20status%20eq%20'Completed'&$orderby=created_at%20asc" \
-H "api-key: $AZURE_OPENAI_API_KEY"
Para evitar o erro URL rejected: Malformed input to a URL function, os espaços são substituídos por %20.
Limites do Lote
| Nome do limite | Valor limite |
|---|---|
| Máximo de arquivos de entrada de batch – (sem expiração) | 500 |
| Máximo de arquivos de entrada em lote - (expiração definida) | 10,000 |
| Tamanho máximo do arquivo de entrada | 200 MB |
| Máximo de solicitações por arquivo | 100,000 |
Observação
Os limites de arquivo em lote não se aplicam a arquivos de saída (por exemplo, result.jsonle error.jsonl). Para remover os limites de arquivos de entrada em lote, use o recurso Lote com o Armazenamento de Blobs do Azure.
Cota do lote
A tabela mostra o limite de cota do lote. Os valores de cota para o lote global são representados em termos de tokens enfileirados. Quando você envia um arquivo para processamento em lote, o número de tokens no arquivo é contado. Até que o trabalho em lote atinja um estado de terminal, esses tokens contam com relação ao limite total de tokens enfileirados.
Lote global
| Modelo | Enterprise e MCA-E | Padrão | Assinaturas mensais baseadas em cartão de crédito | Assinaturas MSDN | Azure for Students, avaliações gratuitas |
|---|---|---|---|---|---|
gpt-4.1 |
5 bilhões | 200 milhões | 50 mi | 90 mil | Não aplicável |
gpt-4.1 mini |
15 bi | 1 bi | 50 mi | 90 mil | Não aplicável |
gpt-4.1-nano |
15 bi | 1 bi | 50 mi | 90 mil | Não aplicável |
gpt-4o |
5 bilhões | 200 milhões | 50 mi | 90 mil | Não aplicável |
gpt-4o-mini |
15 bi | 1 bi | 50 mi | 90 mil | Não aplicável |
gpt-4-turbo |
300 milhões | 80 milhões | 40 milhões | 90 mil | Não aplicável |
gpt-4 |
150 milhões | 30 milhões | 5 M | 100 mil | Não aplicável |
o3-mini |
15 bi | 1 bi | 50 mi | 90 mil | Não aplicável |
o4-mini |
15 bi | 1 bi | 50 mi | 90 mil | Não aplicável |
gpt-5 |
5 bilhões | 200 milhões | 50 mi | 90 mil | Não aplicável |
B = bilhões | M = milhões | K = mil
Lote da zona de dados
| Modelo | Enterprise e MCA-E | Padrão | Assinaturas mensais baseadas em cartão de crédito | Assinaturas MSDN | Azure for Students, avaliações gratuitas |
|---|---|---|---|---|---|
gpt-4.1 |
500 milhões | 30 milhões | 30 milhões | 90 mil | Não aplicável |
gpt-4.1-mini |
1,5 bilhões | 100 milhões | 50 mi | 90 mil | Não aplicável |
gpt-4o |
500 milhões | 30 milhões | 30 milhões | 90 mil | Não aplicável |
gpt-4o-mini |
1,5 bilhões | 100 milhões | 50 mi | 90 mil | Não aplicável |
o3-mini |
1,5 bilhões | 100 milhões | 50 mi | 90 mil | Não aplicável |
gpt-5 |
5 bilhões | 200 milhões | 50 mi | 90 mil | Não aplicável |
Objeto de lote
| Propriedade | Tipo | Definição |
|---|---|---|
id |
cadeia | |
object |
cadeia | batch |
endpoint |
cadeia | O ponto de extremidade de API usado pelo lote |
errors |
objeto | |
input_file_id |
cadeia | A ID do arquivo de entrada para o lote |
completion_window |
cadeia | O período dentro do qual o lote deve ser processado |
status |
cadeia | O status atual do lote. Valores possíveis: validating, failed, in_progress, finalizing, completed, expired, cancelling e cancelled. |
output_file_id |
cadeia | A ID do arquivo que contém as saídas de solicitações executadas com êxito. |
error_file_id |
cadeia | A ID do arquivo que contém as saídas de solicitações com erros. |
created_at |
inteiro | Um carimbo de data/hora quando esse lote foi criado (em épocas do Unix). |
in_progress_at |
inteiro | Um carimbo de data/hora quando este lote começou a progredir (em épocas do Unix). |
expires_at |
inteiro | Um carimbo de data/hora em que esse lote expirará (em épocas do Unix). |
finalizing_at |
inteiro | Um carimbo de data/hora quando este lote começou a ser finalizado (em épocas do Unix). |
completed_at |
inteiro | Um carimbo de data/hora quando este lote começou a ser finalizado (em épocas do Unix). |
failed_at |
inteiro | Um carimbo de data/hora quando esse lote falhou (em épocas do Unix) |
expired_at |
inteiro | Um carimbo de data/hora quando esse lote expirou (em épocas do Unix). |
cancelling_at |
inteiro | Um carimbo de data/hora quando este lote foi iniciado cancelling (em épocas do Unix). |
cancelled_at |
inteiro | Um carimbo de data/hora quando este lote estava cancelled (em épocas do Unix). |
request_counts |
objeto | Estrutura do objeto:total
inteiro O número total de solicitações no lote. completed
inteiro O número de solicitações no lote que foram concluídas com êxito. failed
inteiro O número de solicitações no lote que falharam. |
metadata |
mapa | Um conjunto de pares chave-valor que podem ser anexados ao lote. Esta propriedade poderá ser útil para armazenar informações adicionais sobre o lote em um formato estruturado. |
Perguntas frequentes (FAQ)
É possível usar imagens com a API em lote?
Essa funcionalidade é limitada a determinados modelos multi modais. Atualmente, apenas GPT-4o dá suporte a imagens como parte de solicitações em lote. As imagens podem ser fornecidas como entrada por meio doURL da imagem ou de uma representação codificada em base64 da imagem. No momento, não há suporte para imagens em lote com GPT-4 Turbo.
Posso usar a API em lote com modelos afinados?
Não há suporte para esse recurso no momento.
Posso usar a API em lote para modelos de embeddings?
Não há suporte para esse recurso no momento.
A filtragem de conteúdo funciona com a implantação do Lote Global?
Sim. Semelhante a outros tipos de implantação, você poderá criar filtros de conteúdo e associá-los ao tipo de implantação do Lote Global.
Posso solicitar cota adicional?
Sim, na página de cota no portal do Foundry. A alocação de cota padrão pode ser encontrada no artigo de cota e limites.
O que acontece se a API não concluir minha solicitação dentro do período de 24 horas?
Nosso objetivo é processar essas solicitações dentro de 24 horas; não expiramos os trabalhos que levam mais tempo. Você poderá cancelar o trabalho a qualquer momento. Quando você cancela o trabalho, qualquer trabalho restante é cancelado e qualquer trabalho já concluído é retornado. Você será cobrado por qualquer trabalho concluído.
Quantas solicitações posso colocar em fila usando processamento em lote?
Não há nenhum limite fixo no número de solicitações que você poderá fazer em lote, no entanto, isso dependerá da cota de token enfileirada. Sua cota de token enfileirada inclui o número máximo de tokens de entrada que você poderá enfileirar ao mesmo tempo.
Depois que a solicitação em lote for concluída, o limite de taxa de lote será redefinido, pois os tokens de entrada serão limpos. O limite depende do número de solicitações globais na fila. Se a fila da API do Lote processar seus lotes rapidamente, o limite de taxa de lote será redefinido mais rapidamente.
Resolução de problemas
Um trabalho é bem-sucedido quando status é Completed. Trabalhos bem-sucedidos ainda gerarão um error_file_id, mas ele será associado a um arquivo vazio com zero bytes.
Quando ocorrer uma falha no trabalho, você encontrará detalhes sobre a falha na propriedade errors:
"value": [
{
"id": "batch_80f5ad38-e05b-49bf-b2d6-a799db8466da",
"completion_window": "24h",
"created_at": 1725419394,
"endpoint": "/chat/completions",
"input_file_id": "file-c2d9a7881c8a466285e6f76f6321a681",
"object": "batch",
"status": "failed",
"cancelled_at": null,
"cancelling_at": null,
"completed_at": 1725419955,
"error_file_id": "file-3b0f9beb-11ce-4796-bc31-d54e675f28fb",
"errors": {
"object": “list”,
"data": [
{
"code": "empty_file",
"message": "The input file is empty. Please ensure that the batch contains at least one request."
}
]
},
"expired_at": null,
"expires_at": 1725505794,
"failed_at": null,
"finalizing_at": 1725419710,
"in_progress_at": 1725419572,
"metadata": null,
"output_file_id": "file-ef12af98-dbbc-4d27-8309-2df57feed572",
"request_counts": {
"total": 10,
"completed": null,
"failed": null
},
}
Códigos de erro
| Código do erro | Definição |
|---|---|
invalid_json_line |
Uma linha (ou várias) no arquivo de entrada não pôde ser analisada como json válida. Verifique se não há erros de digitação, colchetes de abertura e fechamento adequados e aspas de acordo com o padrão do JSON e reenvie a solicitação. |
too_many_tasks |
O número de solicitações no arquivo de entrada excede o valor máximo permitido de 100.000. Verifique se o total de solicitações está abaixo de 100.000 e reenvie o trabalho. |
url_mismatch |
Uma linha no arquivo de entrada tem um URL que não corresponde ao restante das linhas ou o URL especificado no arquivo de entrada não corresponde ao URL do ponto de extremidade esperada. Verifique se todos os URLs de solicitação são iguais e se correspondem ao URL do ponto de extremidade associado à implantação do Azure OpenAI. |
model_not_found |
O nome de implantação do modelo do OpenAI do Azure especificado na propriedade model do arquivo de entrada não foi encontrado.Verifique se esse nome aponta para uma implantação de modelo válida do OpenAI do Azure. |
duplicate_custom_id |
A ID personalizada dessa solicitação é uma duplicata da ID personalizada em outra solicitação. |
empty_batch |
Verifique o arquivo de entrada para garantir que o parâmetro de ID personalizado seja exclusivo para cada solicitação no lote. |
model_mismatch |
O nome de implantação do modelo do OpenAI do Azure especificado na propriedade model dessa solicitação no arquivo de entrada não corresponde ao restante do arquivo.Certifique-se de que todas as solicitações no lote apontem para a mesma implantação de modelo do Azure OpenAI no Foundry Models, na propriedade model da solicitação. |
invalid_request |
O esquema da linha de entrada é inválido ou o SKU de implantação é inválido. Verifique se as propriedades da solicitação no arquivo de entrada correspondem às propriedades de entrada esperadas e se a SKU de implantação do OpenAI do Azure é globalbatch para solicitações de API em lote. |
input_modified |
A entrada de blob foi modificada após o envio do trabalho em lote. |
input_no_permissions |
Não é possível acessar o blob de entrada. Verifique as permissões e o acesso à rede entre a conta do Azure OpenAI e a conta de Armazenamento do Azure. |
Problemas conhecidos
Os recursos implantados com a CLI do Azure não funcionarão prontamente com o lote global do OpenAI do Azure. Isso ocorre devido a um problema em que os recursos implantados usando esse método têm subdomínios de ponto de extremidade que não seguem o padrão
https://your-resource-name.openai.azure.com. Uma solução alternativa para esse problema é implantar um novo recurso do OpenAI do Azure usando um dos outros métodos de implantação comuns que manipularão corretamente a configuração do subdomínio como parte do processo de implantação.Não há suporte para arquivos codificados
jsonlem UTF-8-BOM. Os arquivos de linhas JSON devem ser codificados usando UTF-8. O uso de arquivos codificados em Byte-Order-Mark (BOM) não é oficialmente compatível com a especificação JSON RFC e o Azure OpenAI tratará atualmente os arquivos codificados em BOM como inválidos. Um arquivo codificado em UTF-8-BOM retornará atualmente a mensagem de erro genérica: "Falha na validação: não foi possível extrair um nome de implantação de modelo válido do arquivo de entrada. Verifique se cada linha no arquivo de entrada tem um nome de implantação válido especificado no campo 'modelo' e se o nome da implantação é consistente em todas as linhas."Ao usar um armazenamento próprio para os dados de entrada em lote, depois que o trabalho em lote for enviado, se o blob de entrada for modificado, o trabalho de pontuação será reprovado pelo serviço.
Consulte também
- Saiba mais sobre os tipos de implantação do OpenAI do Azure
- Saiba mais sobre as cotas e limites do OpenAI do Azure