import json from app.schemas import AnalyzeRequest def build_prompt(request: AnalyzeRequest) -> str: state_json = request.current_state.model_dump_json(indent=2) source_line = f"\nORIGEM DO EVENTO:\n{request.source}\n" if request.source else "" return f""" Analisa esta conversa real de cliente B2B. A empresa vende carregadores EV AC / wallbox. IMPORTANTE: - A ÚLTIMA MENSAGEM DO CLIENTE é a mensagem principal a classificar. - Usa o HISTÓRICO ANTERIOR apenas como contexto. - Não trates mensagens anteriores da empresa como se fossem a ação final. - Se a última mensagem é do cliente e contém pedido, pergunta, solicitação, dúvida ou confirmação, who_has_the_ball = empresa e conversation_state = a_aguardar_empresa. {source_line} ÚLTIMA MENSAGEM DO CLIENTE: {request.last_customer_message} HISTÓRICO ANTERIOR / CONTEXTO: {request.previous_context} ESTADO ATUAL CONHECIDO ANTES DA ÚLTIMA MENSAGEM: {state_json} Devolve JSON com estes campos: {{ "case_type": "", "intent": "", "product_interest": "", "conversation_state": "", "commercial_state": "", "relationship_state": "", "next_action": "", "who_has_the_ball": "", "urgency": "", "risk": "", "summary": "", "evidence": [], "confidence": 0.0 }} Valores permitidos, usar exatamente estes valores: case_type: comercial, marketing, suporte, financeiro, outro intent: pedido_informacao, pedido_preco, pedido_contacto, pedido_proposta, pedido_orcamento, pedido_ajuste_proposta, followup_proposta, pedido_encomenda, pedido_proforma, pedido_fatura, confirmacao_adjudicacao, pedido_confirmacao_tecnica, comprovativo_pagamento, negociacao_preco, sem_interesse, remover_lista, suporte, resposta_ambigua, outro conversation_state: novo, a_aguardar_empresa, a_aguardar_cliente, resolvida, precisa_revisao commercial_state: novo_lead, interessado, qualificacao, proposta_pedida, proposta_enviada, negociacao, encomenda_pendente, proforma_pedida, pagamento_recebido, preparar_envio, cliente_ativo, sem_interesse, perdido, ganho, desconhecido relationship_state: novo_contacto, lead_existente, cliente_ativo, ex_cliente, desconhecido who_has_the_ball: empresa, cliente, ambos, desconhecido urgency: baixa, media, alta risk: baixo, medio, alto Regras: - Usa exatamente os valores permitidos. Não uses acentos, sinónimos ou variações. - Para urgency usa "media", nunca "média". - Para risk usa "medio", nunca "médio". - next_action deve ser uma frase curta em português, nunca enum nem código. - evidence deve conter frases curtas retiradas da conversa. - summary deve ser curto e útil para o comercial. - Não inventes informação. - Responde apenas JSON válido, sem markdown. """.strip()