Skip to main content
The user chats on Telegram or Discord; one shared agent brain answers on every connected platform.

Orchestration

BotOS lets you deploy your AI agent to multiple messaging platforms with just a few lines of code. One agent brain, many channels.

Quick Start

1

Single platform

from praisonai.bots import Bot also works when the praisonai wrapper is installed (backward-compatible shim).
2

Multiple platforms

3

YAML config

How It Works

1

Create your Agent

Build an Agent, AgentTeam, or AgentFlow — your AI brain.
2

Wrap in a Bot

Bot("telegram", agent=agent) wraps your agent for a single platform.
3

Orchestrate with BotOS

BotOS starts all your bots concurrently — one command, all platforms.

Architecture

  • Protocol-driven: BotOSProtocol lives in the lightweight core SDK; heavy implementations live in the wrapper
  • Lazy loading: Platform libraries (telegram, discord, etc.) are only imported when start() is called
  • Agent-centric: Every bot is powered by an Agent, AgentTeam, or AgentFlow
  • Extensible: Register custom platforms at runtime with register_platform(), or distribute packaged connectors via the praisonai.channels entry-point group for zero-code auto-registration

Token Setup

Tokens are resolved automatically from environment variables. Set them once, use everywhere.
You can always override with an explicit token= parameter:

Usage Examples

Examples below use from praisonai.bots import Bot, BotOS — the wrapper aliases. Replace with from praisonai_bot.bots import Bot, BotOS when using the standalone praisonai-bot package without the wrapper.

Single Agent on Telegram

from praisonai_bot.bots import Bot is the canonical bot-tier import. from praisonai.bots import Bot is a backward-compatible shim when the praisonai wrapper is installed.

AgentTeam on Discord

AgentFlow on Multiple Platforms

YAML Configuration

Create a botos.yaml file:
Then load and run:
Environment variables in ${VAR_NAME} format are automatically resolved.

Smart Defaults

When you create a Bot(), it automatically enhances your agent with useful defaults — no configuration needed:
Smart defaults only apply to plain Agent instances. AgentTeam and AgentFlow are left untouched — they already have their own configuration.

Auto-Recovery & Health Monitoring

Every BotOS instance is supervised by default — crashed bots are restarted with backoff, and proactive health checks catch hung connections before users notice. Supervision is on automatically — no extra arguments needed:
Tune the health monitor when you need tighter sweeps or restart caps:
Opt out when an external supervisor (systemd, Kubernetes) owns restarts:
Bot(..., enable_supervision=...) and BotOS(..., enable_supervision=...) are two separate kwargs on two separate classes — set the one that matches the entry point you’re actually calling. See Auto-reconnect on long-running-bots for the single-Bot path.

Multi-Process / HA Deployments

Running more than one BotOS process — for high availability, horizontal scaling, or a brief rolling-restart overlap — used to double-fire every scheduled job, double-posting messages, double-charging tokens, and duplicating side effects. Each due job is now claimed atomically before it runs, so exactly one BotOS process fires it; the others skip silently. This needs no config change — both bundled stores support atomic claim via an advisory-locked claim_due: the default ConfigYamlScheduleStore and FileScheduleStore. Verify the guarantee is engaged from the startup log — every ticker prints one line when its schedule loop starts:
atomic_claim=True confirms cross-process at-most-once is active. atomic_claim=False means the current store does not implement claim_due, so the legacy non-atomic path is in use and a job can fire once per process. Start two processes against the same store and watch the log — only one fires each job:
If a BotOS process crashes mid-run, its 300-second lease expires and another ticker re-claims the job — no permanent job loss. Single-process behaviour is unchanged.
Related: Bot Lifecycle Hooks → SCHEDULE_TRIGGER, Scheduled Run Policy, Proactive Delivery.

Operator Controls

When supervision is enabled, use Python API controls (BotOS has no CLI for these):

Aggregated Health

Plug await botos.health() into a /healthz endpoint or Prometheus exporter — one dict per platform, no custom wiring per adapter.

Unified Per-User Session

Link multiple platforms so one human gets one conversation across all channels:
When the resolver unifies multiple adapters onto one user, BotOS also serialises turns on the resolved session id — a user typing on Telegram while their Slack app fires in the same second cannot scramble the shared transcript. See Concurrent Turns Across Adapters.
See Cross-Platform Sessions for complete documentation on identity linking and unified sessions.

Health Checks

Every bot adapter supports probe() and health() for diagnostics:
Use probe() in CI/CD pipelines or doctor checks to verify bot tokens before deployment.

Extending Platforms

Add your own messaging platform in 3 steps:
1

Create your adapter

2

Register the platform

3

Use it like any built-in platform

4

Remove a platform (optional)

Useful for tests, hot-reloads, or multi-tenant cleanup:
unregister() returns True if the platform was registered and removed, False otherwise. It’s safe to call even when the platform isn’t registered.
Your custom adapter class must implement:

Managing Bots

API Reference

str
required
Platform name: "telegram", "discord", "slack", "whatsapp", or any registered custom platform.
Agent | AgentTeam | AgentFlow
The AI agent that powers the bot.
str
Explicit token. Falls back to {PLATFORM}_BOT_TOKEN env var.
IdentityResolverProtocol
Cross-platform identity resolver for unified sessions. StoreBackedIdentityResolver.from_env() (from praisonai.bots) reuses the gateway pairing store so paired users share one session out of the box — see Cross-Platform Sessions.
Platform-specific parameters (e.g., app_token for Slack, mode for WhatsApp).
Methods:
  • bot.run() — Start the bot (sync, blocks)
  • await bot.start() — Start the bot (async)
  • await bot.stop() — Stop the bot
  • await bot.send_message(channel_id, content) — Send a message
  • await bot.probe() — Test channel connectivity (returns ProbeResult)
  • await bot.health() — Get detailed health status (returns HealthResult)
  • bot.register_command(name, handler) — Register a custom chat command
  • bot.list_commands() — List all registered commands
list[Bot]
Pre-built Bot instances to orchestrate.
Agent | AgentTeam | AgentFlow
Shared agent — used with platforms to auto-create Bots.
list[str]
Platform names — auto-creates a Bot per platform using agent.
IdentityResolverProtocol
Cross-platform identity resolver for unified sessions. StoreBackedIdentityResolver.from_env() (from praisonai.bots) reuses the gateway pairing store so paired users share one session out of the box — see Cross-Platform Sessions.
HealthMonitorConfig
Proactive health sweep settings (interval, startup_grace, stale_after, stuck_after, max_restarts_per_hour).
bool
default:"True"
Run each bot through ChannelSupervisor with auto-recovery. Set False when an external supervisor owns restarts.
str
Reliability preset: "production" (15 s graceful drain + CPU-scaled admission ceiling + bounded fair queue), "default" / None (5 s drain, no admission ceiling), or "off" (immediate teardown, no admission). Explicit fields like drain_timeout and max_concurrent_runs always override the preset. See Gateway Reliability Presets for details.
Methods:
  • botos.run() — Start all bots (sync, blocks)
  • await botos.start() — Start all bots (async)
  • await botos.stop() — Stop all bots
  • botos.add_bot(bot) — Register a bot
  • botos.remove_bot("platform") — Remove a bot
  • botos.list_bots() — List platform names
  • botos.get_bot("platform") — Get a bot by platform
  • await botos.health() — Aggregated Dict[str, HealthResult] across all bots
  • botos.get_supervisor_status() — Supervisor + health-monitor snapshot
  • botos.pause_bot("platform") — Pause a supervised bot
  • botos.resume_bot("platform") — Resume a paused bot
  • botos.reconnect_bot("platform") — Force reconnect and reset error state
  • await botos.deliver(target, text, origin=None) — Proactive outbound delivery (see Proactive Delivery)
  • botos.configure_channels(config) — Set home channels and aliases
  • botos.delivery_router — Direct access to DeliveryRouter and ChannelDirectory
  • BotOS.from_config("path.yaml") — Load from YAML
Error you’ll see for unknown platforms:
The error string changed in a recent refactor. If you’re migrating from an older PraisonAI, update any try/except blocks or test assertions that matched the old "Unknown platform" text.

Best Practices

Use TELEGRAM_BOT_TOKEN, DISCORD_BOT_TOKEN, and related env vars so secrets never live in source code.
Default BotOS supervision restarts crashed bots with backoff — disable only when systemd or Kubernetes owns restarts.
Call await bot.probe() in CI to catch invalid tokens before users hit your bot.

Messaging Bots

Platform-specific bot setup and capabilities.

Bot Gateway

Gateway routing, pairing, and channel supervision.

Cross-Platform Sessions

Unified sessions across Telegram, Discord, and more.

Proactive Delivery

Push outbound messages with botos.deliver().