Skip to main content
Los servicios en Ace Data Cloud se dividen en dos categorías según el modo de respuesta: Este artículo se centra en las dos últimas categorías: sondeo de TaskHandle para tareas asincrónicas y detalles, trampas y diferencias entre lenguajes en respuestas de chat en flujo.

I. TaskHandle — Abstracción Unificada para Tareas Asincrónicas

Los tres SDK encapsulan tareas asincrónicas en TaskHandle, proporcionando los mismos 4 métodos:

Dos Formas de Llamar para Crear Tareas

Cada recurso asincrónico (images.generate / video.generate / audio.generate) tiene un parámetro wait:
  • wait=False (por defecto): Devuelve inmediatamente TaskHandle, el código de negocio decide cuándo sondear.
  • wait=True: El SDK llama internamente a handle.wait(), la función devuelve la respuesta una vez completada. Usar solo si estás seguro de que la API objetivo devolverá el campo status: succeeded — algunos proveedores no cumplen con esta convención, lo que hará que wait siga hasta que max_wait lance TimeoutError.

Diferencias de Unidades (⚠️ Debe Leer)

La unidad de poll_interval y max_wait es diferente en los tres lenguajes, lo que es un punto común de error al migrar entre lenguajes:
Tomar { pollInterval: 3000 } de TS como segundos y traducirlo a Python como poll_interval=3000, hará que el SDK espere 50 minutos antes de sondear por segunda vez.

Ejemplo: Sondeo Explícito en Python para Midjourney

El código completo hace lo siguiente:
  1. images.generate(..., wait=False) envía el prompt a la API de Midjourney, obteniendo inmediatamente el handle, sin bloquear.
  2. handle.wait(poll_interval=3.0, max_wait=180.0) envía un POST a /midjourney/tasks cada 3 segundos internamente, hasta que status cambie a succeeded o failed, o el tiempo total exceda 180 segundos y lance TimeoutError.
  3. Al completarse, result["response"]["data"] generalmente contiene 4 imágenes (Midjourney por defecto 2x2 grid).

Ejemplo: Sondeo Explícito en TypeScript

Consideraciones entre Generación Sincrónica y Tareas Asincrónicas

Si tu proveedor ya genera imágenes de forma sincrónica (NanoBanana / Flux / Seedream), no pases wait:
La forma de juzgar es simple: si la documentación de la API objetivo no tiene task_id + /tasks, es generación sincrónica; el campo data en la respuesta de generación sincrónica ya contiene el resultado final.

Protocolo Interno de TaskHandle

La llamada a TaskHandle.get() es:
La respuesta tiene una estructura uniforme:
El SDK también es compatible con respuestas antiguas que no tienen el envoltorio externo response — se puede leer directamente el status de nivel superior, por lo que el cambio entre versiones de respuesta no afecta al código de negocio.

II. Respuesta en Flujo SSE (chat.completions)

chat.completions.create(stream=True) es actualmente la única interfaz de flujo en el SDK (el flujo de audio / video aún no está soportado). El estilo de iteración en los tres lenguajes es nativo:

TypeScript

Resultado real:

Python

Resultado real:

Go

Resultado real:

Estructura del chunk de flujo

Cada chunk es un chat.completion.chunk compatible con OpenAI:
  • El primer chunk generalmente lleva delta.role: "assistant" pero content está vacío.
  • Los chunks intermedios llevan cada uno delta.content, que se pueden concatenar directamente.
  • El último chunk tiene delta vacío, finish_reason es stop / length / content_filter.

Cancelación a mitad de camino

La cancelación anticipada ya ha facturado los tokens: los tokens generados antes del momento de cancelación aún se cobrarán según el consumo real.

Tres, tiempo de espera y reintentos

Los tres SDK comparten la misma estrategia de reintentos: Para deshabilitar los reintentos: pasar max_retries=0 / maxRetries: 0 / WithMaxRetries(0) al construir el cliente. La consulta de tareas asíncronas (TaskHandle) no se ve afectada por max_retries: su bucle es a nivel de negocio y no a nivel de HTTP, controlado por max_wait para la duración total.

Cuatro, trampas comunes

  1. No pasar wait a proveedores síncronos: NanoBanana / Flux / Seedream son generados de forma síncrona, forzar wait=True hará que el SDK consulte una interfaz tasks que no se actualizará.
  2. Diferencias en unidades de TaskHandle: Python es en segundos, TS es en milisegundos, asegúrate de convertir al trasladar entre lenguajes.
  3. wait=True aún puede causar TimeoutError: La respuesta debe cumplir status in ('succeeded','failed') para salir del bucle; si el proveedor usa otros nombres de campo, el código de negocio debe manejar handle.get() para analizar.
  4. Cancelación de flujo: Los tokens generados antes de la cancelación ya han sido facturados.
  5. Reutilizar el cliente dentro del mismo proceso: El SDK incluye un grupo de conexiones, crear frecuentemente new AceDataCloud() / AceDataCloud() puede hacer que el apretón de manos TLS se convierta en un cuello de botella.

Para saber más