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.allow_silence: true, an agent can return NO_REPLY (or a custom token) to send nothing — no message, no typing indicator, no error.
Both
NO_REPLY (this page) and BotLoopGuard live in praisonaiagents/bots/silence.py alongside classify_final(), the classifier every adapter uses to distinguish silence from an empty reply. Where NO_REPLY lets an agent opt out of a single reply, BotLoopGuard lets the gateway opt out of an entire runaway bot-to-bot exchange.allow_silence: true, the agent can return NO_REPLY so nothing is sent.
Silence via
NO_REPLY happens after the agent runs — the agent decides not to reply. The observe group_policy is different: it skips the agent-run branch entirely for unmentioned messages, but still writes them to the session as passive context. Use NO_REPLY when the agent should judge each message; use observe to retain group chatter without ever running the agent on it. See observe: passive group context.Quick Start
1
YAML
2
Python
How It Works
Scheduled agents
An unattended monitor with nothing to report returns a silence marker, and the scheduled run skips delivery to chat while still recording assucceeded.
Scheduled and automation runs honour the same silence contract — a scheduled job whose whole output is NO_REPLY, [SILENT], or SILENT skips delivery while the run still completes and is recorded as succeeded in history.
An intentional-silence run also skips the continuable-session seed — nothing was delivered, so nothing is claimed to have been. The next inbound message lands as a fresh turn, same as before. See Scheduler Delivery → Continuable Delivery.
Both the wrapper (
AgentScheduler) and bot (ScheduledAgentExecutor) paths behave identically here — you don’t need to know which one you’re on.Configuration
Combine with
group_policy: respond_all so the agent may respond, then chooses silence via NO_REPLY.
Scheduled Runs
The same silence markers also suppress delivery on scheduled runs —AgentScheduler, AsyncAgentScheduler, and the full-gateway ScheduledAgentExecutor all honour NO_REPLY / [SILENT] / SILENT.
On the scheduled path, silence handling is always on — there is no
allow_silence toggle. An unattended monitor should never post the raw control token, so the marker unconditionally suppresses delivery. The run is still recorded as succeeded.NO_REPLY is delivered normally.
See Scheduler Delivery → Intentional Silence for the full flow.
Visible-Outcome Guarantee for Empty Finals
Blank replies and[tool_calls: …] placeholders now get a recorded fallback instead of silently dropping.
classify_final() is the single decision point every adapter (Slack, Telegram, Discord, IRC, custom) uses to classify an agent’s final reply. A deliberate NO_REPLY is still suppressed, but an empty final — blank, whitespace-only, or the machine [tool_calls: …] placeholder — now gets a visible fallback message so no adapter ends a turn with nothing shown.
Override the fallback message
The default fallback is"Task completed — no message to show.". Override it via either an empty_final_message key on the existing BotConfig.metadata block (recommended — no new typed knob) or a direct config.empty_final_message attribute.
Best Practices
Opt in explicitly
Opt in explicitly
allow_silence defaults to false — existing bots behave unchanged.Teach the agent the contract
Teach the agent the contract
Instructions should say when to return exactly
NO_REPLY vs a normal reply.Use for ambient group channels
Use for ambient group channels
Reduces noise when the bot listens to everything but should rarely speak.
Related
Scheduled Run Policy
Guardrails and silent runs for unattended scheduled agents
Bot Loop Protection
Break runaway bot-to-bot reply loops
Gateway
Channel configuration reference
Messaging Bots
Multi-platform bot setup
Scheduler Delivery
Silence markers also suppress scheduled pushes
Failure-path counterpart of classify_final — visible replies for failed turns

