schedule command manages scheduled agent execution.
See also: Gateway Schedules — when running the gateway, a
schedules: block in gateway.yaml loads at boot, so you don’t need praisonai schedule to run recurring agent → channel deliveries.Usage
Commands
Adding Jobs
Options
Examples
Add a daily reminder bound to a specific agent
Add a weekly digest
weekly runs every 7 days (604800 seconds).
Natural-language schedules
Plain English clock times and day names work anywhere--schedule is accepted.
at 5pm) is a one-shot at the next matching local time; any recurring form (every …, daily …, or a day-of-week name) becomes a cron schedule. See Async Agent Scheduler → Natural language for the full grammar.
Timezones and portability
A naiveat: timestamp is stored with the resolved zone attached (per-date DST-correct). Adding praisonai schedule add "x" -s "at:2026-07-01T09:00:00" in Europe/London stores 2026-07-01T09:00:00+01:00; the same command on a December date stores +00:00. Because the stored value carries the offset, the job fires at the same wall-clock time on any runner — you do not need to include an offset in the input unless you want to override the resolved zone.
Set a process-wide default with PRAISONAI_SCHEDULE_TIMEZONE. It resolves after any explicit tz/-s offset but before the machine’s local zone, and an unknown zone name is now rejected at add time:
Fire-and-forget alert
#C012345 lands as a brand-new turn instead of resuming the maintenance job’s conversation. Without --no-continuable, a delivered result is continuable by default — a reply resumes the job’s conversation with the brief in context.
Deliver via home channel
TELEGRAM_HOME_CHANNEL=<chat_id> before you run this command, or by adding an explicit --deliver telegram:<chat_id> argument. See Scheduler Delivery for the full precedence ladder.
Deliver into a thread
Append a third:thread_id segment to thread the outbound message — a Slack thread ts, a Telegram forum topic id, or a Discord thread id:
1728987654.001234. Adapters without thread support silently ignore the segment. See Scheduler Delivery → Thread semantics.
Fire-and-forget notice
--no-continuable opts out of session seeding, so a reply starts a fresh session instead of resuming the job. See Continuable Delivery.
Fan-out to all home channels
Deliver back to origin chat
origin requires --channel and --channel-id so the executor can resolve the creating chat.
Blueprints & Suggestions
Create jobs from reusable templates, or accept consent-first suggestions — the same engine that powers the/automations and /blueprint chat commands. See Automation Suggestions for the concepts.
blueprint
Create a schedule from a blueprint template.
blueprint-list
List available blueprints (built-in + user YAML).
suggestions
List pending automation suggestions.
suggestion-accept
Accept a suggestion and create the schedule job.
suggestion-dismiss
Dismiss a suggestion without creating a job.
suggestion-propose
Propose a blueprint as a suggestion (manual/CLI trigger).
Examples
Add with delivery target [Legacy]
Start scheduler
schedule start runs the agents.yaml engine (daemon scheduler). It does not poll store-backed jobs created by schedule add — use schedule run for those.
Run the store poller standalone (no gateway)
schedule run hosts the store poller in the foreground — no messaging gateway or UI host required. Use it when you added jobs via schedule add and just want them to fire from a plain terminal or a systemd unit.
Firing goes through the same lease-based
claim_due_jobs, so schedule run cannot double-fire a job when a gateway is also running (at-most-once claim).
The CLI maps
--poll to ScheduleLoop.run_forever(poll_seconds=…), the foreground counterpart to ScheduleLoop.start().
List scheduled jobs
list merges store-backed jobs (created with schedule add) and daemon schedulers in one view. Store jobs are tagged [store].
[store] <name> (id: <id>) [enabled|paused] — <cadence> — last run: <ts>:
list --json returns a single document splitting the two sources:
View logs
Stop a job
Delete a job
delete finds store jobs first (by id, then by name) and removes them; it falls back to the daemon PID handler for legacy jobs.
Skip the model turn when there are no new emails
--pre-run runs scripts/new_mail.sh before each tick. Exit 0 + stdout → agent runs with that stdout appended to the message. Non-zero exit → tick is skipped, no tokens spent, no Telegram ping.
--pre-run is a trusted, human-configured surface — it is not accepted by the agent-callable schedule_add tool, which prevents a prompt-injected agent from persisting arbitrary shell commands on the host. Configure --pre-run only via the CLI, YAML, or Python.No-LLM command action
--command runs the shell command on schedule and delivers its stdout verbatim — model-free, so there is no agent turn, no tokens, and no --message needed. --command and --script are aliases for the same flag. See Scheduler Command Action for the full feature page.
--command is a trusted, human-only surface (like --pre-run) — it is NOT part of the LLM-callable schedule_add tool, so a prompt-injected agent cannot persist arbitrary shell commands. Configure --command only via the CLI, YAML, or Python.Backend action
--backend runs the message as one headless turn through a registered CLI backend (see praisonai backends) — no native agent, no in-process model turn. It is mutually exclusive with --command. See Scheduler Backend Action for the full feature page.
--backend is a trusted, human-only surface (like --command and --pre-run) — it is NOT part of the LLM-callable schedule_add tool, so a prompt-injected agent cannot persist arbitrary backend jobs. Configure --backend only via the CLI, YAML, or Python.Wake only when a page changes
--monitor-url probes the URL on every tick, hashes the response, and only runs the agent when the hash changed. An unchanged source records no_change — zero tokens, no delivery. See Scheduler Monitor for the full feature page and reliability guarantees.
Wake only when a shell command’s stdout changes
--monitor-command is the stateful sibling of --pre-run: it remembers the last-seen hash across ticks and only runs the agent when the source moves.
--monitor-url and --monitor-command are mutually exclusive with each other, and with --pre-run, --command, and --backend. Like --pre-run and --command, they are trusted human-only surfaces — the LLM-callable schedule_add tool cannot set them, so a prompt-injected agent cannot persist an arbitrary monitor.--commandand--backendtogether →--command and --backend are mutually exclusive: a job runs exactly one model-free action. Configure one or the other.- Invalid timeout →
--backend-timeout must be a finite, non-negative number of seconds. - Missing
praisonai-code→CLI backend '<id>' unavailable: <e>. Backend jobs require the praisonai-code package (pip install praisonai-code). - A duplicate schedule name now exits non-zero (previously it substring-matched
Errorand could misclassify).
Pin a scheduled job to a specific model
--model snapshots the model onto the job so unattended runs stay on it — and fail closed if the default drifts. --no-pin follows whatever the default becomes:
Managing store-backed schedules
A store-backed schedule is a job authored byschedule add, persisted in ~/.praisonai/config.yaml, and managed from the CLI without hand-editing YAML. list, delete, and describe are now unified across store and daemon jobs, and five subcommands manage the store surface end to end. The agent-callable equivalents live in Schedule Tools.
Which command should I use?
Store subcommands and daemon subcommands overlap, so pick by how the job was created. Store-backed jobs (created withschedule add) manage state via pause / resume / update / remove — but they must be actively fired by a running poller. Pick how they fire:
Add a one-shot reminder
Pause and resume
Update cadence or message
update clears last_run_at when the cadence changes so the new schedule runs fresh — this avoids the “updated one-shot never fires” trap.Show past runs
Remove a store-backed schedule
remove retains run history — query it any time with praisonai schedule runs <name|id>.See Also
- Schedule Tools - Agent-callable equivalents: add, list, pause, resume, update, remove
- Scheduler Monitor - Wake the agent only when a URL or command output changes (
--monitor-url/--monitor-command), with the full URL-monitor reliability guarantees - Scheduler Backend Action - Run a scheduled job as one headless CLI-backend turn (
--backend) - Backends - List registered CLI backend ids with
praisonai backends - Scheduler Delivery - Push scheduled results to Telegram/Discord/Slack/WhatsApp from Python, YAML, or CLI
- Automation Suggestions - Consent-first suggestions and blueprint templates
- Scheduler Model Pin - Pin scheduled jobs to a specific model
- Proactive Delivery - Home channels and delivery tokens
- Scheduler - Scheduler details
- Background - Background tasks

