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