mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-08-07 16:04:41 +08:00
155 lines
5.6 KiB
Plaintext
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.
|