Este artigo foca nas duas últimas categorias: Polling de TaskHandle para Tarefas Assíncronas e detalhes, armadilhas e diferenças entre linguagens para respostas em stream de chat.
I. TaskHandle — Abstração Unificada para Tarefas Assíncronas
As três SDKs encapsulam tarefas assíncronas emTaskHandle, oferecendo os mesmos 4 métodos:
Duas Formas de Chamada para Criar Tarefas
Cada recurso assíncrono (images.generate / video.generate / audio.generate) possui o parâmetro wait:
wait=False(padrão): Retorna imediatamenteTaskHandle, o código de negócio decide quando fazer polling.wait=True: O SDK chama diretamentehandle.wait(), a função retorna a resposta após a conclusão. Use apenas quando você tiver certeza de que a API de destino sempre retornará o campostatus: succeeded— alguns provedores não seguem essa convenção, fazendo com quewaitcontinue atémax_waitantes de lançarTimeoutError.
Diferenças de Unidade (⚠️ Leitura Obrigatória)
As unidades depoll_interval e max_wait são diferentes nas três linguagens, um ponto comum de erro ao migrar entre linguagens:
Tratar{ pollInterval: 3000 }do TS como segundos e traduzi-lo para Python comopoll_interval=3000fará com que o SDK espere 50 minutos antes de fazer o segundo polling.
Exemplo: Polling Explícito em Python para Midjourney
images.generate(..., wait=False)envia opromptpara a API Midjourney, obtendo imediatamente ohandle, sem bloquear.handle.wait(poll_interval=3.0, max_wait=180.0)faz um POST a cada 3 segundos em/midjourney/tasks, até que ostatusmude parasucceededoufailed, ou até que o tempo total exceda 180 segundos, lançandoTimeoutError.- Após a conclusão,
result["response"]["data"]geralmente contém 4 imagens (Midjourney por padrão gera uma grade 2x2).
Exemplo: Polling Explícito em TypeScript
Sincronização vs Tarefas Assíncronas
Se o seu provedor já gera imagens de forma síncrona (NanoBanana / Flux / Seedream), não passewait:
task_id + /tasks, é uma geração síncrona; a resposta da geração síncrona já contém o resultado final no campo data.
Protocolo Interno do TaskHandle
A chamadaTaskHandle.get() é:
response externo — lê diretamente o status de nível superior, portanto, a troca entre versões nova e antiga não afeta o código de negócio.
II. Resposta em Stream SSE (chat.completions)
chat.completions.create(stream=True) é atualmente a única interface de stream no SDK (streams de áudio / vídeo ainda não são suportadas). O estilo de iteração nas três linguagens é nativo:
TypeScript
Python
Go
Estrutura do chunk em fluxo
Cada chunk é umchat.completion.chunk compatível com OpenAI:
- O primeiro chunk geralmente traz
delta.role: "assistant"mascontentestá vazio. - Os chunks intermediários trazem cada um
delta.content, que pode ser concatenado diretamente. - O último chunk tem
deltavazio,finish_reasonéstop/length/content_filter.
Cancelamento no meio do caminho
Tokens já cobrados não são reembolsados ao cancelar — os tokens gerados antes do momento do cancelamento ainda serão cobrados.
Três, Timeout e Retentativas
Os três SDKs compartilham a mesma estratégia de retentativa:
Para desativar as retentativas: passe
max_retries=0 / maxRetries: 0 / WithMaxRetries(0) ao construir o cliente.
A polling de tarefas assíncronas (TaskHandle) não é afetada por max_retries — seu loop é de nível de negócio e não de nível HTTP, controlado por max_wait para a duração total.
Quatro, Armadilhas Comuns
- Não passe
waitpara providers síncronos: NanoBanana / Flux / Seedream geram de forma síncrona, forçarwait=Truefará com que o SDK faça polling em uma interfacetasksque não será atualizada. - Diferenças de unidade em TaskHandle: Python é em segundos, TS é em milissegundos, sempre faça a conversão ao portar entre linguagens.
wait=Trueainda pode resultar emTimeoutError: A resposta deve satisfazerstatus in ('succeeded','failed')para sair do loop; se o provider usar outros nomes de campo, o código de negócio deve fazer a análise comhandle.get().- Cancelamento em fluxo: Tokens gerados antes do cancelamento já foram cobrados.
- Reutilize o cliente dentro do mesmo processo: O SDK possui um pool de conexões, criar frequentemente
new AceDataCloud()/AceDataCloud()fará com que o handshake TLS se torne um gargalo.

