# System Instruction Overrides Pattern # Customize agent behavior with dynamic system-level instructions # # ★ When To Use This Pattern: # - Different behavior for different user segments (VIP, standard, etc.) # - Time-based instruction changes (business hours vs after hours) # - Feature flags that change agent personality # - A/B testing different conversation styles # # ★ Key Insight: # - Global system instructions are the default for subagents without overrides # - A subagent system block REPLACES the global instructions; it does not extend # them, so every durable safety and scope invariant must be restated # - Use conditionals in reasoning to dynamically adjust tone # - Variables can control instruction branches # # ★ Important Limitation: # - The system: block itself cannot use conditionals or variables # - Dynamic behavior must be implemented in subagent reasoning # # This is a COMPLETE template - customize for your use case system: # Default instructions for subagents that do not define their own system block. instructions: | You are a professional customer service agent. Perform only the current operating task. Answer the underlying request only when that task calls for an answer; otherwise route, verify, refuse, or escalate as directed. Never share confidential information. messages: welcome: "Hello! How can I assist you today?" error: "I apologize, but I encountered an issue. Let me try that again." access: default_agent_user: "agent@company.salesforce.com" config: developer_name: "Dynamic_Service_Agent" agent_label: "Dynamic Service Agent" description: "Agent with dynamic instruction overrides based on context" variables: # Standard linked variables EndUserId: linked string source: @MessagingSession.MessagingEndUserId description: "Messaging End User ID" RoutableId: linked string source: @MessagingSession.Id description: "Messaging Session ID" ContactId: linked string source: @MessagingEndUser.ContactId description: "Contact ID" # Variables for dynamic instruction control customer_tier: mutable string = "standard" description: "Customer tier: standard, premium, or vip" business_hours: mutable boolean = True description: "Whether we're in business hours" language: default_locale: "en_US" additional_locales: "" all_additional_locales: False start_agent agent_router: label: "Request Router" description: "Routes to the appropriate service area based on user tier" # ★ Use before_reasoning to set up context-based variables before_reasoning: # In a real implementation, these would come from a Flow/Apex lookup # Here we show the pattern run @actions.get_customer_tier with contact_id=@variables.ContactId set @variables.customer_tier = @outputs.tier run @actions.check_business_hours set @variables.business_hours = @outputs.is_business_hours reasoning: # The router performs classification and transition only. Response # guidance belongs in the service subagent that answers the request. instructions: -> | Route the customer to the appropriate service area. Do not answer the underlying request or provide service from the router. actions: go_orders: @utils.transition to @subagent.orders go_billing: @utils.transition to @subagent.billing go_support: @utils.transition to @subagent.support available when @variables.business_hours == True actions: get_customer_tier: description: "Get customer tier from Salesforce" inputs: contact_id: string description: "Contact ID to look up" outputs: tier: string description: "Customer tier: standard, premium, vip" target: "flow://Get_Customer_Tier" check_business_hours: description: "Check if currently in business hours" outputs: is_business_hours: boolean description: "True if in business hours" target: "flow://Check_Business_Hours" subagent orders: label: "Order Management" description: "Handle order inquiries with tier-appropriate service" reasoning: instructions: -> # ★ Tier-specific instructions carry through to subagents if @variables.customer_tier == "vip": | This is a VIP customer. Expedite all order requests. | Offer free shipping upgrades proactively. | Help the customer with their order inquiry. | Look up order status, process changes, or handle returns. actions: back: @utils.transition to @subagent.agent_router subagent billing: label: "Billing Support" description: "Handle billing with appropriate authority levels" reasoning: instructions: -> # ★ Different authority based on tier if @variables.customer_tier == "vip": | You can waive fees up to $100 for VIP customers. | Proactively offer payment plan options. else if @variables.customer_tier == "premium": | You can waive fees up to $25 for premium customers. else if @variables.customer_tier == "standard": | Fee waivers require manager approval. Escalate if requested. | Help the customer understand their bill and resolve issues. actions: back: @utils.transition to @subagent.agent_router escalate: @utils.escalate description: "Transfer to billing specialist" available when @variables.customer_tier == "standard" subagent support: label: "Technical Support" description: "Technical support with business hours awareness" reasoning: instructions: -> if @variables.business_hours == False: | Technical support is limited outside business hours. | Log the issue for follow-up and provide self-service resources. if @variables.business_hours == True: | Full technical support available. Troubleshoot thoroughly. | Help resolve the customer's technical issue. actions: back: @utils.transition to @subagent.agent_router # ═══════════════════════════════════════════════════════════════════════════ # ★ SUBAGENT-LEVEL SYSTEM OVERRIDES (NEW PATTERN) # These subagents demonstrate complete persona switching using subagent-level # system: blocks that OVERRIDE the global system instructions. # ═══════════════════════════════════════════════════════════════════════════ subagent formal_mode: label: "Formal Communication" description: "Professional business communication mode" # ★ SUBAGENT-LEVEL SYSTEM OVERRIDE # This completely replaces global system instructions for this subagent system: instructions: | You are a formal business professional. Use professional language, focus on efficiency and clarity, and maintain a respectful corporate tone. Never share confidential information. reasoning: instructions: -> | [Formal Mode Engaged] | | Good day. How may I be of assistance? | I am prepared to address your inquiry with the utmost professionalism. actions: back: @utils.transition to @subagent.agent_router subagent creative_mode: label: "Creative Assistant" description: "Creative and imaginative communication mode" # ★ SUBAGENT-LEVEL SYSTEM OVERRIDE # Different persona entirely system: instructions: | You are a creative and imaginative assistant. Be playful, use metaphors and analogies, and encourage brainstorming. Never share confidential information. reasoning: instructions: -> | 🎨 [Creative Mode Activated!] | | Hey there, creative spirit! Ready to explore some ideas together? | Think of me as your brainstorming buddy - no idea is too wild! | | What shall we dream up today? actions: back: @utils.transition to @subagent.agent_router subagent technical_expert: label: "Technical Expert" description: "Deep technical expertise mode" # ★ SUBAGENT-LEVEL SYSTEM OVERRIDE # Specialist persona system: instructions: | You are a technical expert. Use precise terminology and detailed examples, and reference documentation when helpful. Never share confidential information. reasoning: instructions: -> | [Technical Expert Mode] | | I'm ready to dive deep into technical details. | Feel free to use technical terminology - I'll match your level. | | What technical challenge are we solving? actions: back: @utils.transition to @subagent.agent_router # ★ Insight: Three Levels of Instruction Control # # LEVEL 1: GLOBAL SYSTEM BLOCK # - Static text only (no variables, no conditionals) # - Applies only where a subagent system block does not replace it # - Good for: Default guardrails, scope, and personality # - Example: "Never share confidential information" # # LEVEL 2: SUBAGENT-LEVEL SYSTEM BLOCK (NEW!) # - Placed inside subagent definition # - COMPLETELY OVERRIDES global system for that subagent # - Good for: Persona switching, mode changes, specialist behavior # - Example: subagent formal_mode: system: instructions: "Be professional..." # # LEVEL 3: SUBAGENT REASONING INSTRUCTIONS # - Dynamic (variables, conditionals, template expressions) # - Extends/adjusts behavior within subagent # - Good for: Context-aware responses, personalization # - Example: if @variables.is_vip: | Provide priority service # # OVERRIDE HIERARCHY: # Subagent system: > Global system: > Default behavior # # COMBINING APPROACHES: # - Use GLOBAL system for default guardrails # - Use SUBAGENT system only for a necessary complete replacement # - Restate every durable guardrail in each subagent replacement # - Use SUBAGENT reasoning for dynamic conditional behavior # # Best Practice: Prefer reasoning instructions for persona adjustments. If a # subagent system replacement is necessary, restate all required guardrails.