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.0rc2.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.0rc2-py3-none-any.whl (28.9 kB view details)

Uploaded Python 3

File details

Details for the file zeno_scheduler-1.0.0rc2.tar.gz.

File metadata

  • Download URL: zeno_scheduler-1.0.0rc2.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.0rc2.tar.gz
Algorithm Hash digest
SHA256 dce2f46b43170e3bc85533e0b7f05d6dab2744fd30d49826d70e3c264ae638e8
MD5 2c4a2fb713c0d196b3b32684075bd29d
BLAKE2b-256 dd29c4d567fc4dbaed70c86b70b9a0762a3f9488d8b222044eaf9473a0b6b553

See more details on using hashes here.

Provenance

The following attestation bundles were made for zeno_scheduler-1.0.0rc2.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.0rc2-py3-none-any.whl.

File metadata

File hashes

Hashes for zeno_scheduler-1.0.0rc2-py3-none-any.whl
Algorithm Hash digest
SHA256 c0d0c07fa77e74ef939f0af87586b2c88227b259c1608401add6808dc2bf4893
MD5 115b24bf69f2838145a6be1727f60f37
BLAKE2b-256 af5c88c5e4319187dba5d36e90bb456a55c28b52075664ae8a417ba51a0cb1c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for zeno_scheduler-1.0.0rc2-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