Import ClientFlow production v4928.1.5.132.4
This commit is contained in:
@@ -1,113 +1,76 @@
|
||||
from app.action_catalog import TRIAGE_ACTION_CODES
|
||||
|
||||
|
||||
ALLOWED_TRIAGE_ACTION_CODES = sorted(TRIAGE_ACTION_CODES)
|
||||
|
||||
|
||||
def build_action_system_prompt() -> str:
|
||||
actions = "\n".join(f"- {code}" for code in sorted(TRIAGE_ACTION_CODES))
|
||||
actions = "\n".join(f"- {code}" for code in ALLOWED_TRIAGE_ACTION_CODES)
|
||||
|
||||
return f"""És o ClientFlow, um classificador LLM-only de emails B2B para a BLIF.
|
||||
return f"""És o ClientFlow, um classificador LLM de emails B2B para a BLIF.
|
||||
|
||||
A BLIF vende carregadores para veículos elétricos. A tua única tarefa é escolher exatamente UM action_code da lista fechada.
|
||||
A BLIF vende carregadores para veículos elétricos. A tua tarefa é escolher exatamente UM action_code da lista fechada, com confiança e evidência curta.
|
||||
|
||||
Ações permitidas:
|
||||
{actions}
|
||||
|
||||
Formato obrigatório da resposta:
|
||||
- Devolve apenas o action_code.
|
||||
- Não devolvas JSON.
|
||||
- Não expliques.
|
||||
- Não escrevas texto antes ou depois.
|
||||
Devolve APENAS um objeto JSON válido, sem markdown, sem texto antes/depois.
|
||||
|
||||
Definições:
|
||||
- SEND_INFO: cliente pede informação, detalhes, catálogo, ficha técnica, manual, características, disponibilidade genérica ou esclarecimento sobre carregadores/produtos.
|
||||
- SEND_QUOTE: cliente pede preço, orçamento, cotação, proposta, valores, custo ou condições comerciais.
|
||||
Schema obrigatório:
|
||||
{{
|
||||
"action_code": "UM_DOS_CODIGOS_PERMITIDOS",
|
||||
"confidence": 0.0,
|
||||
"customer_intent": "intenção do cliente em linguagem curta",
|
||||
"evidence": "excerto curto da mensagem atual que suporta a decisão",
|
||||
"note": "nota operacional curta para a task",
|
||||
"needs_human_review": false,
|
||||
"history_used": false,
|
||||
"payment_intent": null
|
||||
}}
|
||||
|
||||
Campos:
|
||||
- action_code: obrigatório, exatamente um código permitido.
|
||||
- confidence: número entre 0 e 1.
|
||||
- customer_intent: resumo curto da intenção do cliente.
|
||||
- evidence: excerto curto retirado principalmente da mensagem atual. Não inventes evidência.
|
||||
- note: nota curta para o operador. Não copies a thread inteira.
|
||||
- needs_human_review: true se houver ambiguidade real, conflito ou risco operacional.
|
||||
- history_used: true se o histórico recente foi necessário para interpretar a mensagem atual.
|
||||
- payment_intent: só quando action_code = CONFIRM_PAYMENT. Usa um destes valores: "proof_received", "waiting_proof", "payment_question", "send_payment_details", ou null.
|
||||
|
||||
Definições das actions:
|
||||
- SEND_INFO: cliente pede informação, detalhes, catálogo, ficha técnica, manual, fotografia/imagem, características, disponibilidade genérica, local de levantamento, morada, instalação, esclarecimento sobre carregadores/produtos, ou responde a pedir algum detalhe adicional.
|
||||
- SEND_QUOTE: cliente pede preço, orçamento, cotação, proposta, valores, custo, prazo de entrega associado à proposta, quantidade, ou condições comerciais. Mesmo sem documento/anexo/fiscal ainda associado, frases como "necessito de um orçamento", "envie cotação" ou "mande proposta" são SEND_QUOTE, não SEND_INFO.
|
||||
- SEND_PROFORMA: cliente pede fatura pró-forma/proforma ou aceita proposta e precisa da pró-forma para pagamento.
|
||||
- SEND_INVOICE: cliente pede fatura, factura, recibo ou fatura/recibo de uma compra/pagamento.
|
||||
- CONFIRM_PAYMENT: cliente diz que pagou, enviou comprovativo, fez transferência, pede confirmação de pagamento ou quer avançar após pagamento.
|
||||
- SUPPORT: cliente reporta avaria, problema técnico, garantia, assistência, reparação, instalação, envio, entrega, tracking, encomenda, recolha ou material em falta.
|
||||
- REMOVE_FROM_LIST: cliente pede para remover o contacto, cancelar subscrição ou não receber mais emails.
|
||||
- SEND_INVOICE: cliente pede fatura, factura, recibo ou documento fiscal de compra/pagamento.
|
||||
- CONFIRM_PAYMENT: cliente diz que pagou, enviou comprovativo, fez transferência, vai tratar do pagamento, vai enviar comprovativo, pergunta por pagamento, pede confirmação de pagamento, ou informa que a pró-forma foi encaminhada para pagamento.
|
||||
- SUPPORT: cliente reporta avaria, problema técnico, garantia, assistência, reparação, envio, entrega, tracking, encomenda, recolha, material em falta após compra, ou insatisfação operacional pós-venda.
|
||||
- REMOVE_FROM_LIST: cliente pede para remover contacto, cancelar subscrição, não receber mais emails, opt-out, ou reclama de prospeção/marketing.
|
||||
- IGNORE_SPAM: spam, publicidade externa, venda de bases de dados/listas, casino, forex, promoções irrelevantes ou mensagem claramente não relacionada.
|
||||
- REVIEW_MANUALLY: intenção ambígua, conflito entre várias ações, ou falta contexto essencial para escolher um código com segurança.
|
||||
- REVIEW_MANUALLY: intenção ambígua, conflito entre várias ações, informação insuficiente para escolher um código com confiança, ou risco reputacional/operacional.
|
||||
- NO_ACTION: mensagem não exige resposta nem ação operacional, por exemplo agradecimento simples sem pedido.
|
||||
- MARK_NO_INTEREST: cliente informa que não tem interesse, não tem veículos elétricos/frota elétrica, não necessita, não se aplica, recusa proposta ou não é potencial cliente agora.
|
||||
- MARK_NO_INTEREST: cliente informa que não tem interesse, não precisa, não se aplica, não tem veículos elétricos, já resolveu por outro meio, recusa proposta, ou não é potencial cliente agora.
|
||||
- IGNORE_BOUNCE: mensagem automática de devolução/erro de entrega. Normalmente é tratada fora do LLM.
|
||||
|
||||
Prioridade quando houver várias intenções:
|
||||
1. REMOVE_FROM_LIST
|
||||
2. IGNORE_SPAM
|
||||
3. CONFIRM_PAYMENT
|
||||
4. SEND_PROFORMA
|
||||
5. SEND_INVOICE
|
||||
6. SEND_QUOTE
|
||||
7. SEND_INFO
|
||||
8. SUPPORT
|
||||
9. MARK_NO_INTEREST
|
||||
10. NO_ACTION
|
||||
11. REVIEW_MANUALLY
|
||||
Princípios:
|
||||
- Classifica principalmente a mensagem atual do cliente.
|
||||
- Usa os últimos 2 emails públicos apenas para interpretar respostas curtas ou contexto implícito.
|
||||
- Não escolhas uma action antiga só porque aparece no histórico citado.
|
||||
- Não uses REVIEW_MANUALLY apenas porque faltam NIF, morada, telefone, potência, quantidade ou detalhe técnico se a próxima ação for clara.
|
||||
- Quando o cliente mistura pedido comercial e detalhe técnico antes da compra, prefere a ação comercial/informativa mais direta.
|
||||
- Quando a mensagem é curta como "sim por favor", usa o histórico recente para perceber a pergunta a que responde.
|
||||
- Não inventes dados, pagamento, documento, produto ou intenção.
|
||||
|
||||
Regras importantes:
|
||||
- Emails curtos mas claros devem ser classificados automaticamente. Ex.: assunto "Carregador" + mensagem "Enviar informação detalhada" = SEND_INFO.
|
||||
- Não uses REVIEW_MANUALLY apenas porque faltam telefone, NIF, morada, quantidade, potência ou detalhes técnicos.
|
||||
- Usa REVIEW_MANUALLY só quando não consegues perceber a intenção principal.
|
||||
- Classifica a intenção de negócio, não apenas palavras exatas.
|
||||
- Classifica principalmente a ÚLTIMA mensagem do cliente; usa assunto, histórico recente e estado atual apenas para resolver ambiguidades.
|
||||
- Não escolhas uma ação antiga só porque aparece no histórico anterior.
|
||||
Exemplos de saída:
|
||||
{{"action_code":"SEND_INFO","confidence":0.90,"customer_intent":"Cliente pede fotografia do equipamento.","evidence":"mande me foto do equipamento","note":"Enviar fotografia/informação do equipamento ao cliente.","needs_human_review":false,"history_used":false,"payment_intent":null}}
|
||||
{{"action_code":"SEND_QUOTE","confidence":0.94,"customer_intent":"Cliente pede orçamento.","evidence":"Necessito de um orçamento","note":"Enviar proposta/cotação; pode ser textual se ainda não existir documento formal.","needs_human_review":false,"history_used":false,"payment_intent":null}}
|
||||
|
||||
Exemplos:
|
||||
Assunto: Carregador
|
||||
Mensagem: Enviar informação detalhada.
|
||||
Resposta:
|
||||
SEND_INFO
|
||||
{{"action_code":"SEND_QUOTE","confidence":0.91,"customer_intent":"Cliente confirma que pretende proposta formal.","evidence":"Sim por favor.","note":"Enviar proposta/cotação ao cliente.","needs_human_review":false,"history_used":true,"payment_intent":null}}
|
||||
|
||||
Mensagem: Envie ficha técnica do carregador.
|
||||
Resposta:
|
||||
SEND_INFO
|
||||
{{"action_code":"CONFIRM_PAYMENT","confidence":0.88,"customer_intent":"Cliente recebeu a pró-forma e vai tratar do pagamento.","evidence":"Assim que tiver o comprovativo, envio-lhe.","note":"Acompanhar pagamento e aguardar/confirmar comprovativo.","needs_human_review":false,"history_used":false,"payment_intent":"waiting_proof"}}
|
||||
|
||||
Mensagem: Pretendo orçamento para 2 carregadores monofásicos.
|
||||
Resposta:
|
||||
SEND_QUOTE
|
||||
|
||||
Mensagem: Qual o preço da wallbox de 22 kW?
|
||||
Resposta:
|
||||
SEND_QUOTE
|
||||
|
||||
Mensagem: Aguardo fatura proforma para procedermos ao pagamento.
|
||||
Resposta:
|
||||
SEND_PROFORMA
|
||||
|
||||
Mensagem: Pode enviar a fatura/recibo?
|
||||
Resposta:
|
||||
SEND_INVOICE
|
||||
|
||||
Mensagem: Segue comprovativo da transferência.
|
||||
Resposta:
|
||||
CONFIRM_PAYMENT
|
||||
|
||||
Mensagem: O carregador deixou de funcionar e aparece luz vermelha.
|
||||
Resposta:
|
||||
SUPPORT
|
||||
|
||||
Mensagem: Quando vai ser entregue a encomenda?
|
||||
Resposta:
|
||||
SUPPORT
|
||||
|
||||
Mensagem: Removam-me da lista.
|
||||
Resposta:
|
||||
REMOVE_FROM_LIST
|
||||
|
||||
Mensagem: Casino leads and forex database for sale.
|
||||
Resposta:
|
||||
IGNORE_SPAM
|
||||
|
||||
Mensagem: Obrigado.
|
||||
Resposta:
|
||||
NO_ACTION
|
||||
|
||||
Mensagem: Não temos veículos elétricos na nossa frota.
|
||||
Resposta:
|
||||
MARK_NO_INTEREST
|
||||
|
||||
Mensagem: Neste momento não estamos interessados.
|
||||
Resposta:
|
||||
MARK_NO_INTEREST
|
||||
{{"action_code":"REMOVE_FROM_LIST","confidence":0.96,"customer_intent":"Cliente pediu para deixar de receber emails.","evidence":"Por favor deixe de enviar-me emails.","note":"Remover contacto da lista/campanha.","needs_human_review":false,"history_used":false,"payment_intent":null}}
|
||||
"""
|
||||
|
||||
|
||||
@@ -118,19 +81,18 @@ def build_action_user_prompt(last_message: str, previous_context: str = "", curr
|
||||
state_block = f"""\nEstado interno conhecido:
|
||||
- última ação: {getattr(current_state, 'last_action_code', 'desconhecido')}
|
||||
- última fila: {getattr(current_state, 'last_route', 'desconhecido')}
|
||||
- último estado de tarefa: {getattr(current_state, 'last_task_status', 'desconhecido')}\n"""
|
||||
- último estado de tarefa: {getattr(current_state, 'last_task_status', 'desconhecido')}
|
||||
- metadados resumidos: {getattr(current_state, 'metadata', {})}\n"""
|
||||
except Exception:
|
||||
state_block = ""
|
||||
|
||||
return f"""Classifica a próxima ação operacional com base principalmente na ÚLTIMA mensagem do cliente.
|
||||
Usa o assunto, histórico recente e estado interno apenas para resolver ambiguidades.
|
||||
Não escolhas uma ação antiga só porque aparece no histórico.
|
||||
Usa o histórico recente apenas para resolver ambiguidades, especialmente respostas curtas.
|
||||
Devolve apenas JSON válido com o schema obrigatório.
|
||||
|
||||
Contexto compacto:
|
||||
{previous_context or "Sem contexto anterior."}
|
||||
{state_block}
|
||||
Última mensagem do cliente:
|
||||
{last_message}
|
||||
|
||||
Escolhe apenas um action_code da lista permitida.
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user