Quick Start
How It Works
| Channel | Native rendering | Fallback |
|---|---|---|
| Telegram | Inline keyboard | Plain text |
| Slack | Block Kit | Plain text |
| Discord | Components | Plain text |
| Plain text only | — |
Block Types
| Block | Factory | Use for |
|---|---|---|
| Text | make_text(content) | Markdown body |
| Buttons | make_buttons(items) | Action rows |
| Select | make_select(options) | Dropdown menus |
| Divider | make_divider() | Visual separator |
| Context | make_context(content) | Smaller hint text |
priority on PresentationButton survives when renderers trim to channel limits.
Approval Prompts
On channels implementingSupportsPresentation, approval prompts render as inline Allow Once, Allow Always, and Deny buttons wired to /approve <approval_id> ... commands — replacing fragile yes/no text classification.
Text-keyword backends (TelegramApproval, SlackApproval, DiscordApproval) remain valid fallbacks for channels without presentation support.
Best Practices
Use factory methods for blocks
Use factory methods for blocks
PresentationBlock.make_text() and make_buttons() are the agent-friendly path — fewer field mistakes than raw dataclass construction.Set button priority for destructive actions
Set button priority for destructive actions
Provide plain-text content as fallback
Provide plain-text content as fallback
Always set
MessagePresentation text content so WhatsApp and email channels still deliver a readable message.Use MessagePresentation.approval for tool gates
Use MessagePresentation.approval for tool gates
The built-in helper wires standard Allow/Deny buttons consistently across Telegram, Slack, and Discord.
Related
Approval Protocol
Tool approval backends
Bot Gateway
Multi-channel gateway server

