# validate_cancel_intent Detects cancellation intent — service/subscription vs current operation vs frustration threat. ## config - type: extraction - version: 1.0 - languages: pt-BR, en-US, es-ES - endpoint: /v1/extract/cancel-intent - mcp_tool: nalu_extract_cancel_intent - mcp_description: Detects whether the user wants to cancel a service/subscription (cancel_type=service), cancel the current operation (cancel_type=operation), or is just expressing frustration (cancel_type=none). Also detects conditional threats (is_threat=true: "if you don't fix this I'll cancel"). The bot developer decides the retention flow — NALU only classifies. Use has_suggestion to route the response. ## deterministic_rules ### stop_words #### pt-BR bom dia, boa tarde, olá, oi, tudo bem, ok, certo #### en-US hello, hi, good morning, ok, alright, sure #### es-ES hola, buenos días, ok, bien ### reject_patterns - ^[a-zA-Z\s]{1,4}$ ### accept_patterns - (cancelar plano|cancelar assinatura|quero cancelar|desistir do serviço|encerrar contrato|não quero mais|quero sair) - (cancel my subscription|cancel my account|cancel my plan|i want to cancel|i'd like to cancel|cancel service|stop my subscription) - (quiero cancelar|cancelar mi suscripción|cancelar mi cuenta|no quiero más) - (cancela isso|volta|desfaz|para tudo|cancel that|undo|go back|stop) ### constraints - min_length: 3 ## prompt You are a cancellation intent classifier. Given the dialogue below, determine the type of cancellation the user intends. Cancel types: - "service": user wants to cancel their service, subscription, plan, or account. - "operation": user wants to cancel/undo the current bot operation or go back. - "none": user is not canceling — just frustrated or thinking about it. Threat detection: is_threat=true when cancellation is conditional ("if you don't fix this I'll cancel", "se não resolver, cancelo"). Rules: 1. "Quero cancelar meu plano" → service, is_threat: false. 2. "Cancela isso, volta pro menu" → operation, is_threat: false. 3. "Se não resolver vou cancelar tudo" → service, is_threat: true, certain: false. 4. "Tô pensando em cancelar..." → none, certain: false. 5. Distinguish between canceling the SERVICE (churn) and canceling the CURRENT STEP (navigation). Dialogue: Agent: {{agent_input}} User: {{user_input}} Agent context: {{agent_context}} Reply ONLY with valid JSON, no markdown: { "extracted_value": "{\"cancel_type\":\"service/operation/none\",\"certainty_score\":0.0-1.0,\"is_threat\":true/false}", "certain": true/false, "reasoning": "short explanation" } ## few_shot_examples ### example 1 - agent_input: How can I help? - user_input: I want to cancel my subscription - output: {"extracted_value": "{\"cancel_type\":\"service\",\"certainty_score\":0.97,\"is_threat\":false}", "certain": true, "reasoning": "Direct service cancellation request"} ### example 2 - agent_input: Confirm your order? - user_input: no cancel that, go back - output: {"extracted_value": "{\"cancel_type\":\"operation\",\"certainty_score\":0.95,\"is_threat\":false}", "certain": true, "reasoning": "User canceling current operation, not the service"} ### example 3 - agent_input: I'm looking into it - user_input: if you don't fix this I'm canceling everything - output: {"extracted_value": "{\"cancel_type\":\"service\",\"certainty_score\":0.75,\"is_threat\":true}", "certain": false, "reasoning": "Conditional threat — not yet a firm decision to cancel"} ### example 4 - agent_input: Posso ajudar? - user_input: tô pensando em cancelar minha assinatura - output: {"extracted_value": "{\"cancel_type\":\"none\",\"certainty_score\":0.60,\"is_threat\":false}", "certain": false, "reasoning": "User considering cancellation but hasn't decided"} ### example 5 - agent_input: ¿En qué puedo ayudarte? - user_input: quiero cancelar mi suscripción - output: {"extracted_value": "{\"cancel_type\":\"service\",\"certainty_score\":0.98,\"is_threat\":false}", "certain": true, "reasoning": "Direct service cancellation in Spanish"} ## post_processors - select_cancel_suggestion ## suggestions ### when_cancel_service #### pt-BR Entendo que você quer cancelar. Antes de prosseguirmos, há algo que podemos resolver para que você fique? #### en-US I understand you'd like to cancel. Before we proceed, is there anything we can resolve to keep you? #### es-ES Entiendo que deseas cancelar. Antes de proceder, ¿hay algo que podamos resolver para que te quedes? ### when_cancel_operation #### pt-BR Entendido! Vou cancelar essa etapa. O que você gostaria de fazer agora? #### en-US Got it, I'll cancel that. What would you like to do instead? #### es-ES Entendido. Voy a cancelar eso. ¿Qué te gustaría hacer ahora? ### when_threat #### pt-BR Lamento os problemas. Vou fazer o meu melhor para resolver isso agora. #### en-US I'm sorry for the trouble. Let me try to resolve this for you right now. #### es-ES Lamento los problemas. Déjame intentar resolver esto ahora mismo. ### when_not_cancel (no suggestion — continue conversation)