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