Frontend com IA: Colocando Codigo Gerado pelo Claude em Producao
Licoes praticas de usar a API do Claude como servico backend — engenharia de prompts, saida estruturada, tratamento de erros e o padrao Worker proxy.
Frontend com IA: Colocando Codigo Gerado pelo Claude em Producao
A maioria dos tutoriais ensina como construir um chatbot. Este post e sobre algo diferente: usar um LLM como servico backend estruturado que alimenta uma experiencia frontend em tempo real.
Claude como API JSON
Quando voce pensa em APIs de IA, provavelmente pensa em interfaces de chat. Mas o Claude e igualmente poderoso como gerador de dados estruturados. No Company Canvas, o Claude atua como um motor de analise de marca:
Entrada: "Spotify"
Saida:
{
"companyName": "Spotify",
"colors": {
"primary": "#1DB954",
"secondary": "#191414",
"accent": "#1ED760",
"background": "#0a0a0a"
},
"tagline": "Music for everyone",
"industry": "Music Streaming",
"animationStyle": "flowing",
"animationParams": { "speed": 1.2, "density": 0.7, "complexity": 0.6 }
}
Sem historico de conversa, sem streaming, sem follow-ups. Uma requisicao, uma resposta JSON. O LLM e uma funcao.
Engenharia de Prompts para Confiabilidade
O maior desafio nao e fazer o Claude gerar bons dados — e fazer com que ele gere dados consistentes. Eis o que funcionou:
1. Schema explicito no prompt
Nao descreva a saida informalmente. Cole o schema JSON exato com tipos e restricoes. O Claude segue exemplos concretos muito melhor do que descricoes abstratas.
2. Criterios de decisao, nao intuicao
Em vez de “escolha um estilo apropriado”, eu forneco uma tabela de mapeamento:
particles→ tech, SaaS, IAflowing→ saude, natureza, logisticageometric→ financas, enterprisetypographic→ midia, criativo
Isso elimina ambiguidade e torna os resultados previsiveis.
3. “Retorne APENAS JSON valido”
Essa unica instrucao elimina code fences em markdown, texto explicativo e desculpas. O Claude respeita isso quase perfeitamente.
4. Faixas numericas delimitadas
"speed": <number 0.5-2.0> e melhor que "speed": <number>. Sem limites, voce ocasionalmente recebe valores extremos que quebram animacoes.
O Padrao Worker Proxy
Nunca exponha chaves de API em codigo client-side. Isso deveria ser obvio, mas ja vi em producao. O padrao:
Browser → Cloudflare Worker → Claude API
(rate limit, validacao, proxy)
O Worker faz tres coisas:
- Rate limiting — 10 requisicoes por minuto por IP. Um simples mapa em memoria com arrays de timestamps.
- Validacao de entrada — O nome da empresa deve existir e ter menos de 100 caracteres.
- Proxy de API — Encaminha para o Claude, faz parse da resposta, retorna JSON limpo.
Cloudflare Workers rodam no edge, entao a latencia e baixa independente de onde seus usuarios estao. O plano gratuito lida com milhares de requisicoes diarias.
Lidando com a Imprevisibilidade da IA
LLMs sao probabilisticos. Mesmo com um prompt perfeito, coisas podem dar errado:
JSON malformado: Raramente, o Claude pode retornar JSON com uma virgula sobrando ou aspas faltando. Eu envolvo o JSON.parse em try/catch e retorno um 502 para o cliente, que mostra uma mensagem amigavel de “geracao falhou”.
Valores inesperados: E se o Claude retornar "animationStyle": "abstract" — um estilo que nao existe no meu registro? O factory pattern lida com isso usando um fallback: registry[style] ?? ParticlesAnimation. Estilos desconhecidos degradam graciosamente para particles.
Variacao de latencia: Respostas do Claude variam de 1 a 4 segundos. A UI mostra uma animacao de loading com uma barra de progresso que se move em ritmo fixo. Os usuarios nao veem a latencia real da API — veem feedback suave.
A Questao do Custo
Chamadas a API do Claude custam dinheiro. Para um projeto de portfolio, eu precisava que a economia funcionasse:
- Cada geracao usa ~400 tokens de entrada e ~300 tokens de saida
- No preco do Claude Sonnet, isso da aproximadamente $0,002 por geracao
- Uma taxa de download de $1 cobre ~500 geracoes
A matematica funciona. Mesmo com previews gratuitos generosos, os downloads pagos mais que cobrem os custos de API. A integracao com Stripe usa uma simples checkout session — sem assinaturas, sem cobranca recorrente. Um dolar, um download.
O que Eu Faria Diferente?
Adicionar cache. Agora, gerar “Spotify” duas vezes faz duas chamadas de API com resultados ligeiramente diferentes. Um simples cache KV indexado por nome da empresa economizaria dinheiro e daria resultados consistentes.
Fazer streaming da resposta. Tres segundos de loading e aceitavel, mas fazer streaming dos campos JSON conforme chegam poderia permitir que a animacao comece a ser construida antes da resposta estar completa. A UI poderia mostrar as cores aparecendo, depois o tagline, depois a animacao girando.
Usar tool_use. O recurso de tool calling do Claude me permitiria definir o schema de saida mais formalmente, com saida JSON garantida. Eu construi isso antes do tool_use estar maduro, mas e a escolha certa agora.
Construir com APIs de IA me ensinou que os problemas interessantes nao estao na IA — estao na engenharia ao redor dela. Rate limiting, tratamento de erros, gestao de custos e design de UX importam tanto quanto o prompt.
Posts Relacionados
Frontend com IA: Colocando Codigo Gerado pelo Claude em Producao
Licoes praticas de usar a API do Claude como servico backend — engenharia de prompts, saida estruturada, tratamento de erros e o padrao Worker proxy.
Escalando um Micro-Produto com Skills Estrategicas: O Toolkit do Company Canvas
Como construi 10 skills reutilizaveis assistidas por IA para iterar sistematicamente o Company Canvas de MVP a produto polido — cobrindo seguranca, testes, cache, analytics, pricing e mais.
Campos BLOB em Bancos de Dados: Quando Armazenar Dados Binários e Quando Não
De uma resposta de 2015 no Stack Overflow sobre tipos BLOB no MySQL e Firebird até a era do object storage em 2026 — por que a resposta para "como guardar arquivos no banco" agora é "não guarde."