afv-library/skills/agentforce-generate/assets/patterns/system-instruction-overrides.agent

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.