Skip to main content
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):
MapGroupWhat it controls
channel_overridesLLM steeringHow the agent thinks and responds — instructions, greeting, tool budget.
channel_propertiesTransport / presentationHow 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.

channel_overrides

Each entry steers inference for one channel. Fields are merged with the base config at resolution time.
FieldTypeDefaultDescription
instructionsstringnoneExtra prompt text for this channel.
instructions_modeappend | replaceappendappend joins this text after the base instructions; replace swaps them out entirely.
starting_messagestarting messagenonePer-channel greeting. When set, it replaces the base greeting on this channel.
max_tool_stepsinteger (≥ 1)nonePer-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.

channel_properties

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.

EmailProperties (channel: "email")

FieldTypeDefaultDescription
enabledbooleantrueWhether the agent responds on this channel.
body_templatestring{{agent_response}}Template for the reply body.
body_formatmultipart | html | plaintextmultipartHow the email body is rendered.
subject_templatestringRe: {{subject}}Template for the reply subject line.
default_subjectstringnoneSubject used when no inbound subject is available.
from_display_namestringnoneDisplay name shown on the From header.
signaturestringnoneSignature appended to the body.
template_wrapperstringnoneOuter wrapper template applied around the body.
include_unsubscribe_footerbooleantrueAppend an unsubscribe footer.
quote_historybooleanfalseQuote the prior message thread under the reply.
cc_reply_policyconditional | never | alwaysconditionalWhether to keep Cc recipients on replies. conditional keeps them only when appropriate.
require_dmarc_passbooleanfalseRequire inbound mail to pass DMARC before the agent replies.
auto_close_on_conclusionbooleantrueClose the conversation when the exchange concludes.
For the full email-agent reference (domains, routing, and the fields above in context), see Configuring an email agent.

SmsProperties (channel: "sms")

FieldTypeDefaultDescription
enabledbooleantrueWhether the agent responds on this channel.
body_templatestring{{agent_response}}Template for the message body.
max_segmentsinteger (≥ 1)3Maximum SMS segments per message.
on_overflowtruncate | splittruncateWhen the body exceeds max_segments, either cut it off or split it across messages.
strip_markdownbooleantrueRemove markdown formatting before sending.
allow_unicodebooleantruePermit non-GSM Unicode characters.
append_opt_out_footerbooleanfalseAppend an opt-out footer to outbound messages.

TextProperties (channel: "text")

The first-party API text channel has no transport mechanics, so it carries only the shared fields.
FieldTypeDefaultDescription
enabledbooleantrueWhether the agent responds on this channel.
body_templatestring{{agent_response}}Template for the response body.

How resolution works

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 fieldSource order
instructionsbase, or base + override (append), or override (replace)
starting_messagechannel override, else base
max_tool_stepschannel override, else base, else 3
enabledchannel_properties.enabled, else true
body_templatechannel_properties.body_template, else {{agent_response}}
propertiesthe matching channel-properties block, else none
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.

Next steps

Configuring an email agent

Full reference for email-specific fields, routing, and domains.

Channels

How an agent connects to phone, web, email, text, and SMS.