Files
clio/backend/app/services/ai_service.py
2026-02-10 23:05:41 +00:00

66 lines
2.5 KiB
Python

import openai
import json
from app.config import settings
client = openai.AsyncOpenAI(api_key=settings.OPENAI_API_KEY)
SYSTEM_PROMPT = """Você é CLIO, assistente de IA especializada em análise de documentos.
Ao receber a imagem de um documento, você deve:
1. Extrair TODO o texto visível (OCR)
2. Identificar a categoria: contrato, nf (nota fiscal), receita (médica), rg, cnh, certidao, boleto, outro
3. Extrair dados estruturados relevantes conforme o tipo:
- CNH: nome, cpf, rg, validade, categoria, registro
- RG: nome, rg, cpf, data_nascimento, naturalidade
- NF: cnpj_emitente, razao_social, valor_total, itens, data_emissao
- Contrato: partes, objeto, valor, prazo, data_assinatura
- Receita: paciente, medico, crm, medicamentos, posologia
- Boleto: beneficiario, valor, vencimento, codigo_barras
- Certidão: tipo, nome, cartorio, data
4. Gerar um resumo em bullets (máx 5 pontos)
5. Identificar alertas de risco (cláusulas abusivas, prazos vencendo, valores suspeitos)
6. Sugerir tags relevantes
Responda SEMPRE em JSON válido com esta estrutura:
{
"title": "título descritivo curto do documento",
"category": "categoria",
"extracted_text": "texto completo extraído",
"extracted_data": { ... dados estruturados ... },
"summary": "• ponto 1\\n• ponto 2\\n• ponto 3",
"risk_alerts": ["alerta 1", "alerta 2"],
"tags": ["tag1", "tag2"]
}"""
async def analyze_document(image_base64: str) -> dict:
"""Analyze a document image using GPT-4o vision."""
# Remove data URL prefix if present
if "," in image_base64:
image_base64 = image_base64.split(",", 1)[1]
response = await client.chat.completions.create(
model=settings.OPENAI_MODEL_VISION,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{
"role": "user",
"content": [
{"type": "text", "text": "Analise este documento. Extraia todas as informações e retorne o JSON estruturado."},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}",
"detail": "high"
}
}
]
}
],
max_tokens=4096,
temperature=0.1,
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
return result