Bot platform adapters now ship in the
praisonai-bot package. praisonai bot serve still works exactly as documented here; for a standalone install see praisonai-bot Migration.Quick Start
How It Works
The user sends a message and watches a single emoji on that message move through each run stage.Stall Signals
When the agent falls quiet for too long — a slow LLM or a stuck tool — the same reaction slot switches to ⏳ afterstall_soft_s (default 20 s) and ⚠️ after stall_hard_s (default 60 s), and any real progress clears the signal immediately.
Label Fallback (channels without reactions)
On channels wherecapabilities["reactions"] is False — WhatsApp, Email, and Slack in “label” mode — the same phase state machine renders as a single status label the bot edits in place (queued → thinking… → using a tool… → done) instead of an emoji reaction, and the adapter picks the mode automatically from the channel’s capabilities with no extra config.
Configuration Options
| Option | Type | Default | Description |
|---|---|---|---|
queued_emoji | str | "⏳" | Shown when the run is queued |
thinking_emoji | str | "🤔" | Shown while the LLM is generating |
tool_emoji | str | "🔧" | Shown during tool execution |
done_emoji | str | "✅" | Terminal: success |
error_emoji | str | "❌" | Terminal: failure |
debounce_delay | float | 0.5 | Seconds before applying intermediate states |
immediate_terminal | bool | True | Apply done/error immediately |
stall_soft_s | float | 20.0 | Seconds without progress before ⏳ “still working…” |
stall_hard_s | float | 60.0 | Seconds without progress before ⚠️ “taking longer than expected” |
enabled | bool | False | Master switch — off by default; the bot adapter opts in when you pass status_reactions=True |
Reactions auto-skip on channels where
capabilities["reactions"] is False (WhatsApp, Email). On Slack, Unicode emoji map to Slack :text_name: form (e.g. 🤔 → thinking_face).Best Practices
Use distinct emoji for tool vs thinking
Use distinct emoji for tool vs thinking
Helps users tell when an external API call is in progress.
Leave immediate_terminal enabled
Leave immediate_terminal enabled
Users see done/error states instantly without debounce delay.
Tune stall thresholds to your longest reasonable tool call
Tune stall thresholds to your longest reasonable tool call
If a legitimate tool takes 40 s (web scraping, image generation), raise
stall_soft_s to 45–60 s so users don’t see ⏳ while everything is still healthy.Trust the automatic fallback on Email / WhatsApp
Trust the automatic fallback on Email / WhatsApp
Reactions silently degrade to a status label edit — no per-channel code required.
Custom integrators: use RunStatusController directly
Custom integrators: use RunStatusController directly
See Run Status Controller for the low-level API.
Related
Channel Capabilities
Which channels support reactions
Typing Indicators
Complementary typing feedback
Streaming Replies
Live token-by-token responses

