afv-library/skills/agentforce-generate/assets/patterns/bidirectional-routing.agent

155 lines
5.6 KiB
Plaintext

# 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.