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

# Hur undviker du dubbla videojobb när en API-begäran får timeout?

> Förhindra dubbla videojobb genom att ge varje avsett resultat en stabil operation key, spara begäran före inskickning, använda dokumenterad idempotency hos leverantören och stämma av tvetydiga timeouts före retry. Timeout betyder att resultatet är okänt, inte att leverantören avvisade jobbet.

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

# Hur undviker du dubbla videojobb när en API-begäran får timeout?

En timeout vid inskickning skapar ett tvetydigt resultat. Begäran kan ha misslyckats innan den nådde tjänsten, nått tjänsten men avvisats eller skapat ett fjärrjobb vars svar aldrig kom tillbaka till klienten. Ett omedelbart nytt försök kan därför göra ett avsett klipp till två betalda genereringar.

Lösningen är ett idempotent operation-lager runt video-API:t. Skapa och spara den avsedda operationen först, ge den en stabil nyckel, registrera varje försök och använd leverantörens dokumenterade idempotency eller lookup. Om fjärrresultatet inte kan bevisas flyttas operationen till ett tydligt `unknown`-tillstånd i stället för att låtsas att den misslyckades.

## Definiera en avsedd sidoeffekt

En idempotency key måste identifiera vad användaren bad systemet skapa. Den ska inte identifiera ett enskilt HTTP-försök. Om varje retry får en ny nyckel kan leverantören inte känna igen dubbletten.

För ett katalogflöde kan en operation definieras av:

* produkt-ID;
* version av kreativ mall;
* fingerprint för källmedia;
* promptversion;
* locale;
* bildformat;
* variantnamn.

Skapa en kanonisk representation med stabil nyckelordning och normaliserade värden och beräkna sedan en hash. Lagra läsbara dimensioner bredvid hashen. När användaren avsiktligt begär en annan oberoende generering ska en ny operation eller variant skapas även om prompten råkar vara identisk.

Använd inte ett slumpmässigt UUID som skapas inne i retry-loopen. Skapa operation key före första begäran och återanvänd den tills den avsedda sidoeffekten når ett slutligt tillstånd.

## Spara före inskickning

Den lokala databasen ska känna till operationen innan nätverksanropet börjar. Det är write-ahead-principen tillämpad på API-sidoeffekter.

En operation-post kan innehålla:

| Fält | Syfte |
|---|---|
| Operation key | Förhindrar dubbla lokala avsikter |
| Request hash | Bevisar vilka parametrar som skickades |
| Tillstånd | Skiljer prepared, sent, unknown och complete |
| Antal försök | Tillämpningar en begränsad retry-policy |
| Leverantör och modell | Stöder routing och avstämning |
| Remote job ID | Återupptar polling utan ny inskickning |
| Senaste fel | Bevarar diagnostiskt sammanhang |
| Output checksum | Upptäcker dubbla eller ändrade tillgångar |

Använd en unik databasbegränsning på operation key. Två workers som försöker skapa samma operation ska mötas i samma post. Ta posten med en atomisk uppdatering eller lease innan någon worker skickar begäran.

## Använd bara leverantörens idempotency enligt dokumentationen

Vissa API:er accepterar en idempotency key eller request token och returnerar resultatet från första accepterade begäran när samma nyckel återanvänds. Detta är den starkaste vägen när dokumentationen tydligt täcker endpoint, lagringsperiod, parameterjämförelse och felbeteende.

Verifiera fyra saker:

* om endpointen för videogenerering stöder nyckeln;
* hur länge leverantören minns den;
* om samma nyckel med olika parametrar avvisas;
* om retries returnerar ursprungligt remote job ID.

Anta inte att en header som stöds för betalningar eller synkrona textbegäranden också gäller asynkrona videojobb. En OpenAI-kompatibel request-form gör inte automatiskt leverantörens jobbskapande idempotent.

## Behandla timeout som ett okänt resultat

Använd tillstånd som beskriver bevis snarare än förhoppningar.

| Tillstånd | Bevis | Nästa åtgärd |
|---|---|---|
| `prepared` | Lokal post finns, sändning inte startad | Skicka |
| `sending` | Worker startade begäran | Vänta på resultat eller timeout |
| `accepted` | Remote job ID mottaget | Polla |
| `unknown` | Timeout utan bekräftat resultat | Stäm av |
| `failed` | Leverantören avvisade eller avslutade jobbet med fel | Tillämpa felpolicy |
| `complete` | Resultatet är beständigt lagrat | Returnera befintligt resultat |

Skillnaden mellan `unknown` och `failed` är avgörande. Ett nätverksfel är bevis om klientanslutningen, inte nödvändigtvis om leverantörens arbete.

Bifoga lokal operation key till leverantörens metadata när API:t erbjuder client reference eller metadataobjekt. En senare jobblista eller supportfråga får då ett stabilt värde att söka efter.

## Stäm av före retry

En worker för avstämning undersöker en unknown operation. Tillgängliga bevis beror på leverantören, men ordningen ska vara avsiktlig.

1. Kontrollera om första försöket sparade remote job ID innan processen föll.
2. Fråga leverantören med idempotency key eller client reference om det stöds.
3. Sök i en avgränsad jobblista med skapandetid, modell och request fingerprint.
4. Kontrollera webhook events som kan ha kommit efter klientens timeout.
5. Jämför billing- eller usage events när de kommer tillräckligt snabbt.
6. Gör retry endast när systemet kan bevisa att inget jobb finns eller dokumenterad idempotency gör det säkert.

Matchning på enbart tid och prompt kan ge falska positiva resultat. Använd flera attribut och skicka osäkra träffar till granskning. Om API:t saknar lookup och idempotency-garanti kan rätt policy vara att vänta, acceptera möjlig dubblett eller begära ett mänskligt beslut utifrån klippkostnad och deadline.

## Separera transport-retry från operation-retry

HTTP-bibliotek försöker ofta automatiskt om nätverksfel. Det hjälper säkra läsningar men är riskabelt för inskickningar med sidoeffekt. Stäng av generella POST-retries om operationen inte skyddas av en stabil idempotency key och endpointen dokumenterar beteendet.

Använd två räknare:

* transport attempts för att skicka samma skyddade operation;
* generation attempts för att avsiktligt skapa ett ersättningsresultat efter terminalt fel eller kvalitetsavslag.

Räknarna representerar olika kostnader. En transport-retry ska mötas i samma fjärrjobb. En generation-retry är ett nytt debiterbart kreativt försök och behöver en ny försöksidentitet, men ska fortfarande kopplas till ursprungligt produktionsjobb.

## Hantera samtidiga workers med lease

Timeout är inte enda källan till dubbletter. Två workers kan ta samma köpost, eller en långsam worker kan fortsätta efter att låset löpt ut.

Ta arbete med en atomisk lease som innehåller ägare, starttid och utgång. Före inskickning bekräftar workern att den fortfarande äger lease och att inget accepterat fjärrjobb redan har registrerats. Spara remote job ID i en transaktion eller compare-and-set som misslyckas om en annan worker flyttat operationen framåt.

Använd fencing tokens när en gammal worker fortfarande kan skriva. Varje nytt lease ökar en version. Databasen accepterar bara tillståndsändringar från senaste version, vilket hindrar en gammal process från att skriva över ett nyare resultat.

## Utforma webhooks och polling för konvergens

Videojobb är asynkrona, så polling och webhooks kan rapportera samma övergång. Deras handlers måste också vara idempotenta.

Deduplicera webhook events med leverantörens event ID när det finns. Gör även tillståndsuppdateringar villkorade: ett event med `processing` får inte flytta ett jobb bakåt från `complete`. Två nedladdningar av samma resultat ska skriva till en deterministisk temporär nyckel, verifiera checksumma och mötas i ett slutligt beständigt objekt.

Den lyckade vägen ska vara säker att upprepa:

```text
ta emot completion
slå upp operation med remote job ID
kopiera utdata till deterministisk lagringsnyckel
verifiera media och checksumma
registrera beständig URI
markera operation complete om den inte redan är det
```

Om ett steg kraschar kan nästa handler börja om utan att generera en ny video.

## Logga tillräckliga bevis för dubblettrevision

För varje försök behåller du tidsstämplar kring sändning, timeout-typ, request hash, idempotency key, leverantörens svarsheaders, remote ID och beslut om retry. Maskera inloggningsuppgifter och känsliga promptdata.

Följ operativa mått:

| Mått | Vad det visar |
|---|---|
| Unknown submissions | Nätverks- eller leverantörstvetydighet |
| Avstämda utan retry | Dubbletter som lyckades undvikas |
| Antal skyddade retries | Idempotency-beteende vid fel |
| Misstänkta dubbla jobb | Kvarvarande finansiell risk |
| Duplicerad output checksum | Samma eller upprepat leverantörsresultat |
| Tid i unknown | Återställningshastighet |

Larma vid en ovanlig ökning av unknown-resultat innan retry-gränser bara höjs. En nätverksregression kombinerad med aggressiva retries kan snabbt multiplicera kostnader.

## Lägg leverantörsbeteendet bakom en adapter

En applikation med flera modeller ska erbjuda ett internt gränssnitt för inskickning med capability flags. Adaptern äger endpoint-schema, idempotency-mekanism, job lookup, tillståndsmappning och extraktion av utdata.

[Atlas Cloud](https://www.atlascloud.ai/?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=avoid-duplicate-video-jobs-api-timeout) kan minska integrationsarbetet för team som använder text-, bild- och videomodeller via en OpenAI-kompatibel plattform. Kontrollera ändå aktuellt beteende för exakt videomodell och endpoint. Kompatibilitet normaliserar många request-mönster men ska inte ses som ett universellt löfte om idempotency för asynkrona jobb.

Returnera ett normaliserat resultat, exempelvis accepted med remote ID, tydligt avslag eller unknown. Gör inte transportfel till leverantörsfel inuti adaptern.

## Testa de tvetydiga fallen avsiktligt

Happy path bevisar inte dubblettsäkerhet. I staging injicerar du fel före sändning, efter att bytes lämnat klienten, efter leverantörens acceptans, efter mottaget svar men före databasuppdateringen och under webhook-leverans.

För varje fall ska en avsedd operation ge högst ett fjärrjobb när leverantören stöder idempotency. När den inte gör det ska operationen gå till `unknown`, automatisk omsändning pausas och tillräckliga bevis visas för vald policy.

Testa även samtidiga workers, utgångna leases, sena och upprepade webhooks, omstart av processer och återanvändning av gammal nyckel med ändrade parametrar. Testerna är billigare än att upptäcka dubbla genereringar på fakturan.

## Slutsatsen

Undvik dubbla videojobb genom att ge varje avsett resultat en beständig operation key och skilja operationen från dess HTTP-försök. Spara avsikten före inskickning, använd dokumenterad idempotency och behandla timeout som ett okänt resultat som måste stämmas av. Med leases, villkorade tillståndsändringar, idempotenta completion-handlers och beständiga försöksloggar blir retry kontrollerad återställning i stället för ett oavsiktligt dubbelköp.

## FAQ

### Betyder en HTTP-timeout att video-API:t inte skapade något jobb?

Nej. Leverantören kan ha accepterat begäran och skapat ett jobb även om klienten inte fick svaret. Behandla resultatet som okänt tills det har stämts av.

### Vad ska en idempotency key representera?

Den ska representera en avsedd sidoeffekt, exempelvis en produkt, mallversion, locale, bildformat och variant. Återanvänd den för retries av samma operation, men skapa en ny nyckel för ett verkligt nytt resultat.

### Kan en unik databasbegränsning förhindra alla dubbletter?

Den förhindrar dubbla lokala operations men kan inte ensam hindra leverantören från att acceptera två begäranden. Kombinera den med leverantörens idempotency eller en avstämningsprocess.

### Ska en klient automatiskt försöka om varje timeout?

Nej. Automatisk retry är säker endast när begäran är idempotent eller leverantörens resultat kan fastställas. Annars placeras jobbet i unknown och stäms av först.

### Hur länge ska idempotency-poster behållas?

Minst lika länge som retry-fönstret, leverantörens sökfönster, perioden för fakturatvister och verksamhetens revisionsbehov. Anpassa tiden till dokumenterat beteende och affärsrisk.

### Garanterar ett OpenAI-kompatibelt API samma idempotency för alla videomodeller?

Nej. Kompatibilitet kan normalisera transporten, men asynkron jobbskapande och stöd för idempotency kan fortfarande vara modell- eller leverantörsspecifikt. Kontrollera aktuell dokumentation för exakt endpoint.
