Blueprints carry a
default_deliver (usually telegram), so jobs created from Automation Suggestions land on the right channel out of the box.Quick Start
1
Simple Usage
Reply to where the request came from:
2
With Configuration
Set home channels and deliver by alias:
How It Works
Resolution order:
origin → platform:id → bare platform → alias. Platform names win over aliases.
Home and observed channels persist to ~/.praisonai/state/channel_directory.json.
Delivery from Scheduled Runs
For a scheduled agent that isn’t hosted insideBotOS, use AgentScheduler(deliver=…) — same DeliveryRouter, no gateway required.
origin works on the lightweight scheduler path when the job has a persisted origin (ScheduleJob.origin, captured when the job is created from a bot/webhook request) — it delivers back to the same channel/thread the request came in on. Only all still needs the gateway (it enumerates every configured bot). See Scheduler Delivery for the full token grammar and precedence rules.When
praisonai schedule tick runs out of process (OS cron, CI, serverless) with no gateway, a bare deliver: telegram target resolves its chat id from the persisted HomeChannelRegistry file (~/.praisonai/state/home_channels.json). A channel registered with /sethome inside a bot chat is read straight from that file — no gateway, no reconfiguration. See Deliver from cron / CI.Configuration Options
YAML
Alias overlay
Pre-name channels in~/.praisonai/state/channel_aliases.json:
botos.delivery_router.refresh_directory() periodically so adapters enumerate channels the bot has not yet heard from.
Rate Limiting
Scheduled and background sends share the reply-path rate limiter automatically — no config change required. Scheduled sends also fire at most once per due window across multipleBotOS processes — see BotOS → Multi-Process / HA Deployments.
When the gateway is the process performing the proactive/scheduled send (via WebSocketGateway._deliver_scheduled_result — e.g. any AgentScheduler job whose deliver= resolves inside a running gateway), the send is enqueued into a durable SQLite outbox at ~/.praisonai/state/gateway_outbox.sqlite before it reaches the router. The UNIQUE idempotency key survives a process crash-and-restart, so the same result is never posted twice. See Durable Delivery → Proactive Path for the full contract and comparison against direct BotOS.deliver(...).
Best Practices
Prefer aliases over raw IDs
Prefer aliases over raw IDs
Aliases survive renumbering and read better in logs.
Set home_channel for each platform
Set home_channel for each platform
Bare-platform targets fail without a configured home channel.
Do not name aliases after platforms
Do not name aliases after platforms
telegram as an alias will never resolve — platform lookup wins.Handle the bool return
Handle the bool return
deliver() returns False on resolution or send failure — log and retry as needed.Use durable delivery for cross-worker dedup
Use durable delivery for cross-worker dedup
BotOS.deliver rate-limits sends via the shared reply-path rate limiter, but does not support idempotency deduplication. For dedup across retries or workers, use the reply-path delivery.send(...) outbox (see Durable Delivery).Related
BotOS
Multi-platform orchestration
Bot Gateway
Run multiple bots from one server
Scheduler Delivery
Deliver scheduled agent results without the gateway

