Geração de imagens de IA numa aplicação de produtividade
Permitir que os usuários gerem imagens para suas tarefas, diretamente do aplicativo, por voz. "Crie uma imagem para minha tarefa" e pronto, uma ilustração relevante aparece. Por trás dessa simplicidade, esconde-se um pipeline técnico com dois provedores de imagens de IA, um sistema de engenharia de prompt automatizado, quatro estilos visuais, um fallback automático e gerenciamento de custos por plano de assinatura.
A geração de imagens de IA em um aplicativo de produtividade não é um truque. É uma resposta a uma observação: tarefas com um visual são mais memoráveis, mais envolventes e mais fáceis de encontrar em um feed. E se o usuário puder obter esse visual em uma frase, sem sair do seu fluxo de trabalho vocal, a adoção é natural.
Pontos chave
- Dois provedores de imagens de IA integrados: Gemini 2.5 Flash Image para qualidade e Runware HiDream-I1-Fast para economia (~0,003 euros/imagem).
- O LLM conversacional gera automaticamente um prompt otimizado analisando o título, a descrição e as tags da tarefa.
- Quatro estilos predefinidos (flat, minimalista, realista, aquarela) modificam o prompt enviado ao modelo.
- Fallback automático Gemini para Runware com retry e backoff exponencial, controlado pelo administrador a partir do dashboard.
Por que integrar dois provedores de imagens de IA?
Um único provedor é um ponto único de falha. Se a API cair, se as cotas forem excedidas, se a qualidade se degradar: o usuário não terá mais imagens. Dois provedores significam resiliência e flexibilidade.
Gemini 2.5 Flash Image (via OpenRouter) é o provedor padrão. A qualidade é excelente, a velocidade é boa (2-4 segundos por imagem). É a melhor relação qualidade/velocidade que testei. O modelo entende bem prompts complexos com vários assuntos, estilos artísticos específicos e composições detalhadas.
Runware HiDream-I1-Fast é a alternativa econômica. A cerca de 0,003 euros por imagem, é 5 a 10 vezes mais barato que o Gemini, dependendo do prompt. A qualidade é ligeiramente inferior em prompts complexos, mas perfeitamente suficiente para ilustrações de tarefas. E a velocidade é comparável.
O administrador alterna entre os dois a partir do dashboard de administração. É um toggle na tabela app_config do Supabase. Por que um toggle de administrador e não uma escolha do usuário? Porque o custo é suportado pelo serviço, não pelo usuário. Cabe a mim decidir qual provedor otimiza a relação qualidade/custo com base no volume de uso.
Como o LLM gera o prompt perfeito?
Pedir a um usuário para escrever um bom prompt de imagem é irrealista. Os modelos de geração de imagem são sensíveis à formulação. "Um gato" dá um resultado genérico. "Um gato doméstico de pelo curto sentado em um parapeito de janela, luz do sol da hora dourada, profundidade de campo rasa, fotorrealista, tons quentes" dá uma imagem profissional.
A diferença entre os dois? Engenharia de prompt. E é exatamente o trabalho do LLM conversacional do TAMSIV.
Quando o usuário solicita uma imagem, o LLM analisa três fontes de contexto:
- O título da tarefa: "Preparar a apresentação do cliente Q2" → o LLM entende que é necessário um visual profissional.
- A descrição: "Incluir os números de vendas e o gráfico de crescimento" → o LLM adiciona elementos de visualização de dados ao prompt.
- As tags/pasta: se a tarefa estiver na pasta "Marketing", o LLM orienta o estilo para branding.
O prompt é sempre gerado em inglês, mesmo que o usuário fale em português. Por quê? Porque os modelos de imagem são treinados principalmente em dados em inglês. Um prompt em inglês sempre produz melhores resultados. É a mesma observação que fiz para o sistema i18n em 6 idiomas: o idioma de trabalho interno não é necessariamente o idioma do usuário.
O LLM também adiciona modificadores técnicos automaticamente: resolução, iluminação, composição. Esses modificadores são calibrados para o provedor ativo. Gemini e Runware não interpretam os prompts da mesma forma, então o LLM adapta sua formulação. De acordo com as boas práticas da OpenAI sobre prompting de imagens, os modificadores de estilo e composição são os fatores que mais influenciam a qualidade do resultado.
Quais são os quatro estilos visuais disponíveis?
Cada estilo modifica o prompt enviado ao modelo adicionando sufixos e modificadores específicos:
Estilo Flat (ilustrações vetoriais)
Adiciona: "ilustração vetorial plana, linhas limpas, cores sólidas, sombreamento mínimo, estilo de design gráfico moderno". Ideal para tarefas profissionais e apresentações. O resultado é limpo e imprimível.
Estilo Minimalista
Adiciona: "minimalista, composição simples, muito espaço em branco, um único ponto focal, estética limpa". Perfeito para tarefas pessoais. O resultado é puro e relaxante.
Estilo Realista
Adiciona: "fotorrealista, alto detalhe, iluminação natural, profundidade de campo rasa, qualidade 4K". O resultado mais próximo de uma foto. Ideal quando tu queres um visual concreto do que imaginas.
Estilo Aquarela
Adiciona: "pintura em aquarela, bordas suaves, cores fluidas, artístico, aparência pintada à mão". O resultado mais criativo. Ideal para projetos artísticos ou tarefas criativas.
A escolha do estilo é opcional. Se o usuário não especificar, o LLM escolhe o estilo mais adequado ao contexto da tarefa. Uma tarefa "Preparar as compras" será em estilo minimalista. Uma tarefa "Desenhar o logotipo do novo produto" será em estilo flat. É uma decisão contextual, não aleatória. A mesma filosofia que para a personalização vocal: a IA se adapta sem que seja solicitada.
Como funciona o pipeline técnico de ponta a ponta?
O pipeline completo, da solicitação do usuário à exibição da imagem, encadeia 6 etapas com potenciais pontos de falha em cada transição:
- Solicitação do usuário → transcrição STT → texto enviado ao backend via WebSocket.
- Análise LLM → o LLM conversacional detecta a intenção de gerar uma imagem e chama a ferramenta de função
create_taskcom um flaggenerate_image: true. - Engenharia de prompt → o backend passa o contexto da tarefa para o LLM que gera um prompt otimizado.
- Chamada do provedor → o backend envia o prompt para o provedor configurado (Gemini ou Runware).
- Upload de armazenamento → a imagem recebida (base64 ou URL) é carregada para o Supabase Storage no bucket dedicado. Um registro é criado em
privat.task_attachmentscomtype: 'ai_generated',storage_pathe metadados. - Exibição → o frontend recebe a confirmação via WebSocket, gera uma URL assinada e exibe a imagem no cartão da tarefa.
Cada etapa pode falhar. O STT pode transcrever mal. O LLM pode não detectar a intenção. O provedor pode expirar. O upload pode falhar. A estratégia: tentar novamente com backoff exponencial em cada etapa e fallback automático entre provedores se o provedor principal falhar 3 vezes consecutivas.
O fallback Gemini para Runware (ou vice-versa) é automático e transparente para o usuário. Ele não vê que o provedor mudou. Ele apenas vê sua imagem aparecer, talvez com 2 segundos a mais. É a mesma filosofia de resiliência que no sistema STT nativo vs Deepgram: sempre ter um plano B.
Como os custos são controlados por plano de assinatura?
A geração de imagens de IA tem um custo direto por imagem. Mesmo a 0,003 euros por imagem com Runware, se 10.000 usuários gerarem 3 imagens por dia, isso dá 900 euros por mês. São necessárias salvaguardas.
O sistema de limites por plano usa RevenueCat e os planos de assinatura:
- Plano Free: sem acesso à geração de imagens. É um recurso premium que justifica o upgrade.
- Plano Pro: cota diária de N imagens por dia (configurável no lado do administrador).
- Plano Team: cota diária mais alta, compartilhada entre os membros do grupo.
O contador é gerenciado no backend, não no frontend (para evitar fraudes). Cada geração incrementa um contador no DB com um reset diário via cron job. Se a cota for atingida, o backend retorna um erro explícito e o frontend exibe uma mensagem clara: "Cota de imagens atingida para hoje. Tente novamente amanhã ou faça upgrade para o plano Team."
O dashboard de administração exibe as estatísticas de consumo em tempo real: número de imagens geradas por dia, custo médio por imagem, proporção Gemini/Runware, taxa de falha por provedor. Essas métricas são cruciais para ajustar as cotas e escolher o provedor ideal. Eu já havia implementado esse tipo de monitoramento no dashboard de administração de análises.
Por que os usuários adoram este recurso?
O feedback mais frequente dos testadores: "Não sinto que estou usando IA, é simplesmente natural." Este é o melhor elogio possível. A IA é invisível. O usuário diz "crie uma tarefa para o churrasco de sábado com uma imagem" e ele obtém uma tarefa com uma ilustração de churrasco. Sem seleção de modelo. Sem ajuste de parâmetros. Sem prompt para escrever.
Uma tarefa com uma imagem é imediatamente mais envolvente do que uma tarefa apenas com texto. No feed com gamificação, as tarefas ilustradas chamam a atenção. É um princípio de design bem documentado: conteúdos com imagens geram, de acordo com Social Media Examiner, 2 a 3 vezes mais engajamento do que conteúdos apenas com texto.
E é também um fator de diferenciação. Nenhum aplicativo de gerenciamento de tarefas oferece geração de imagens de IA integrada no fluxo de voz. É uma vantagem competitiva concreta em relação a alternativas como Todoist ou TickTick, que eu havia comparado no artigo comparativo.
Qual é o futuro da geração de imagens no TAMSIV?
O sistema atual é uma base sólida. Mas várias evoluções estão planejadas. A extensão para memorandos, primeiro: a tabela privat.memo_attachments já existe com a mesma estrutura que privat.task_attachments, como detalhado no artigo sobre anexos.
A edição de imagens em seguida: poder dizer "mudar o fundo para azul" ou "adicionar texto" em uma imagem existente. As APIs de Gemini e Runware já suportam imagem para imagem. E a geração colaborativa: em um grupo, um membro gera uma imagem e os outros a veem em tempo real através do canal Realtime.
O objetivo permanece o mesmo: tornar a IA invisível. Quanto mais poderosa a tecnologia, mais simples ela deve ser de usar.
Perguntas frequentes
Quais formatos de imagem são gerados?
As imagens são geradas em JPEG com qualidade de 95%. A resolução padrão é de 1024x1024 pixels. As imagens são otimizadas para exibição móvel, mas mantêm qualidade suficiente para uso em desktop via dashboard web.
É possível regenerar uma imagem se o resultado não for satisfatório?
Sim. O usuário pode solicitar uma nova geração a qualquer momento. A imagem antiga é mantida no armazenamento e a nova a substitui na exibição. A cota diária é decrementada a cada geração.
A imagem gerada é armazenada permanentemente?
Sim. A imagem é carregada para o Supabase Storage e vinculada à tarefa via privat.task_attachments. Ela permanece disponível enquanto a tarefa existir. A exclusão da tarefa resulta na exclusão em cascata da imagem.
O prompt gerado pelo LLM é visível para o usuário?
Não, por padrão. O prompt é técnico e em inglês, o que não seria útil para a maioria dos usuários. No entanto, o prompt é registrado no backend para depuração e melhoria contínua do sistema.
A geração de imagens funciona offline?
Não. A geração requer uma chamada de API para o provedor de imagens (Gemini ou Runware) e um upload para o Supabase Storage. Uma conexão com a internet é essencial. O aplicativo exibe uma mensagem de erro clara se a conexão estiver ausente.