Skip to main content

Zeno proactive-trigger scheduler: one-shot, heartbeat, and cron triggers.

Project description

zeno-scheduler

Proactive-trigger scheduler for Zeno.

Fires agent turns autonomously — the assistant doesn't have to wait for the user to send a message. Supports one-shot reminders, periodic heartbeats, and cron-style recurring schedules. Triggers are persisted to SQLite so they survive process restarts. Built-in @tools let the agent itself schedule and cancel its own reminders.

Install

uv add 'zeno-framework[scheduler]'
# or, without the AI package:
uv add zeno-scheduler

Features

  • One-shot triggers (schedule_once) — fire at a specific datetime or after a timedelta
  • Heartbeat triggers (schedule_heartbeat) — fire every N seconds
  • Cron triggers (schedule_cron) — standard 5-field cron expression with timezone support
  • Built-in tools so the agent can self-schedule from natural-language reminders: schedule_once, schedule_heartbeat, schedule_cron, list_triggers, cancel_trigger, cancel_trigger_by_name
  • (user_id, name) upsert semantics — re-running a seed call with the same name updates the existing row instead of duplicating it
  • Missed-fire policies (OnMissed.SKIP / RUN_ONCE / RUN_ALL) for triggers that lapse while the process was down

Minimal usage

import asyncio
from datetime import timedelta
from pathlib import Path

from zeno.agent import Agent
from zeno.app import ZenoApp
from zeno.channels.cli import CliChannel
from zeno.scheduler import Scheduler, SqliteScheduleStore
from zeno.scheduler.tools import schedule_once, list_triggers, cancel_trigger
from zeno.testing import FakeProvider

async def main() -> None:
    store = SqliteScheduleStore(Path("./scheduler.db"))
    scheduler = Scheduler(store)

    # Pre-seed a one-shot reminder. The agent could also call this via
    # the `schedule_once` tool at runtime (which accepts string deltas
    # like "30m" — handy when the model produces them).
    await scheduler.schedule_once(
        user_id="local",
        thread_key=None,
        channel="cli",
        prompt="Reminder: stand up and stretch.",
        delta=timedelta(minutes=30),
        name="stretch-reminder",
    )

    app = ZenoApp(
        agent=Agent(
            name="root",
            instructions="You are a proactive assistant. Schedule reminders when asked.",
            tools=[schedule_once, list_triggers, cancel_trigger],
        ),
        channels=[CliChannel()],
        provider=FakeProvider(),
        scheduler=scheduler,  # ← wires the scheduler into ZenoApp's lifecycle
    )
    await app.run()

asyncio.run(main())

ZenoApp starts and stops the scheduler alongside its other tasks. When a trigger fires, the scheduler calls channel.inbound_put(...) on the matching channel, which delivers the prompt as a synthetic inbound message — the agent processes it through the same turn path as a real user message.

Testing

uv run pytest packages/zeno-scheduler

Tests use an in-memory ScheduleStore and a virtual clock — no real sleep or filesystem I/O.

Part of the Zeno framework. See apps/zeno-example-scheduler for a runnable end-to-end reference wiring.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zeno_scheduler-1.0.1.tar.gz (39.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zeno_scheduler-1.0.1-py3-none-any.whl (28.9 kB view details)

Uploaded Python 3

File details

Details for the file zeno_scheduler-1.0.1.tar.gz.

File metadata

  • Download URL: zeno_scheduler-1.0.1.tar.gz
  • Upload date:
  • Size: 39.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for zeno_scheduler-1.0.1.tar.gz
Algorithm Hash digest
SHA256 24ee55400b178b226ee11154ee28d4096eb8aa6b95b7287cd57c88d9b0b0bceb
MD5 3839bc4354314e966373328f586c1c22
BLAKE2b-256 b48a8a8e10f28669e7d896dad35e2c1bc9e56317cabfdea3390d5cfffe57d007

See more details on using hashes here.

Provenance

The following attestation bundles were made for zeno_scheduler-1.0.1.tar.gz:

Publisher: publish.yml on nkootstra/zeno

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file zeno_scheduler-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: zeno_scheduler-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 28.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for zeno_scheduler-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2297f76ddf404fa0577631137e04ba374231508d2c60ce45d3b09188a136e924
MD5 2c3cd2299f4c304dfdc1273efe2b9c71
BLAKE2b-256 ecd782f4c8663b73b4e554d67b61ff16c16351ada2cb0c9e6ef55953410e7145

See more details on using hashes here.

Provenance

The following attestation bundles were made for zeno_scheduler-1.0.1-py3-none-any.whl:

Publisher: publish.yml on nkootstra/zeno

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page