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.

python
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.

Diagram

Capability-aware engines

ChannelCapabilities

DraftStreamer

StatusReactions

TypingManager

How It Works

Diagram
Channel CapabilitiesAgentUserChannel CapabilitiesAgentUserRequestProcess requestResult Agent–>>User: Response

Quick Start

  1. Create your agent
    python
    from praisonaiagents import Agent
    
    agent = Agent(name="assistant", instructions="Helpful assistant")
  2. 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

CapabilityTypeMeaning
live_editboolChannel can edit a previously sent message in place
reactionsboolChannel supports adding/removing emoji reactions — agents drive these via send_message(action="react")
typingboolChannel supports a typing/working indicator
supports_threadsboolChannel supports opening a native thread/topic under a channel — agents drive these via send_message and the Gateway Threads API
text_limitintMax characters per message (0 = unlimited)
edit_rate_limitfloatMin seconds between edits (auto-applied)
reaction_rate_limitfloatMin seconds between reactions (auto-applied)

Per-Channel Matrix

Channellive_editreactionsthreadstypingtext_limitedit_rate_limit
TelegramYesYesYesYes4096default
SlackYesYesYesNo400001.0
DiscordYesYesYesYes2000default
WhatsAppNoNoNoNo4096—
EmailNoNoNoNounlimited—

Table & Chart Support

Native table and chart rendering is governed by PresentationLimits and defaults to off on every channel — see Table & Chart Blocks.

CapabilityTelegramSlackDiscordWhatsApp
supports_tablesFalseFalseFalseFalse
supports_chartsFalseFalseFalseFalse

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

python
@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.

Related