Channel Capabilities
What each bot channel can do — live edits, reactions, typing, and text limits
Each channel declares what it supports — live message edits, reactions, typing indicators, and text limits — so engines adapt automatically without platform-specific agent code.
from praisonaiagents import Agent
agent = Agent(name="bot", instructions="Reply on Telegram with streaming when the channel supports it.")
agent.start("Send a long answer with progressive updates.")The user receives a reply; channel capabilities tell PraisonAI how to stream, react, and chunk on that platform.
How It Works
Quick Start
- Create your agent
python from praisonaiagents import Agent agent = Agent(name="assistant", instructions="Helpful assistant") - Start bots on each channel
python from praisonai.bots import TelegramBot, SlackBot, DiscordBot # Same agent — each channel streams/reacts to whatever it supports TelegramBot(token="...", agent=agent, streaming=True, status_reactions=True).start() SlackBot(token="...", agent=agent, streaming=True, status_reactions=True).start() DiscordBot(token="...", agent=agent, streaming=True, status_reactions=True).start()
Capability Reference
| Capability | Type | Meaning |
|---|---|---|
live_edit | bool | Channel can edit a previously sent message in place |
reactions | bool | Channel supports adding/removing emoji reactions — agents drive these via send_message(action="react") |
typing | bool | Channel supports a typing/working indicator |
supports_threads | bool | Channel supports opening a native thread/topic under a channel — agents drive these via send_message and the Gateway Threads API |
text_limit | int | Max characters per message (0 = unlimited) |
edit_rate_limit | float | Min seconds between edits (auto-applied) |
reaction_rate_limit | float | Min seconds between reactions (auto-applied) |
Per-Channel Matrix
| Channel | live_edit | reactions | threads | typing | text_limit | edit_rate_limit |
|---|---|---|---|---|---|---|
| Telegram | Yes | Yes | Yes | Yes | 4096 | default |
| Slack | Yes | Yes | Yes | No | 40000 | 1.0 |
| Discord | Yes | Yes | Yes | Yes | 2000 | default |
| No | No | No | No | 4096 | — | |
| No | No | No | No | unlimited | — |
Table & Chart Support
Native table and chart rendering is governed by PresentationLimits and defaults to off on every channel — see Table & Chart Blocks.
| Capability | Telegram | Slack | Discord | |
|---|---|---|---|---|
supports_tables | False | False | False | False |
supports_charts | False | False | False | False |
A channel author opts in by returning an updated PresentationLimits (e.g. supports_tables=True) from its capability method. The max_table_rows and max_table_cols clamps bound the size a native renderer receives; when a flag is False, blocks degrade deterministically to a markdown table or text summary.
Graceful Degradation
DraftStreamer, StatusReactions, and TypingManager inspect bot.capabilities and silently no-op when a feature is unsupported — WhatsApp still delivers a single final message; Email skips reactions entirely.
Custom Adapters
@property
def capabilities(self):
return {
"live_edit": True,
"reactions": False,
"threads": True,
"typing": True,
"text_limit": 2000,
"edit_rate_limit": 1.0,
"reaction_rate_limit": 0.5,
}Best Practices
Enable features once — engines adapt
Turn on streaming=True and status_reactions=True on every bot; DraftStreamer, StatusReactions, and TypingManager no-op automatically when a channel lacks support.
Respect per-channel text limits
Discord caps at 2000 characters, Telegram at 4096. Long replies are split or truncated — design agent output accordingly rather than assuming unlimited length.
Declare capabilities on custom adapters
Implement the capabilities property on new platform bots so rate limits (edit_rate_limit, reaction_rate_limit) and feature flags propagate correctly.
Test degradation on limited channels
Verify WhatsApp and Email bots still deliver a final message when live edits and reactions are unavailable — users should never see a silent failure.