Skip to main content
Os serviços na Ace Data Cloud são divididos em duas categorias de modo de resposta: 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 em TaskHandle, 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 imediatamente TaskHandle, o código de negócio decide quando fazer polling.
  • wait=True: O SDK chama diretamente handle.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 campo status: succeeded — alguns provedores não seguem essa convenção, fazendo com que wait continue até max_wait antes de lançar TimeoutError.

Diferenças de Unidade (⚠️ Leitura Obrigatória)

As unidades de poll_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 como poll_interval=3000 fará com que o SDK espere 50 minutos antes de fazer o segundo polling.

Exemplo: Polling Explícito em Python para Midjourney

O código completo faz o seguinte:
  1. images.generate(..., wait=False) envia o prompt para a API Midjourney, obtendo imediatamente o handle, sem bloquear.
  2. handle.wait(poll_interval=3.0, max_wait=180.0) faz um POST a cada 3 segundos em /midjourney/tasks, até que o status mude para succeeded ou failed, ou até que o tempo total exceda 180 segundos, lançando TimeoutError.
  3. 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 passe wait:
O método de julgamento é simples: se a documentação da API de destino não contém 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 chamada TaskHandle.get() é:
A resposta tem uma estrutura unificada:
O SDK também é compatível com respostas antigas que não têm o 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

Resultado real da execução:

Python

Resultado real da execução:

Go

Resultado real da execução:

Estrutura do chunk em fluxo

Cada chunk é um chat.completion.chunk compatível com OpenAI:
  • O primeiro chunk geralmente traz delta.role: "assistant" mas content está vazio.
  • Os chunks intermediários trazem cada um delta.content, que pode ser concatenado diretamente.
  • O último chunk tem delta vazio, 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

  1. Não passe wait para providers síncronos: NanoBanana / Flux / Seedream geram de forma síncrona, forçar wait=True fará com que o SDK faça polling em uma interface tasks que não será atualizada.
  2. Diferenças de unidade em TaskHandle: Python é em segundos, TS é em milissegundos, sempre faça a conversão ao portar entre linguagens.
  3. wait=True ainda pode resultar em TimeoutError: A resposta deve satisfazer status 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 com handle.get().
  4. Cancelamento em fluxo: Tokens gerados antes do cancelamento já foram cobrados.
  5. 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.

Saiba mais