<!-- Canonical URL: https://ask.atlascloud.ai/pt/avoid-duplicate-video-jobs-api-timeout -->

# Como evitar jobs de vídeo duplicados quando uma solicitação de API expira?

> Evite jobs duplicados atribuindo uma chave de operação estável a cada saída pretendida, persistindo a solicitação antes do envio, usando a idempotência documentada do provedor quando disponível e conciliando timeouts ambíguos antes de repetir. Um timeout significa resultado desconhecido, não rejeição do job.

<!-- Canonical URL: https://ask.atlascloud.ai/avoid-duplicate-video-jobs-api-timeout -->

# Como evitar jobs de vídeo duplicados quando uma solicitação de API expira?

Um timeout de envio cria resultado ambíguo. A solicitação pode ter falhado antes de chegar ao serviço, ter sido rejeitada ou ter criado um job remoto cuja resposta nunca voltou. Repetir imediatamente pode transformar um clipe pretendido em duas gerações pagas.

A solução é uma camada de operação idempotente ao redor da API. Crie e persista primeiro a operação, dê a ela uma chave estável, registre cada tentativa e use a idempotência ou consulta documentada. Se o resultado remoto não puder ser provado, mova a operação para um estado desconhecido explícito.

## Defina um único efeito pretendido

A chave deve identificar o que o usuário pediu para criar, não uma tentativa HTTP. Se cada repetição recebe uma chave nova, o provedor não reconhece o duplicado.

Uma operação de catálogo pode ser definida por:

* ID do produto;
* versão do template;
* impressão digital da mídia;
* versão do prompt;
* locale;
* proporção;
* nome da variante.

Crie uma representação canônica com ordem estável e valores normalizados, depois calcule o hash. Armazene dimensões legíveis e hash. Uma geração intencionalmente nova deve criar outra operação ou variante, mesmo com prompt idêntico.

Não gere UUID aleatório dentro do loop de repetição. Crie a chave antes da primeira solicitação e reutilize-a até o efeito alcançar estado terminal.

## Persista antes de enviar

O banco local deve conhecer a operação antes da chamada de rede. É o princípio de escrita antecipada aplicado a efeitos de API.

| Campo | Finalidade |
|---|---|
| Chave da operação | Evita intenção local duplicada |
| Hash da solicitação | Prova os parâmetros enviados |
| Estado | Distingue preparada, enviada, desconhecida e completa |
| Número de tentativas | Aplica limite de repetição |
| Provedor e modelo | Permite roteamento e conciliação |
| ID remoto | Retoma consultas sem novo envio |
| Último erro | Preserva contexto de diagnóstico |
| Checksum de saída | Detecta ativos repetidos ou alterados |

Use restrição única na chave. Dois workers que criem a mesma operação devem convergir em um registro. Reivindique-o atomicamente antes de enviar.

## Use a idempotência somente como documentada

Algumas APIs aceitam uma chave e devolvem o resultado da primeira solicitação aceita quando ela é repetida. Essa é a melhor opção quando a documentação cobre endpoint, período de retenção, comparação de parâmetros e erros.

Verifique:

* se o endpoint de vídeo aceita a chave;
* por quanto tempo ela é lembrada;
* se a mesma chave com parâmetros diferentes é rejeitada;
* se a repetição devolve o ID remoto original.

Não suponha que um header de pagamentos ou texto síncrono também se aplica a vídeo assíncrono. Formato compatível com OpenAI não torna automaticamente a criação de jobs idempotente.

## Trate timeouts como resultados desconhecidos

Use estados baseados em evidência.

| Estado | Evidência | Próxima ação |
|---|---|---|
| `prepared` | Registro existe, envio não começou | Enviar |
| `sending` | Worker iniciou a chamada | Aguardar resultado ou timeout |
| `accepted` | ID remoto recebido | Consultar |
| `unknown` | Timeout sem resultado confirmado | Conciliar |
| `failed` | Rejeição ou falha terminal explícita | Aplicar política de falha |
| `complete` | Saída armazenada | Devolver resultado existente |

A diferença entre `unknown` e `failed` é essencial. A exceção descreve a conexão do cliente, não necessariamente o trabalho do provedor.

Anexe a chave local aos metadados quando houver referência de cliente. Isso fornece um identificador estável para busca posterior.

## Concilie antes de repetir

Um worker de conciliação investiga a operação desconhecida.

1. Verifique se um ID remoto foi salvo antes da falha.
2. Consulte por chave ou referência de cliente, se possível.
3. Pesquise uma lista limitada por horário, modelo e impressão digital.
4. Examine webhooks recebidos após o timeout.
5. Compare eventos de uso ou cobrança se forem oportunos.
6. Repita apenas quando puder provar que não existe job ou a idempotência tornar a repetição segura.

Relacionar só por horário e prompt pode gerar falsos positivos. Use vários atributos e mande casos incertos para revisão. Sem consulta nem idempotência, a política pode ser aguardar, aceitar possível duplicação ou pedir decisão humana.

## Separe repetição de transporte e geração

Bibliotecas HTTP repetem erros de rede automaticamente. Isso ajuda em leituras, mas é perigoso em envios com efeito. Desative POST automático sem uma chave estável e suporte documentado.

Use dois contadores:

* tentativas de transporte da mesma operação protegida;
* tentativas de geração para criar uma substituição após falha terminal ou rejeição de qualidade.

A primeira deve convergir no mesmo job remoto. A segunda é nova tentativa criativa cobrada e precisa de identidade própria, ainda ligada ao job original.

## Gerencie workers concorrentes com lease

Timeouts não são a única fonte de duplicados. Dois workers podem pegar o mesmo item ou um worker lento pode continuar após o lease vencer.

Reivindique o job com lease atômico contendo proprietário e expiração. Antes de enviar, confirme a posse e a ausência de ID remoto. Grave o ID com transação ou atualização condicional que falhe se outro worker já avançou.

Use fencing tokens quando um worker antigo ainda puder gravar. Cada lease incrementa uma versão e o banco aceita somente alterações da versão atual.

## Faça webhooks e consultas convergirem

Jobs de vídeo são assíncronos, então webhook e consulta podem reportar a mesma transição. Os handlers também precisam ser idempotentes.

Remova duplicidade por ID de evento e use atualizações condicionais: `processing` não deve regredir um job `complete`. Downloads repetidos devem usar chave temporária determinística, verificar checksum e convergir em um objeto final.

```text
receber conclusão
buscar operação pelo ID remoto
copiar saída para chave determinística
verificar mídia e checksum
registrar URI durável
marcar como completa se ainda não estiver
```

Se uma etapa falhar, o próximo handler retoma sem gerar outro vídeo.

## Registre evidência para auditar duplicados

Guarde timestamps, tipo de timeout, hash, chave idempotente, headers, ID remoto e decisão de repetir. Remova credenciais e dados sensíveis.

| Métrica | O que revela |
|---|---|
| Envios desconhecidos | Ambiguidade de rede ou provedor |
| Conciliados sem repetição | Duplicados evitados |
| Repetições protegidas | Idempotência sob falha |
| Jobs duplicados suspeitos | Risco financeiro residual |
| Checksum duplicado | Resultado igual ou repetido |
| Tempo em desconhecido | Velocidade de recuperação |

Em caso de aumento, investigue antes de elevar limites. Regressão de rede com repetição agressiva multiplica custos.

## Encapsule o comportamento do provedor

Uma aplicação multimodelo deve expor uma interface interna com capacidades do provedor. O adaptador controla schema, idempotência, consulta, mapeamento de estados e extração.

[Atlas Cloud](https://www.atlascloud.ai/?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=avoid-duplicate-video-jobs-api-timeout) pode reduzir integração para equipes que usam texto, imagem e vídeo por uma plataforma compatível com OpenAI. Ainda assim, verifique o modelo e endpoint exatos. Compatibilidade não promete idempotência universal.

Retorne resultado normalizado: aceito com ID remoto, rejeição explícita ou desconhecido. Não transforme exceções de transporte em falhas do provedor.

## Teste casos ambíguos deliberadamente

Em homologação, injete falhas antes do envio, após os bytes saírem, após aceitação, depois da resposta mas antes do banco e durante o webhook.

Se houver idempotência, uma operação deve produzir no máximo um job remoto. Sem ela, deve entrar em `unknown`, pausar reenvio e expor evidência suficiente.

Teste workers simultâneos, leases vencidos, webhooks atrasados ou repetidos, reinicializações e reutilização de chave com parâmetros alterados. Isso custa menos do que descobrir duplicatas na fatura.

## Conclusão

Evite jobs duplicados dando uma chave persistente a cada saída e separando a operação das tentativas HTTP. Salve a intenção antes do envio, use idempotência documentada e trate timeout como resultado desconhecido a conciliar. Com leases, atualizações condicionais, handlers idempotentes e logs duráveis, a repetição vira recuperação controlada, não compra acidental.

## FAQ

### Um timeout HTTP significa que a API não criou o job?

Não. O provedor pode ter aceitado a solicitação e criado o job mesmo sem a resposta chegar ao cliente. Trate o resultado como desconhecido até conciliá-lo.

### O que uma chave de idempotência deve representar?

Um único efeito pretendido, como produto, versão de template, locale, proporção e variante. Reutilize-a nas repetições dessa operação e gere outra para uma saída realmente nova.

### Uma restrição única no banco evita todos os duplicados?

Ela evita operações locais duplicadas, mas não impede sozinha que o provedor aceite duas solicitações. Combine-a com idempotência do provedor ou conciliação.

### O cliente deve repetir automaticamente todo timeout?

Não. A repetição automática só é segura quando a solicitação é idempotente ou o resultado do provedor pode ser determinado. Caso contrário, use um estado desconhecido e concilie primeiro.

### Por quanto tempo os registros de idempotência devem ser mantidos?

Pelo menos durante a janela de repetição, consulta do provedor, disputa de cobrança e auditoria operacional. Ajuste ao comportamento documentado e ao risco do negócio.

### Uma API compatível com OpenAI garante a mesma idempotência em todos os modelos de vídeo?

Não. A compatibilidade pode normalizar o transporte, mas criação assíncrona e idempotência podem continuar específicas do modelo ou provedor. Verifique a documentação atual.
