66 lines
2.5 KiB
Python
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
|