Skip to main content
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

1

Create your agent

from praisonaiagents import Agent

agent = Agent(name="assistant", instructions="Helpful assistant")
2

Start bots on each channel

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
typingboolChannel supports a typing/working indicator
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

Interactive widget capabilities (buttons, selects, native rendering shape) are governed separately by PresentationLimits — see Bot Presentations and Message Presentation.
Channellive_editreactionstypingtext_limitedit_rate_limit
TelegramYesYesYes4096default
SlackYesYesNo400001.0
DiscordYesYesYes2000default
WhatsAppNoNoNo4096
EmailNoNoNounlimited

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,
        "typing": True,
        "text_limit": 2000,
        "edit_rate_limit": 1.0,
        "reaction_rate_limit": 0.5,
    }

Best Practices

Turn on streaming=True and status_reactions=True on every bot; DraftStreamer, StatusReactions, and TypingManager no-op automatically when a channel lacks support.
Discord caps at 2000 characters, Telegram at 4096. Long replies are split or truncated — design agent output accordingly rather than assuming unlimited length.
Implement the capabilities property on new platform bots so rate limits (edit_rate_limit, reaction_rate_limit) and feature flags propagate correctly.
Verify WhatsApp and Email bots still deliver a final message when live edits and reactions are unavailable — users should never see a silent failure.

Streaming Replies

Live draft message edits

Status Reactions

Run-state emoji reactions

Typing Indicators

Keepalive typing indicators

Messaging Bots

Full bot setup guide