CLIO v1.0 — Scanner Inteligente com IA (MVP)
This commit is contained in:
65
backend/app/services/ai_service.py
Normal file
65
backend/app/services/ai_service.py
Normal file
@@ -0,0 +1,65 @@
|
||||
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
|
||||
Reference in New Issue
Block a user