- 0. Curso Flutter + .NET 8 + Novita AI: índice completo
- 1. Arquitectura Flutter + backend .NET 8 con Novita AI
- 2. Configurar entorno .NET 8 + Flutter + Firebase + Novita AI
- 3. Backend .NET 8: Auth Firebase y esqueleto API
- 4. Integrar Novita AI: text-to-image e image-to-image en .NET 8
- 5. Webhook Novita y procesamiento asíncrono
- 6. Firestore, modelos y endpoints de dominio
- 7. Flutter: login Google y configuración API
- 8. Flutter: subida de imagen y creación de invitaciones
- 9. Listado, estado y detalle de invitaciones
- 10. ControlNet completo en backend y Flutter
- 11. LLM con Novita: img2prompt y adaptación de prompts
- 12. Despliegue, checklist final y publicación WordPress
- Bonus 01: vídeo con FFmpeg y flujo opcional
- Bonus 02: importador de modelos Novita a Firestore
- Bonus 03: Prompt Generator y administración básica
Actualizado: 20 de febrero de 2026.
Este capítulo resuelve el punto crítico de producción: cómo cerrar tareas asíncronas y persistir el resultado final.
Prerrequisitos
- Tener clonado o disponible
codigo/de esta serie. - Contar con Firebase y Novita configurados para pruebas.
- Haber completado el capítulo anterior del curso.
Paso 1: Endpoint webhook
Archivo clave:
codigo/backend/InvitaIA.Api/Controllers/NovitaWebhookController.cs
Responsabilidades:
- Aceptar payload de Novita.
- Soportar forma
payloadodata. - Ignorar eventos que no sean
ASYNC_TASK_RESULT. - Extraer
task_id,statusy URLs.
Paso 2: Worker de aplicación
Archivo clave:
codigo/backend/InvitaIA.Api/Workers/NovitaTaskWorker.cs
Responsabilidades:
- Buscar invitación por
taskId. - Descargar imagen/video de Novita.
- Subir archivo a Firebase Storage.
- Guardar
previewUrl,finalUrl,statusen Firestore.
Paso 3: Flujo completo
sequenceDiagram
participant API as .NET API
participant NOV as Novita AI
participant WH as /api/webhooks/novita
participant WRK as NovitaTaskWorker
participant FS as Firestore/Storage
API->>NOV: Start async generation
NOV-->>API: task_id
NOV->>WH: ASYNC_TASK_RESULT
WH->>WRK: HandleWebhookAsync(taskId, status, urls)
WRK->>FS: upload + save status/finalUrl
Paso 4: Polling de respaldo
Además del webhook, existe PendingInvitationWorker como red de seguridad para tareas en QUEUED o PROCESSING.
Paso 5: Comprobación manual
cd codigo/backend
rg -n "api/webhooks/novita|HandleWebhookAsync|task-result" InvitaIA.Api -S
Troubleshooting
- No llega webhook: backend no accesible públicamente.
- Webhook llega pero no actualiza invitación:
taskIdno coincide. - Status se queda en processing: valida parseo de
statusen webhook yGetTaskAsync.
FAQ corta
¿Webhook y polling son redundantes?
No. Polling actúa como fallback en fallos de red o retries perdidos.
¿Dónde se sube el archivo final?
En Firebase Storage vía IFirebaseService.UploadFileAsync.
¿Qué estado marca éxito?
TASK_STATUS_SUCCEED y equivalentes normalizados.
Fuente verificada
- Código del curso:
codigo/backend/InvitaIA.Api/Controllers/NovitaWebhookController.cscodigo/backend/InvitaIA.Api/Workers/NovitaTaskWorker.cscodigo/backend/InvitaIA.Api/Workers/PendingInvitationWorker.cs
- Documentación oficial Novita:
Share this content: