DisplayPolicy lets operators control how agent output is presented on each channel — streaming partial answers, showing tool progress, or sending a single final message — without touching adapter code.
The user messages the bot on a channel; display policy controls streaming, tool progress, and final message shape per platform.
How It Works
Resolution Precedence
Quick Start
Use Platform Defaults (No Config)
Zero configuration: Telegram streams replies live, Slack posts discrete steps, Email sends one final message. Platform-tier defaults do the right thing automatically:
Override Per Platform
Enable a compact footer on Telegram only:Platform keys are case-insensitive —
"Telegram", "TELEGRAM", and "telegram" all match.How It Works
The resolver applies this priority order for every field independently:- Platform override —
display.platforms.<platform>(matched case-insensitively, so{Telegram: ...}works for"telegram") - Global field — the top-level
DisplayPolicyfield - Platform-tier default — automatic default based on the channel’s tier (
edit,work,noedit,batch) - Built-in default — the hard-coded fallback
Configuration Options
| Field | Type | Default | Description |
|---|---|---|---|
streaming | "off" | "draft" | "progress" | "off" | How to stream partial replies: off, show draft updates, or show progress markers |
tool_progress | "off" | "inline" | "off" | Whether to print tool-call progress inline during execution |
interim_assistant_messages | bool | False | Whether to send “thinking…” messages between tool calls |
footer | "off" | "compact" | "off" | Append a compact attribution/source footer to replies |
platforms | dict[str, DisplayPolicy] | {} | Per-platform overrides; keys are matched case-insensitively |
Platform Tiers
| Tier | Platforms | Default Behaviour |
|---|---|---|
edit | Telegram, Discord | streaming="draft" — edits the message as content arrives |
work | Slack, Linear | tool_progress="inline" — shows tool steps without streaming |
noedit | Email, SMS, AgentMail | streaming="off" — waits for completion, sends one message |
batch | Bulk broadcast | streaming="off", interim_assistant_messages=False |
String booleans (
"false", "0") are parsed correctly in YAML/JSON config files, so interim_assistant_messages: "false" works as expected.Common Patterns
Telegram with draft streaming
Email with a compact footer
Different settings per channel
Which option to choose?
Best Practices
Trust the tier defaults — they're optimised per channel
Trust the tier defaults — they're optimised per channel
Telegram in
edit tier streams drafts which looks great; Email in batch tier correctly sends one final message. Only override when your use case genuinely differs from the tier default.Use 'draft' only on edit-capable channels
Use 'draft' only on edit-capable channels
streaming="draft" edits the original message in place. On channels without edit support (WhatsApp, Email) it falls through to the tier default — but explicitly setting "draft" on a batch channel is a misconfiguration.Case-insensitive platform keys in config
Case-insensitive platform keys in config
Config keys like
"Telegram", "TELEGRAM", or "telegram" all resolve to the same platform. This makes YAML configs more natural.Layer selectively — don't repeat defaults
Layer selectively — don't repeat defaults
Only specify what you need to change. A global
display: { streaming: "progress" } applies to all platforms, then per-platform overrides layer on top for specific exceptions.Related
Messaging Bots
Deploy agents across Telegram, Slack, Discord, WhatsApp, and more
Platform Capabilities
What each channel can render
Display System
Terminal output and Rich rendering
Bot Streaming Replies
Configure streaming for individual bot sessions
Channel Capabilities
Platform capability flags and limits
Relay Transport
Route agent replies through an out-of-process connector

