# Escalation Pattern Template # =========================== # # This template demonstrates the complete escalation pattern with: # - Multi-channel connection blocks (messaging, voice, web) # - Graceful handoff with escalation messages # - Pre-escalation data gathering # - OmniChannel routing configuration # # Pattern: Multi-channel escalation with context preservation # Use when: Any agent that needs human handoff capabilities system: messages: welcome: "Hello! I'm here to help. If I can't assist you, I can connect you with a specialist." error: "I apologize, something went wrong. Let me connect you with someone who can help." instructions: "You are a helpful agent. When you cannot resolve an issue, escalate to a human agent with full context." config: agent_name: "EscalationPatternAgent" agent_label: "Escalation Demo Agent" description: "Agent demonstrating complete escalation patterns" default_agent_user: "agent@yourorg.com" # REQUIRED: Change to valid Einstein Agent User # ============================================================ # CONNECTION BLOCKS (Multi-Channel Escalation) # ============================================================ connections: # Messaging channel (SMS, WhatsApp, etc.) connection messaging: escalation_message: "One moment, I'm transferring our conversation to a specialist who can better assist you." outbound_route_type: "OmniChannelFlow" outbound_route_name: "" adaptive_response_allowed: False # Voice channel connection voice: escalation_message: "Please hold while I transfer you to a specialist. They will have full context of our conversation." outbound_route_type: "Queue" outbound_route_name: "Customer_Support_Queue" adaptive_response_allowed: True # Web chat channel connection web: escalation_message: "Connecting you with a live agent now. They'll be with you shortly." outbound_route_type: "OmniChannelFlow" outbound_route_name: "" adaptive_response_allowed: False variables: # Customer context customer_name: mutable string = "" description: "Customer's name for personalization" customer_issue: mutable string = "" description: "Summary of customer's issue" issue_category: mutable string = "" description: "Category of issue for routing" # Escalation state escalation_reason: mutable string = "" description: "Reason for escalation" attempts_before_escalation: mutable number = 0 description: "Number of resolution attempts" ready_to_escalate: mutable boolean = False description: "Whether pre-escalation data is gathered" start_agent entry: description: "Entry point - greet and assess needs" reasoning: instructions: | Greet the customer and understand their needs. Try to help directly, escalate if needed. actions: go_support: @utils.transition to @subagent.support description: "Help with support issue" # ============================================================ # SUPPORT SUBAGENT (With Escalation Triggers) # ============================================================ subagent support: description: "Attempt to resolve issue, escalate if unable" reasoning: instructions: -> # POST-ACTION: Check if escalation was triggered if @variables.ready_to_escalate == True: transition to @subagent.pre_escalation # Track attempts | I'm here to help you with your issue. if @variables.attempts_before_escalation >= 2: | It seems like I'm having trouble resolving this. | Would you like me to connect you with a specialist? actions: # Attempt resolution try_resolve: @actions.Attempt_Resolution description: "Try to resolve the issue" with issue = ... # LLM extracts from conversation set @variables.customer_issue = @outputs.issue_summary set @variables.issue_category = @outputs.category set @variables.attempts_before_escalation = @variables.attempts_before_escalation + 1 # User-initiated escalation request_human: @utils.setVariables description: "I'd like to speak with a human" with escalation_reason = "Customer requested human agent" with ready_to_escalate = True # Agent-initiated escalation (after failed attempts) escalate_complex: @utils.setVariables description: "Connect me with a specialist" available when @variables.attempts_before_escalation >= 2 with escalation_reason = "Unable to resolve after multiple attempts" with ready_to_escalate = True # ============================================================ # PRE-ESCALATION SUBAGENT (Gather Context) # ============================================================ subagent pre_escalation: description: "Gather information before escalating" reasoning: instructions: -> # Ensure we have customer name for personalization if @variables.customer_name == "": | Before I transfer you, may I have your name so the specialist can address you properly? else: | Thank you, {!@variables.customer_name}. Let me prepare the transfer. # Display summary of what we'll share if @variables.customer_name != "" and @variables.customer_issue != "": | I'll share the following with the specialist: | - Your issue: {!@variables.customer_issue} | - Category: {!@variables.issue_category} | - Reason for transfer: {!@variables.escalation_reason} | | Ready to connect you now. transition to @subagent.escalation actions: # Capture customer name save_name: @utils.setVariables description: "Save customer name" available when @variables.customer_name == "" with customer_name = ... # LLM extracts name from response # Proceed to escalation proceed: @utils.transition to @subagent.escalation description: "Proceed with transfer" available when @variables.customer_name != "" # Cancel escalation cancel_escalation: @utils.setVariables description: "Actually, let me try again with the bot" with ready_to_escalate = False with escalation_reason = "" run @utils.transition to @subagent.support # ============================================================ # ESCALATION SUBAGENT (Handoff) # ============================================================ subagent escalation: description: "Execute escalation to human agent" reasoning: instructions: -> # Log escalation context (this gets passed to human agent) run @actions.Log_Escalation_Context with customer_name = @variables.customer_name with issue_summary = @variables.customer_issue with category = @variables.issue_category with reason = @variables.escalation_reason with attempt_count = @variables.attempts_before_escalation | Transferring you now. Thank you for your patience! actions: # The actual escalation - uses connection block configuration handoff: @utils.escalate description: "Transfer to human agent" # ============================================================ # OPTIONAL: SPECIALIZED ESCALATION QUEUES # ============================================================ subagent escalate_billing: description: "Escalate specifically to billing team" reasoning: instructions: | I'm connecting you with our billing specialists. They'll be able to help with your account questions. actions: # Note: In production, you'd configure this action # to route to a specific billing queue billing_handoff: @utils.escalate description: "Transfer to billing team" subagent escalate_technical: description: "Escalate specifically to technical support" reasoning: instructions: | I'm connecting you with our technical support team. They specialize in resolving complex technical issues. actions: tech_handoff: @utils.escalate description: "Transfer to technical support"