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 enTaskHandle, 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 inmediatamenteTaskHandle, el código de negocio decide cuándo sondear.wait=True: El SDK llama internamente ahandle.wait(), la función devuelve la respuesta una vez completada. Usar solo si estás seguro de que la API objetivo devolverá el campostatus: succeeded— algunos proveedores no cumplen con esta convención, lo que hará quewaitsiga hasta quemax_waitlanceTimeoutError.
Diferencias de Unidades (⚠️ Debe Leer)
La unidad depoll_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 comopoll_interval=3000, hará que el SDK espere 50 minutos antes de sondear por segunda vez.
Ejemplo: Sondeo Explícito en Python para Midjourney
images.generate(..., wait=False)envía elprompta la API de Midjourney, obteniendo inmediatamente elhandle, sin bloquear.handle.wait(poll_interval=3.0, max_wait=180.0)envía un POST a/midjourney/taskscada 3 segundos internamente, hasta questatuscambie asucceededofailed, o el tiempo total exceda 180 segundos y lanceTimeoutError.- 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 paseswait:
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 aTaskHandle.get() es:
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
Python
Go
Estructura del chunk de flujo
Cada chunk es unchat.completion.chunk compatible con OpenAI:
- El primer chunk generalmente lleva
delta.role: "assistant"perocontentestá vacío. - Los chunks intermedios llevan cada uno
delta.content, que se pueden concatenar directamente. - El último chunk tiene
deltavacío,finish_reasonesstop/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
- No pasar
waita proveedores síncronos: NanoBanana / Flux / Seedream son generados de forma síncrona, forzarwait=Truehará que el SDK consulte una interfaztasksque no se actualizará. - Diferencias en unidades de TaskHandle: Python es en segundos, TS es en milisegundos, asegúrate de convertir al trasladar entre lenguajes.
wait=Trueaún puede causarTimeoutError: La respuesta debe cumplirstatus in ('succeeded','failed')para salir del bucle; si el proveedor usa otros nombres de campo, el código de negocio debe manejarhandle.get()para analizar.- Cancelación de flujo: Los tokens generados antes de la cancelación ya han sido facturados.
- 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.

