- 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.
En este capítulo conectas el backend con Novita para dos flujos:
txt2imgcuando no hay foto base.img2imgcuando sí hay foto base.
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: Contrato de servicio
INovitaService expone:
StartGenerationAsync(...)GetTaskAsync(taskId)GeneratePromptAsync(imageUrl)AdaptPromptAsync(prompt)
Paso 2: Endpoint correcto según input
Lógica aplicada:
- Si
photoUrlexiste:POST /v3/async/img2img - Si no existe
photoUrl:POST /v3/async/txt2img
Paso 3: Payload asíncrono
La request usa estructura:
extra:response_image_typewebhook.urlwebhook.events = ["ASYNC_TASK_RESULT"]
request:model_namepromptwidth,heightnegative_promptloras(opcional)
Paso 4: Respuesta y task_id
El backend no espera imagen final en el create; devuelve el task_id y guarda estado inicial en cola (TASK_STATUS_QUEUED).
Paso 5: Verificación local
cd codigo/backend
rg -n "txt2img|img2img|task_id|webhook" InvitaIA.Api/Services/NovitaService.cs -S
Comando de prueba (ejemplo)
curl -X POST http://localhost:56449/api/invitations/create \
-H "Authorization: Bearer <firebase_id_token>" \
-H "Content-Type: application/json" \
-d '{
"style": "superhero",
"format": "image",
"orientation": "1:1",
"modelBaseId": "<model-id>",
"prompt": "niño con traje espacial, fondo galáctico"
}'
Troubleshooting
- Error 400 de Novita: revisa
model_namey estructurarequest. task_idvacío: la respuesta de Novita no trae formato esperado.- Timeout HTTP: usa endpoint async y procesa por webhook.
FAQ corta
¿Dónde se decide txt2img vs img2img?
En NovitaService.StartGenerationAsync según exista photoUrl.
¿Se puede usar LoRA?
Sí, enviando loras con model_name y strength.
¿Se guarda imagen final aquí?
No. Solo se crea la tarea; la finalización ocurre en webhook/worker.
Fuente verificada
- Código del curso:
codigo/backend/InvitaIA.Api/Services/NovitaService.cscodigo/backend/InvitaIA.Api/Services/InvitationService.cs
- Documentación oficial Novita:
Share this content: