Pitch: O que dá quando mistura AGRO e TECH ?
Como construímos o portal Farmify: dados reais do agronegócio + time de redação com agentes IA
O Portal Farmify é um portal de notícias e dados do agronegócio brasileiro. Nasceu da necessidade de um lugar que juntasse cotações em tempo real, dados climáticos, safra, exportações e análise editorial — num produto que produtores rurais, traders e agrônomos realmente usam.
Este artigo descreve o que construímos: stack, APIs integradas e a parte que mais me orgulho — um time editorial de agentes IA que reescreve e publica conteúdo automaticamente.
Stack
Frontend
- React 19 + Vite + TypeScript
- Tailwind CSS v4 (via
@tailwindcss/vite, design system 100% CSS com@theme) - Leaflet para mapas interativos do Brasil
- Fontes: Barlow Condensed (títulos), Plus Jakarta Sans (corpo), Fraunces (serif editorial)
Backend
- Node.js + Express + TypeScript
- Deploy no Render
- Supabase (PostgreSQL gerenciado + realtime)
- Upstash Redis (cache L2 distribuído + locks distribuídos)
- Cloudflare R2 (sitemap + assets estáticos)
APIs reais integradas
O painel de dados do Farmify consome de verdade:
| Fonte | O que puxa |
|---|---|
| CEPEA/ESALQ | Cotações de commodities (soja, milho, boi gordo, café, algodão...) |
| CONAB | Progresso de safra por cultura e estado |
| ComexStat (MDIC) | Exportações brasileiras (volume, valor, destinos) |
| B3 | Contratos futuros (SFI, CCM, BGI, ICF, WDO) |
| BCB Focus | Expectativas de mercado: IPCA, PIB, Selic, câmbio |
| USDA WASDE | Relatório mensal de oferta e demanda global |
| USDA NASS | Dados de produção agropecuária dos EUA |
| FRED (St. Louis Fed) | Macros americanas |
| INPE | Focos de queimadas em tempo real |
| Open-Meteo | Clima ao vivo para capitais + mapa climático nacional |
| INMET | Dados meteorológicos nacionais |
| IBGE SIDRA | Dados estruturais do agronegócio brasileiro |
| FAO FAOSTAT | Dados globais de produção e comércio alimentar |
| CFTC | Posições de não-comerciais (especuladores) nos futuros agro EUA |
Tudo isso alimenta widgets no painel: radar macro, progresso de safra, exportações em ticker, mapa de queimadas, clima das capitais e tabela de cotações regionais.
O desafio de infra no Render 512MB
O backend roda num plano starter do Render com memória bastante limitada. Isso forçou algumas decisões:
- Boot assíncrono em cascata: crons não disparam todos de uma vez.
CRON_START_DELAY_MS=30000+ gap de 8s entre cada um evita pico de memória na inicialização. - Lock distribuído via Redis:
extractionLockeopenMeteoSyncLockusam Upstash para garantir que crons simultâneos (em caso de restart) não corram em paralelo. - Cache em dois níveis: cache em memória com TTL (ttlCache.ts) + Redis como L2. Dados de APIs externas ficam cachados; só chama a API quando o cache expira.
O time editorial de agentes IA
Essa é a parte mais interessante do projeto.
Quando nossos scrapers capturam uma notícia de fontes como Globo Rural, Notícias Agrícolas etc., ela entra num pipeline editorial automatizado onde agentes IA reescrevem e publicam o conteúdo com a voz do Farmify.
Pipeline de 6 papéis
Notícia bruta → [Repórter] → [Editor-Chefe] → [Especialista Técnico]
→ [Especialista SEO] → [Revisor] → [Publicador] → Artigo publicado
Cada agente tem um papel fixo com tarefa específica:
| Agente | Tarefa |
|---|---|
| Repórter | Extrai fatos principais e reescreve com voz Farmify |
| Editor-Chefe | Melhora narrativa, fluidez, estrutura, título e subtítulo |
| Especialista Técnico | Valida termos agrícolas, enriquece com contexto útil ao produtor |
| Especialista SEO | Otimiza headings, keywords, Google Discover, gera FAQ |
| Revisor | Corrige português, concordância, repetições |
| Publicador | Gera slug, meta title, meta description, tags e categoria sugerida |
Personas com identidade própria
Cada passo do pipeline pode ter uma persona associada — um agente com nome, cargo, especialidade, DNA editorial, goals e regras próprias. A persona é configurável pelo admin: você pode ter "Ana Lima, repórter especialista em soja" rodando num modelo, e "Carlos Mendes, editor-chefe sênior" rodando em outro.
Isso significa que o time editorial é configurável via painel admin — sem mexer em código.
Multi-provider
O campo provider na persona aceita: openai, anthropic, gemini, deepseek, mistral, grok, local. Cada agente pode rodar num modelo diferente. Hoje usamos GPT-4o-mini por custo, mas podemos mudar por persona ou por categoria de conteúdo.
Saída estruturada
Cada agente retorna JSON estrito (sem markdown, nunca texto livre). Exemplo do Publicador:
{
"title": "string",
"subtitle": "string",
"summary": "string",
"content": "string (HTML final)",
"slug": "string",
"seoTitle": "string (até 60 chars)",
"seoDescription": "string (até 160 chars)",
"seoKeyword": "string",
"tags": ["string"],
"suggestedCategoryName": "string"
}
A regra mais importante no prompt de todos os agentes: nunca invente fatos, números, citações ou nomes que não estejam no material original. O enriquecimento técnico só vai para o texto se baseado no conteúdo extraído ou marcado explicitamente como "análise".
Teams configuráveis
O pipeline é definido por um editorial team — uma lista ordenada de steps com role + personaId. O admin pode criar múltiplos times (ex: "time express" só com Repórter + Publicador para breaking news, "time completo" com os 6 agentes para reportagens longas) e definir qual é o padrão.
Geração de artes para Instagram
Além do pipeline editorial, existe um módulo de social generator que usa Puppeteer para renderizar artes HTML/CSS, capturar screenshot e publicar automaticamente via Instagram Graph API.
O processo: o agente gera a legenda com GPT → Puppeteer renderiza o template visual → upload para Meta → publicação agendada. O Upstash Redis serve como lock para evitar colisões de publicação (Meta limita requests e cobra por slot de tempo).
Sitemap automatizado
O sitemap é gerado em chunks, salvo no Cloudflare R2 e servido via CDN (cdn.farmify.com.br). Após cada atualização, o sistema faz ping automático para os motores de busca. Cron a cada 6 horas, com debounce de 30s para mudanças em rajada.
O que aprendemos
APIs de dados agro são inconsistentes. CEPEA usa scraping de tabelas HTML. CONAB muda o formato do CSV sem aviso. ComexStat tem rate limit agressivo. USDA WASDE é um PDF que você precisa parsear. Cada integração é um projeto por si só.
Pipeline de agentes exige prompt engineering disciplinado. A tentação de deixar o LLM "ser criativo" é grande — mas num portal de agronegócio onde você está falando de preço de soja por saca, a alucinação é um problema real. Output JSON estruturado + regra de não inventar fatos resolveu a maior parte dos problemas.
Configurabilidade via banco de dados tem custo. Deixar personas e times configuráveis pelo admin é poderoso, mas significa que bugs de configuração aparecem em runtime, não em compile time. Valeu a pena, mas exigiu boa validação no agentRegistry.
Próximos passos
- Suporte a categorias por persona (repórter especialista em café cobre só categoria Café)
- Painel de métricas do pipeline: tokens consumidos, custo por artigo, tempo por step
- Teste A/B de personas: comparar output de dois agentes no mesmo papel
Se você está construindo algo similar — portal de nicho com dados de APIs externas + pipeline editorial IA — fico feliz em trocar ideia nos comentários.
O Portal Farmify está disponível em [https://portal.farmify.com.br]