mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-08-08 16:25:58 +08:00
127 lines
5.6 KiB
Plaintext
127 lines
5.6 KiB
Plaintext
# Router-First Architecture Template
|
|
#
|
|
# Use a central router when distinct request types need different objectives,
|
|
# instructions, actions, authority, or escalation behavior. Do not persist
|
|
# ordinary user inputs merely to keep a request handler focused; each action
|
|
# uses slot filling from the current turn and surviving conversation history.
|
|
|
|
system:
|
|
messages:
|
|
welcome: "Welcome! I can help with orders, returns, or general support."
|
|
error: "I apologize, something went wrong. Let me try again."
|
|
instructions: |
|
|
You are a customer service agent for an e-commerce company. During
|
|
request classification, choose exactly one matching request handler
|
|
without answering the underlying request. In order and return handlers,
|
|
use the available read actions for external facts. In general support,
|
|
answer the question or transfer to a human when needed.
|
|
|
|
access:
|
|
default_agent_user: "agent@yourorg.com"
|
|
|
|
config:
|
|
developer_name: "Router_First_Agent"
|
|
agent_label: "Customer Service Agent"
|
|
description: "Routes orders, returns, and support requests to distinct handlers"
|
|
|
|
language:
|
|
default_locale: "en_US"
|
|
|
|
start_agent agent_router:
|
|
label: "Request Router"
|
|
description: "Routes the user's latest request without answering it"
|
|
|
|
reasoning:
|
|
instructions: ->
|
|
| Route only the user's latest request:
|
|
| - order status or tracking: order help;
|
|
| - return eligibility or an existing return: return help;
|
|
| - general questions: support.
|
|
| Do not answer the underlying request in this router.
|
|
actions:
|
|
check_order: @utils.transition to @subagent.orders
|
|
description: "Handle order status or tracking"
|
|
handle_return: @utils.transition to @subagent.returns
|
|
description: "Handle return eligibility or an existing return"
|
|
general_help: @utils.transition to @subagent.support
|
|
description: "Handle a general support question"
|
|
|
|
subagent orders:
|
|
label: "Order Help"
|
|
description: "Handles order status and tracking inquiries"
|
|
|
|
actions:
|
|
get_order_status:
|
|
description: "Look up the current status of a specific order rather than answer a general shipping-policy question"
|
|
inputs:
|
|
order_id: string
|
|
description: "Order number supplied by the customer"
|
|
is_required: True
|
|
outputs:
|
|
status: string
|
|
description: "Current order status"
|
|
target: "flow://Get_Order_Status"
|
|
|
|
reasoning:
|
|
instructions: ->
|
|
| Help with the user's latest order status or tracking request. Ask
|
|
for an order number only when it is absent from the current turn
|
|
and surviving conversation history. Report only action-returned
|
|
status as an external fact.
|
|
| If the user changes intent, use the matching transition.
|
|
actions:
|
|
lookup_order: @actions.get_order_status
|
|
description: "Look up a concrete order using the latest order number in the conversation"
|
|
with order_id=...
|
|
to_returns: @utils.transition to @subagent.returns
|
|
description: "Handle a changed request about returns"
|
|
reclassify: @utils.transition to @subagent.agent_router
|
|
description: "Reclassify any other changed intent"
|
|
|
|
subagent returns:
|
|
label: "Return Help"
|
|
description: "Explains return eligibility and looks up existing return status"
|
|
|
|
actions:
|
|
get_return_status:
|
|
description: "Look up an already-created return; this does not create a return or issue money"
|
|
inputs:
|
|
return_id: string
|
|
description: "Existing return identifier supplied by the customer"
|
|
is_required: True
|
|
outputs:
|
|
status: string
|
|
description: "Current return status"
|
|
target: "flow://Get_Return_Status"
|
|
|
|
reasoning:
|
|
instructions: ->
|
|
| Explain return eligibility and policy, or look up an existing
|
|
return when the user provides a return identifier. This template
|
|
intentionally does not create returns or issue refunds; those
|
|
consequential actions require machine-checkable authorization,
|
|
exact targets, confirmation, idempotency, and failure handling.
|
|
| If the user changes intent, return to request routing.
|
|
actions:
|
|
lookup_return: @actions.get_return_status
|
|
description: "Look up an existing return using the latest return identifier in the conversation"
|
|
with return_id=...
|
|
reclassify: @utils.transition to @subagent.agent_router
|
|
description: "Reclassify a changed intent"
|
|
|
|
subagent support:
|
|
label: "General Support"
|
|
description: "Handles general support questions that need no order or return action"
|
|
|
|
reasoning:
|
|
instructions: ->
|
|
| Answer the user's latest general support question. If the request
|
|
requires order or return handling, route to the matching handler.
|
|
actions:
|
|
go_orders: @utils.transition to @subagent.orders
|
|
description: "Handle a changed request about an order"
|
|
go_returns: @utils.transition to @subagent.returns
|
|
description: "Handle a changed request about a return"
|
|
escalate: @utils.escalate
|
|
description: "Transfer to a human when the user explicitly requests one or the issue cannot be handled safely"
|