Skip to main content
Tjänsterna på Ace Data Cloud delas in i två kategorier baserat på svarsmönster: Denna artikel fokuserar på de två sista kategorierna: TaskHandle-polling för asynkrona uppgifter och detaljer, fallgropar och språkövergripande skillnader för chat-strömmande svar.

I. TaskHandle — En enhetlig abstraktion för asynkrona uppgifter

De tre SDK:erna kapslar in asynkrona uppgifter som TaskHandle och erbjuder samma 4 metoder:

Två sätt att anropa för att skapa uppgifter

Varje asynkront resurs (images.generate / video.generate / audio.generate) har en wait parameter:
  • wait=False (standard): Returnerar omedelbart TaskHandle, affärskoden bestämmer själv när den ska poll.
  • wait=True: SDK anropar direkt handle.wait(), funktionen returnerar svaret efter att det är klart. Använd endast när du är säker på att mål-API:et alltid kommer att returnera status: succeeded fältet — ett fåtal leverantörer följer inte detta avtal, vilket gör att wait fortsätter till max_wait innan det kastar TimeoutError.

Enhetsdifferenser (⚠️ Viktigt att läsa)

Enheterna för poll_interval och max_wait är olika i de tre språken, vilket är en vanlig fallgrop vid språkövergång:
Att behandla TS:s { pollInterval: 3000 } som sekunder och översätta till Python poll_interval=3000 kommer att få SDK att vänta 50 minuter innan den pollar andra gången.

Exempel: Python explicit polling för Midjourney

Hela koden gör följande:
  1. images.generate(..., wait=False) skickar prompt till Midjourney API, får omedelbart handle, blockerar inte.
  2. handle.wait(poll_interval=3.0, max_wait=180.0) gör en POST till /midjourney/tasks var tredje sekund, tills status ändras till succeeded eller failed, eller total tid överstiger 180 sekunder och kastar TimeoutError.
  3. När det är klart innehåller result["response"]["data"] vanligtvis 4 bilder (Midjourney standard 2x2 grid).

Exempel: TypeScript explicit polling

Val mellan synkron generering och asynkrona uppgifter

Om din leverantör redan är en synkron bildgenerering (NanoBanana / Flux / Seedream), skicka inte wait:
Det är enkelt att avgöra: Om mål-API-dokumentationen inte har task_id + /tasks-par, är det synkron generering; i svaret för synkron generering finns det redan ett data-fält som innehåller det slutgiltiga resultatet.

Intern protokoll för TaskHandle

TaskHandle.get() anropar:
Svaret har en enhetlig struktur:
SDK:n är också kompatibel med äldre svar utan yttre response-inpackning — läser direkt den översta status, så byte mellan nya och gamla svar påverkar inte affärskoden.

II. SSE Strömmande svar (chat.completions)

chat.completions.create(stream=True) är för närvarande det enda strömmande gränssnittet i SDK:n (ljud / video ström stöds ännu inte). De tre språkens iterativa stilar är var och en inbyggda:

TypeScript

Verklig körningsresultat:

Python

Verklig körningsresultat:

Go

Verklig körningsresultat:

Struktur av strömmande chunk

Varje chunk är en OpenAI-kompatibel chat.completion.chunk:
  • Den första chunk innehåller vanligtvis delta.role: "assistant" men content är tom.
  • De mellanliggande chunkarna har var och en delta.content, som kan sammanfogas direkt.
  • Den sista chunk har delta tom, finish_reason är stop / length / content_filter.

Avbrytande under vägen

Tidigare avbrutna token som redan har debiterats — token som genererades före avbrott kommer fortfarande att debiteras enligt faktisk förbrukning.

Tre, tidsgränser och omförsök

De tre SDK:erna delar samma uppsättning omförsöksstrategier: För att inaktivera omförsök: skicka max_retries=0 / maxRetries: 0 / WithMaxRetries(0) när du konstruerar klienten. Polling av asynkrona uppgifter (TaskHandle) påverkas inte av max_retries — dess loop är affärsnivå snarare än HTTP-nivå, kontrolleras av max_wait för total längd.

Fyra, vanliga fallgropar

  1. Synkron provider ska inte skicka wait: NanoBanana / Flux / Seedream genererar synkront, att tvinga wait=True får SDK att pollera en tasks-gränssnitt som inte kommer att uppdateras.
  2. Skillnader i enhet för TaskHandle: Python är sekunder, TS är millisekunder, se till att konvertera vid överföring mellan språk.
  3. wait=True kan fortfarande ge TimeoutError: Svar måste uppfylla status in ('succeeded','failed') för att avsluta loopen; om provider använder andra fältnamn, måste affärskoden själv handle.get() analysera.
  4. Strömmande avbrytande: Token som genererades före avbrott har redan debiterats.
  5. Återanvänd klient inom samma process: SDK har en inbyggd anslutningspool, frekvent new AceDataCloud() / AceDataCloud() kan göra TLS-handshake till en flaskhals.

Lär dig mer