Generación de imágenes de IA en una aplicación de productividad
Permitir a los usuarios generar imágenes para sus tareas, directamente desde la aplicación, mediante la voz. "Crea una imagen para mi tarea" y listo, aparece una ilustración relevante. Detrás de esta simplicidad se esconde un pipeline técnico con dos proveedores de imágenes de IA, un sistema de ingeniería de prompts automatizado, cuatro estilos visuales, un fallback automático y una gestión de costes por plan de suscripción.
La generación de imágenes de IA en una aplicación de productividad no es un truco. Es una respuesta a una observación: las tareas con un visual son más memorables, más atractivas y más fáciles de encontrar en un feed. Y si el usuario puede obtener este visual con una frase, sin salir de su flujo de trabajo vocal, la adopción es natural.
Puntos clave
- Dos proveedores de imágenes de IA integrados: Gemini 2.5 Flash Image para la calidad y Runware HiDream-I1-Fast para la economía (~0,003 euros/imagen).
- El LLM conversacional genera automáticamente un prompt optimizado analizando el título, la descripción y las etiquetas de la tarea.
- Cuatro estilos predefinidos (plano, minimalista, realista, acuarela) modifican el prompt enviado al modelo.
- Fallback automático de Gemini a Runware con reintentos y retroceso exponencial, controlado por el administrador desde el dashboard.
¿Por qué integrar dos proveedores de imágenes de IA?
Un solo proveedor es un punto único de fallo. Si la API se cae, si se superan las cuotas, si la calidad se degrada: el usuario ya no tiene imágenes. Dos proveedores significan resiliencia y flexibilidad.
Gemini 2.5 Flash Image (a través de OpenRouter) es el proveedor predeterminado. La calidad es excelente, la velocidad correcta (2-4 segundos por imagen). Es la mejor relación calidad/velocidad que he probado. El modelo comprende bien los prompts complejos con múltiples sujetos, estilos artísticos específicos y composiciones detalladas.
Runware HiDream-I1-Fast es la alternativa económica. A aproximadamente 0,003 euros por imagen, es de 5 a 10 veces más barato que Gemini, dependiendo del prompt. La calidad es ligeramente inferior en prompts complejos, pero perfectamente suficiente para ilustraciones de tareas. Y la velocidad es comparable.
El administrador alterna entre los dos desde el panel de administración. Es un interruptor en la tabla app_config de Supabase. ¿Por qué un interruptor de administrador y no una elección del usuario? Porque el coste lo asume el servicio, no el usuario. Soy yo quien decide qué proveedor optimiza la relación calidad/coste en función del volumen de uso.
¿Cómo genera el LLM el prompt perfecto?
Pedir a un usuario que escriba un buen prompt de imagen es irreal. Los modelos de generación de imágenes son sensibles a la formulación. "Un gato" da un resultado genérico. "Un gato doméstico de pelo corto sentado en el alféizar de una ventana, luz dorada del atardecer, poca profundidad de campo, fotorrealista, tonos cálidos" da una imagen profesional.
¿La diferencia entre los dos? Ingeniería de prompts. Y ese es exactamente el trabajo del LLM conversacional de TAMSIV.
Cuando el usuario solicita una imagen, el LLM analiza tres fuentes de contexto:
- El título de la tarea: "Preparar la presentación del cliente del segundo trimestre" → el LLM entiende que se necesita un visual profesional.
- La descripción: "Incluir las cifras de ventas y el gráfico de crecimiento" → el LLM añade elementos de visualización de datos al prompt.
- Las etiquetas/carpeta: si la tarea está en la carpeta "Marketing", el LLM orienta el estilo hacia el branding.
El prompt siempre se genera en inglés, incluso si el usuario habla en francés. ¿Por qué? Porque los modelos de imágenes se entrenan mayoritariamente con datos en inglés. Un prompt en inglés da sistemáticamente mejores resultados. Es la misma observación que hice para el sistema i18n en 6 idiomas: el idioma de trabajo interno no es necesariamente el idioma del usuario.
El LLM también añade modificadores técnicos automáticamente: resolución, iluminación, composición. Estos modificadores están calibrados para el proveedor activo. Gemini y Runware no interpretan los prompts de la misma manera, por lo que el LLM adapta su formulación. Según las buenas prácticas de OpenAI sobre el prompting de imágenes, los modificadores de estilo y composición son los factores que más influyen en la calidad del resultado.
¿Cuáles son los cuatro estilos visuales disponibles?
Cada estilo modifica el prompt enviado al modelo añadiendo sufijos y modificadores específicos:
Estilo Plano (ilustraciones vectoriales)
Añade: "ilustración vectorial plana, líneas limpias, colores sólidos, sombreado mínimo, estilo de diseño gráfico moderno". Ideal para tareas profesionales y presentaciones. El resultado es limpio e imprimible.
Estilo Minimalista
Añade: "minimalista, composición simple, mucho espacio en blanco, un solo punto focal, estética limpia". Perfecto para tareas personales. El resultado es depurado y relajante.
Estilo Realista
Añade: "fotorrealista, alto detalle, iluminación natural, poca profundidad de campo, calidad 4K". El resultado más parecido a una foto. Ideal cuando quieres un visual concreto de lo que imaginas.
Estilo Acuarela
Añade: "pintura de acuarela, bordes suaves, colores fluidos, artístico, aspecto pintado a mano". El resultado más creativo. Ideal para proyectos artísticos o tareas creativas.
La elección del estilo es opcional. Si el usuario no especifica, el LLM elige el estilo más adecuado al contexto de la tarea. Una tarea "Preparar la compra" tendrá un estilo minimalista. Una tarea "Diseñar el logo del nuevo producto" tendrá un estilo plano. Es una decisión contextual, no aleatoria. La misma filosofía que para la personalización vocal: la IA se adapta sin que se le pida.
¿Cómo funciona el pipeline técnico de principio a fin?
El pipeline completo, desde la solicitud del usuario hasta la visualización de la imagen, encadena 6 etapas con posibles puntos de fallo en cada transición:
- Solicitud del usuario → transcripción STT → texto enviado al backend a través de WebSocket.
- Análisis LLM → el LLM conversacional detecta la intención de generar una imagen y llama a la herramienta de función
create_taskcon un flaggenerate_image: true. - Ingeniería de prompts → el backend pasa el contexto de la tarea al LLM que genera un prompt optimizado.
- Llamada al proveedor → el backend envía el prompt al proveedor configurado (Gemini o Runware).
- Carga de almacenamiento → la imagen recibida (base64 o URL) se carga en Supabase Storage en el bucket dedicado. Se crea un registro en
privat.task_attachmentscontype: 'ai_generated',storage_pathy los metadatos. - Visualización → el frontend recibe la confirmación a través de WebSocket, genera una URL firmada y muestra la imagen en la tarjeta de tarea.
Cada paso puede fallar. El STT puede transcribir mal. El LLM puede no detectar la intención. El proveedor puede agotar el tiempo de espera. La carga puede fallar. La estrategia: reintentar con retroceso exponencial en cada paso, y fallback automático entre proveedores si el proveedor principal falla 3 veces consecutivas.
El fallback de Gemini a Runware (o viceversa) es automático y transparente para el usuario. No ve que el proveedor ha cambiado. Simplemente ve su imagen aparecer, quizás con 2 segundos más. Es la misma filosofía de resiliencia que en el sistema STT nativo vs Deepgram: siempre tener un plan B.
¿Cómo se controlan los costes por plan de suscripción?
La generación de imágenes de IA tiene un coste directo por imagen. Incluso a 0,003 euros por imagen con Runware, si 10.000 usuarios generan 3 imágenes al día, eso suma 900 euros al mes. Se necesitan salvaguardias.
El sistema de límites por plan utiliza RevenueCat y los planes de suscripción:
- Plan Free: sin acceso a la generación de imágenes. Es una característica premium que justifica la actualización.
- Plan Pro: cuota diaria de N imágenes por día (configurable por el administrador).
- Plan Team: cuota diaria más alta, compartida entre los miembros del grupo.
El contador se gestiona en el backend, no en el frontend (para evitar trampas). Cada generación incrementa un contador en la base de datos con un reinicio diario a través de un trabajo cron. Si se alcanza la cuota, el backend devuelve un error explícito y el frontend muestra un mensaje claro: "Cuota de imágenes alcanzada para hoy. Inténtalo de nuevo mañana o actualiza al plan Team."
El panel de administración muestra las estadísticas de consumo en tiempo real: número de imágenes generadas por día, coste medio por imagen, relación Gemini/Runware, tasa de fallos por proveedor. Estas métricas son cruciales para ajustar las cuotas y elegir el proveedor óptimo. Ya había implementado este tipo de monitoreo en el panel de administración de análisis.
¿Por qué los usuarios adoran esta característica?
El comentario más frecuente de los probadores: "No siento que esté usando IA, simplemente es natural." Es el mejor cumplido posible. La IA es invisible. El usuario dice "crea una tarea para la barbacoa del sábado con una imagen" y obtiene una tarea con una ilustración de barbacoa. Sin selección de modelo. Sin ajuste de parámetros. Sin prompt que escribir.
Una tarea con una imagen es inmediatamente más atractiva que una tarea solo de texto. En el feed con gamificación, las tareas ilustradas atraen la mirada. Es un principio de diseño bien documentado: los contenidos con imágenes generan, según Social Media Examiner, de 2 a 3 veces más engagement que los contenidos solo de texto.
Y también es un factor de diferenciación. Ninguna aplicación de gestión de tareas ofrece generación de imágenes de IA integrada en el flujo vocal. Es una ventaja competitiva concreta frente a alternativas como Todoist o TickTick, que había comparado en el artículo comparativo.
¿Cuál es el futuro de la generación de imágenes en TAMSIV?
El sistema actual es una base sólida. Pero se prevén varias evoluciones. La extensión a los memos, en primer lugar: la tabla privat.memo_attachments ya existe con la misma estructura que privat.task_attachments, como se detalla en el artículo sobre los adjuntos.
La edición de imágenes después: poder decir "cambia el fondo a azul" o "añade texto" en una imagen existente. Las APIs de Gemini y Runware ya soportan la imagen a imagen. Y la generación colaborativa: en un grupo, un miembro genera una imagen y los demás la ven en tiempo real a través del canal Realtime.
El objetivo sigue siendo el mismo: hacer que la IA sea invisible. Cuanto más potente es la tecnología, más sencilla debe ser de usar.
Preguntas frecuentes
¿Qué formatos de imagen se generan?
Las imágenes se generan en JPEG con una calidad del 95%. La resolución estándar es de 1024x1024 píxeles. Las imágenes están optimizadas para la visualización móvil, pero tienen calidad suficiente para su uso en escritorio a través del dashboard web.
¿Se puede regenerar una imagen si el resultado no es satisfactorio?
Sí. El usuario puede solicitar una nueva generación en cualquier momento. La imagen antigua se conserva en el almacenamiento y la nueva la reemplaza en la visualización. La cuota diaria se decrementa con cada generación.
¿La imagen generada se almacena de forma permanente?
Sí. La imagen se carga en Supabase Storage y se vincula a la tarea a través de privat.task_attachments. Permanece disponible mientras la tarea exista. La eliminación de la tarea conlleva la eliminación en cascada de la imagen.
¿El prompt generado por el LLM es visible para el usuario?
No, por defecto. El prompt es técnico y en inglés, lo que no sería útil para la mayoría de los usuarios. Sin embargo, el prompt se registra en el backend para la depuración y la mejora continua del sistema.
¿La generación de imágenes funciona sin conexión?
No. La generación requiere una llamada a la API del proveedor de imágenes (Gemini o Runware) y una carga a Supabase Storage. Es indispensable una conexión a Internet. La aplicación muestra un mensaje de error claro si no hay conexión.