Skip to content

Scheduler and heartbeat

Scheduled jobs live in the agent's schedule list and appear in the dashboard's Scheduler tab, where you can also create, pause, edit and trigger them.

schedule: [
  {
    name: "Morning revenue check",
    cron: "0 9 * * 1-5",
    timezone: "America/Costa_Rica",
    message: "Check yesterday's revenue and flag anything unusual.",
  },
]

A job is a message sent to the agent at a time you choose — so anything the agent can do in a conversation, it can do on a schedule. Use thread_id to keep a job's history in one continuous conversation.

Fan-out. With multi-user mode on, for_each_customer: true runs the job once per end user, and the message can use {customer_key}, {platform} and {user_id}. Use action instead of message to run a named script from allowed_actions.

Two places jobs live. The schedule list above is one of them; the other is the scheduler's own store, which is what the Scheduler tab's "New task" form writes and what an agent creates when it schedules something itself. The Scheduler tab merges both and badges each row, so nothing is hidden — but the difference matters when you go looking for what is triggering a job. A schedule entry is cron-only and lives in the agent's configuration; a stored task can also be one-time and can be handed to a different agent later.

Asking an agent about the schedule. Any agent can read and change its own scheduled work in chat, and AgentFather can do the same for every agent in the deployment — across both places — so "what wakes the finance agent at 3am?", "pause that job", or "schedule a Monday summary for the support agent" are all things you can simply ask for. Changing, creating or immediately running another agent's job always raises an approval card first, because it makes that agent start working on instructions you supplied. Ask to see a job's full instructions before approving an edit: a listing shows only its name, schedule and the first couple of lines.

Heartbeat is different and simpler: the agent wakes up periodically (default every 60 minutes) and reads HEARTBEAT.md in its workspace — a plain markdown file of standing instructions. It is the low-ceremony way to say "keep an eye on this" without writing a cron entry. Control it with the heartbeat block per agent, or heartbeat: in config.yaml for the fleet.