# Bidirectional Routing Pattern # Navigate to a specialist subagent and return with results # # ★ When To Use This Pattern: # - Main subagent needs specialized processing then returns # - "Consult a specialist" pattern (like asking an expert) # - Complex workflows where you leave, do work, then come back # - Alternative to cramming everything into one subagent # # ★ Key Insight: # Standard transitions (@utils.transition) are one-way. # When the return target is fixed, transition back directly and store no # return-address state. Use a dynamic return variable only when one specialist # genuinely serves multiple callers. # # ★ Architecture Decision: # Use this when you want separation of concerns: # - Main subagent: Orchestration and user interaction # - Specialist subagent: Focused, complex processing # # This is a COMPLETE template - customize action targets and metadata. system: instructions: | You coordinate pricing and technical consultations. Route to the relevant specialist, then present only the specialist action result. Use a fixed transition back because both specialists have one caller. messages: welcome: "Hello! I can coordinate pricing or technical help." error: "I couldn't complete the specialist consultation." access: default_agent_user: "agent@company.salesforce.com" config: developer_name: "Bidirectional_Routing_Agent" agent_label: "Bidirectional Routing" description: "Demonstrates fixed round-trip routing to specialist request handlers" variables: specialist_result: mutable string = "" description: "Exact specialist action result consumed by the main coordinator" language: default_locale: "en_US" # Main orchestration subagent start_agent main_hub: label: "Main Hub" description: "Central hub that routes to specialists and handles results" reasoning: instructions: -> | You are the main coordinator. | When user needs specialized help: | - For pricing questions, consult the pricing specialist | - For technical issues, consult the technical specialist | | After specialist returns, communicate their findings to the user. | | Current specialist result: {!@variables.specialist_result} actions: consult_pricing: @utils.transition to @subagent.pricing_specialist consult_technical: @utils.transition to @subagent.technical_specialist end_conversation: @utils.transition to @subagent.farewell # Pricing specialist subagent subagent pricing_specialist: label: "Pricing Specialist" description: "Handles complex pricing calculations and returns results" actions: calculate_price: description: "Calculates complex pricing" inputs: product_id: string description: "Product to price" quantity: object description: "Quantity requested" complex_data_type_name: "lightning__integerType" outputs: final_price: string description: "Calculated price" discount_applied: string description: "Any discounts applied" target: "flow://Calculate_Complex_Pricing" reasoning: instructions: -> | You are the pricing specialist. | Focus ONLY on pricing questions. | Calculate the price and prepare your findings. | When done, return to the main hub with your results. actions: calculate: @actions.calculate_price with product_id=... with quantity=... set @variables.specialist_result = @outputs.final_price # Return to main hub with results return_with_results: @utils.transition to @subagent.main_hub # Technical specialist subagent subagent technical_specialist: label: "Technical Specialist" description: "Handles technical troubleshooting and returns results" actions: diagnose_issue: description: "Diagnoses technical issues" inputs: symptoms: string description: "Reported symptoms" outputs: diagnosis: string description: "Technical diagnosis" solution: string description: "Recommended solution" target: "flow://Technical_Diagnosis" reasoning: instructions: -> | You are the technical specialist. | Focus ONLY on technical issues. | Diagnose the problem and prepare your findings. | When done, return to the main hub with your results. actions: diagnose: @actions.diagnose_issue with symptoms=... set @variables.specialist_result = @outputs.diagnosis return_with_results: @utils.transition to @subagent.main_hub subagent farewell: label: "Farewell" description: "Ends the conversation" reasoning: instructions: -> | Thank the user and say goodbye. # ★ Alternative: Simple one-way transitions (when you don't need to return) # # If the specialist doesn't need to return results to a coordinator, # use a one-way transition: # # go_orders: @utils.transition to @subagent.orders # go_billing: @utils.transition to @subagent.billing # # A dynamic return variable is justified only for multiple possible callers and # must be read by deterministic return routing, cleared after use, and reset on # cancellation.