Make one agent behave differently on phone, web, email, text, and SMS.
One agent can run across phone, web chat, email, text, and SMS. Per-channel configuration lets you tune how that agent thinks and how its replies are rendered on each channel, without forking the agent. Both maps are optional and additive: when a channel has no entry it inherits the base agent config, so voice and web behaviour is unaffected.There are two independent maps, keyed by channel (telephone, webrtc, sms, email, text):
Map
Group
What it controls
channel_overrides
LLM steering
How the agent thinks and responds — instructions, greeting, tool budget.
channel_properties
Transport / presentation
How the reply is rendered and sent — body template, subject, signature, SMS segments, enabled flag.
channel_overrides and channel_properties live on a static_prompt agent config. They are consumed by the async messaging engine (SMS, email, text). Voice and WebRTC ignore channel_properties transport mechanics and fall back to the base config.
Each entry steers inference for one channel. Fields are merged with the base config at resolution time.
Field
Type
Default
Description
instructions
string
none
Extra prompt text for this channel.
instructions_mode
append | replace
append
append joins this text after the base instructions; replace swaps them out entirely.
starting_message
starting message
none
Per-channel greeting. When set, it replaces the base greeting on this channel.
max_tool_steps
integer (≥ 1)
none
Per-channel tool-call budget per turn. When set, it overrides the base max_tool_steps.
When instructions_mode is append, the resolver concatenates base and override instructions separated by a blank line. If the base instructions are empty, the override is used as-is regardless of mode.
Each entry is a channel-exclusive block, discriminated by its channel field. Every block shares enabled (default true) and body_template (default {{agent_response}}), then adds channel-specific fields.
When a message arrives on a channel, resolve_channel_config folds the base agent config with that channel’s override and property blocks into a single effective config:
base config ──┐ ├── instructions = base, base+"\n\n"+override (append), or override (replace)override ────┤── starting_message = override if set, else base ├── max_tool_steps = override if set, else base, else 3 (default)properties ───┴── enabled / body_template = from channel_properties, else defaults properties = the matching email/sms/text block (or none)
The resolved values:
Resolved field
Source order
instructions
base, or base + override (append), or override (replace)
If a channel has no override and no properties entry, the base config is returned unchanged. This keeps voice and WebRTC untouched when you add async-channel tuning.