O Despertar: "Cara, Preciso de IA de Verdade!"
setTimeout()
simulando processamento e resultados "mockados"? Pois é... chegou a hora de aposentar e colocar IA de verdade para trabalhar!
Mas rapidamente percebi que isso não seria só "trocar uma API fake por uma real". Precisava de:
- 🔧 Backend robusto para processar PDFs pesados
- 🧠 Integração com IA (OpenAI/LangChain)
- 💳 Sistema de créditos (afinal, IA custa dinheiro!)
- 🔐 Segurança em múltiplas camadas
- 📊 Banco de dados para histórico
A Arquitetura: De Extensão para Ecossistema Completo
🏗️ O Que Construí (Stack Full)
# Estrutura do backend que emergiu:
📁 startlar-api/
├── 🚀 main.py (servidor FastAPI)
├── 📊 routers/
│ ├── documents.py (upload/análise)
│ ├── credits.py (sistema de créditos)
│ └── auth.py (autenticação)
├── 🧠 services/
│ ├── ai_service.py (OpenAI + LangChain)
│ ├── pdf_service.py (processamento PDFs)
│ └── supabase_service.py (database)
└── 🔐 middleware/
└── auth_middleware.py (segurança JWT)
🔄 O Novo Fluxo (100% Real)
- Usuário clica → Validação de créditos
- Upload seguro do PDF → Backend FastAPI
- Extração de texto → PyPDF2/PDFplumber
- Processamento IA → OpenAI GPT-4
- Análise estruturada → Salva no Supabase
- Resultados reais → Exibe na extensão
A Implementação da IA: O Cérebro por Trás da Mágica
🧠 Prompt Engineering para Editais
# O prompt que faz a mágica acontecer:
SYSTEM_PROMPT = """
Você é um especialista em análise de editais de leilão da Caixa Econômica Federal.
Analise o documento e identifique:
1. RISCOS JURÍDICOS: Ações judiciais, penhoras, restrições
2. RISCOS FINANCEIROS: Débitos, impostos, condomínio em atraso
3. RISCOS FÍSICOS: Estado do imóvel, ocupação irregular
4. OPORTUNIDADES: Localização, potencial de valorização
5. ALERTAS CRÍTICOS: Informações que podem inviabilizar o negócio
Responda em JSON estruturado com score de 0-10 para cada categoria.
"""
# Exemplo de resposta estruturada que a IA retorna:
{
"score_geral": 7.5,
"riscos_juridicos": {
"score": 8,
"detalhes": ["Sem ações judiciais pendentes", "Matrícula limpa"]
},
"riscos_financicos": {
"score": 6,
"detalhes": ["IPTU em dia", "Condomínio com 3 meses de atraso"]
},
"oportunidades": {
"score": 9,
"detalhes": ["Localização valorizada", "Potencial para locação"]
}
}
⚡ Pipeline de Processamento Robusto
async def extract_pdf_text(pdf_file):
"""Pipeline robusto para PDFs malformados"""
text = None
# Método 1: PyPDF2 (mais rápido)
try:
text = extract_with_pypdf2(pdf_file)
if len(text) > 100: # Validação básica
return text
except Exception as e:
log_warning(f"PyPDF2 falhou: {e}")
# Método 2: PDFplumber (mais preciso)
try:
text = extract_with_pdfplumber(pdf_file)
if len(text) > 100:
return text
except Exception as e:
log_warning(f"PDFplumber falhou: {e}")
# Método 3: OCR (último recurso)
try:
text = extract_with_ocr(pdf_file)
return text
except Exception as e:
raise Exception("Falha em todos os métodos de extração")
Sistema de Créditos: O Modelo de Negócio Funcionando
💰 Por Que Créditos?
- 🆓 3 créditos gratuitos para testar
- 💰 1 crédito = 1 análise completa
- 🛡️ Falha = crédito não consumido (UX primeiro!)
🎯 Regras de Negócio Implementadas
async def process_analysis_with_credits(user_id: str, document_id: str):
"""Controle rigoroso de créditos"""
# 1. Validar créditos ANTES de processar
if not await user_has_credits(user_id):
raise HTTPException(status_code=402, detail="Créditos insuficientes")
# 2. Criar registro de análise
analysis_id = await create_analysis_record(user_id, document_id)
try:
# 3. Consumir crédito APENAS quando começar processamento
await consume_credit(user_id, analysis_id)
# 4. Processar com IA (aqui pode falhar)
results = await ai_service.analyze_document(document_id)
# 5. Salvar resultados
await save_analysis_results(analysis_id, results)
except Exception as e:
# 6. Se falhar, RESTITUIR o crédito!
await restore_credit(user_id, analysis_id)
raise
return results
Segurança: Múltiplas Camadas de Proteção
🔐 Princípio: Zero Trust
# Exemplo de endpoint 100% seguro:
@router.post("/upload", dependencies=[Depends(get_current_user)])
async def upload_document(
file: UploadFile,
current_user: dict = Depends(get_current_user)
):
# Validações de segurança
validate_file_type(file) # Apenas PDFs
validate_file_size(file) # Máximo 10MB
validate_user_credits(current_user['id']) # Tem créditos?
# Upload com propriedade controlada
document_id = await save_with_owner(file, current_user['id'])
# Processamento automático e seguro
await queue_analysis(document_id, current_user['id'])
return {"document_id": document_id, "status": "uploaded"}
🛡️ Validação de Propriedade Rigorosa
async def validate_document_ownership(document_id: str, user_id: str):
"""Garante isolamento total entre usuários"""
document = await supabase.table("documents")\
.select("user_id")\
.eq("id", document_id)\
.single()
if not document:
log_security_event("document_not_found", user_id, {"doc": document_id})
raise HTTPException(status_code=404, detail="Document not found")
if document['user_id'] != user_id:
log_security_event("unauthorized_access", user_id, {
"attempted_doc": document_id,
"real_owner": document['user_id']
})
raise HTTPException(status_code=403, detail="Access denied")
return document
Performance: Otimização para o Mundo Real
⚡ Métricas que Consegui
- Upload: ~2 segundos para PDFs até 5MB
- Extração de texto: 3-8 segundos (dependendo do PDF)
- Análise IA: 15-45 segundos (GPT-4 é preciso, mas não rápido)
- Storage: ~500KB por análise no Supabase
🚀 Polling Inteligente para UX
async function pollAnalysisStatus(analysisId) {
const maxAttempts = 60; // 5 minutos timeout
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
const status = await checkAnalysisStatus(analysisId);
// Análise concluída!
if (status.completed) {
return status.results;
}
// Feedback visual progressivo
const messages = [
"🔍 Extraindo texto do PDF...",
"🧠 Enviando para análise de IA...",
"⚡ Processando com GPT-4...",
"📊 Estruturando resultados...",
"✅ Finalizando análise..."
];
const message = messages[Math.floor(attempt / 12)] ||
`⏳ Analisando... (${attempt}/60)`;
updateProgressUI(message);
// Intervalo progressivo: 2s → 5s → 10s
const delay = Math.min(2000 + (attempt * 100), 10000);
await sleep(delay);
}
throw new Error("Timeout na análise");
}
Resultados Reais: IA em Ação! 🎯
📊 Exemplo de Análise Completa
- Data: 05/06/2025, 19:15:09
- Tipo: EDITAL
- Tempo de processamento: 46 segundos
- Perguntas respondidas: 5/6
- Confiança média: 80%
- Resultados de alta confiança: 5
- Resultados de baixa confiança: 1
"Com base no conteúdo do edital, as dívidas condominiais são de responsabilidade exclusiva do adquirente."💰 Responsabilidade por IPTU e Tributos (100% - Página 10)
"Com base no documento fornecido, a responsabilidade pelas dívidas de IPTU, tributos (como o ITR) é do arrematante..."⚡ Dívidas de Consumo - Água, Luz, Gás (80%)
"O edital não menciona explicitamente dívidas de consumo como água, energia elétrica ou gás. Não há indicação..."A IA consegue extrair informações críticas com referências exatas às páginas e níveis de confiança para cada resposta, permitindo que o investidor tome decisões baseadas em dados precisos e verificáveis.
🎨 Interface Evoluída
- 💳 Contador de créditos em tempo real
- 📊 Progress bar durante análise
- 🎯 Checklist visual com scores coloridos
- 📱 Design responsivo que se adapta ao widget
- ⚡ Estados visuais claros (loading, success, error)
Desafios Técnicos Interessantes
🔥 1. PDFs "Malformados" da Caixa
🔄 2. Sincronização Frontend ↔ Backend
🧠 3. Prompt Engineering Iterativo
⚡ 4. Performance vs Custo
O Que Aprendi (Spoiler: MUITO!)
✅ Acertos Estratégicos
- FastAPI: Documentação automática salvou horas de integração
- Supabase: Auth + Database + RLS em minutos, não dias
- Sistema de créditos: Modelo sustentável desde o início
- Segurança first: Implementar desde o começo é mais fácil
⚠️ Desafios Subestimados
- Depuração de extensões: DevTools limitado para service workers
- Variabilidade de PDFs: Cada edital é um mundo diferente
- Custos de IA: GPT-4 é caro, precisa otimizar chamadas
- Testes de integração: Simular fluxo completo com dados reais
🔄 O Que Faria Diferente
- TDD desde o início: Testes salvam tempo a longo prazo
- Logs estruturados: JSON logs desde o primeiro commit
- Monitoring: Métricas de performance desde o deploy
- Cache inteligente: Redis para otimizar chamadas repetidas
Status Atual: 100% Funcional e Escalável! 🚀
- ✅ IA real analisando editais de verdade
- ✅ Sistema de créditos funcionando e testado
- ✅ Backend robusto com FastAPI + Supabase
- ✅ Segurança em múltiplas camadas
- ✅ Performance otimizada para uso real
- ✅ Interface profissional e responsiva
Próximos Passos: Evoluindo o Produto
🎯 Imediato (Próximas Semanas):
- Dashboard web para histórico de análises
- Notificações push para novos editais
- Analytics de uso e performance
- Otimização de custos de IA
🚀 Médio Prazo:
- Chrome Web Store - disponibilizar publicamente
- Modelos especializados - treinar IA específica para editais
- API pública - permitir integrações
- Monitoramento proativo de novos leilões
Reflexão do Dia
E vocês? Já desenvolveram algo que começou simples e virou um sistema complexo? Como lidam com a evolução de MVPs para produtos completos? Próximo capítulo: vamos explorar analytics, otimizações e talvez... publicação na Chrome Web Store! Stay tuned! 📈