AI agents
Cron jobs for AI agents and LLM pipelines
Run agents, batch inference, and embedding refreshes on a schedule — and know within minutes when a run fails, hangs on a stuck API call, or quietly produces nothing.
The problem
AI workloads are moving onto schedules — a nightly agent that compiles a digest, an hourly embedding refresh, batch classification over yesterday's tickets. They inherit every classic cron failure and add their own: rate limits, hung LLM calls that never time out, a model ID deprecated by a provider update, an agent loop that swallows a tool error and exits 0 having done nothing. And nobody is watching the output — running unattended was the whole point.
How SteadyCron solves it
- 1 Trigger the workload with an HTTP job — SteadyCron calls your endpoint on schedule, with retries, backoff, and a timeout — or keep your existing cron and add a heartbeat.
- 2 Ping /start when the run begins and /success when it completes, so a run stuck on a hung LLM call shows up as overdue instead of as silence.
- 3 Include a short payload — items processed, token spend, the model used — for context in the activity feed.
- 4 Alert on missed, failed, or overlong runs, with consecutive-failure thresholds so one rate-limit blip doesn't page anyone.
TOKEN=<your-ping-token>
curl -fsS https://ping.steadycron.com/$TOKEN/start
n=$(python run_agent.py --task nightly-digest) \
&& curl -fsS --data "processed=$n" https://ping.steadycron.com/$TOKEN \
|| curl -fsS https://ping.steadycron.com/$TOKEN/fail
Jobs
| weekly-digest-email | HTTP | 0 9 * * 1 | in 2 days | 3 days ago | ||
| nightly-db-backup | Heartbeat | 0 2 * * * | in 19 h | 5 h ago | ||
| stripe-reconciliation | HTTP | 0 */4 * * * | in 38 min | 3 h ago | ||
| cache-warmup | HTTP | */15 * * * * | in 11 min | now | ||
| search-index-sync | Heartbeat | */30 * * * * | in 6 min | 24 min ago |
| seed-test-data | HTTP | 0 4 * * * | in 14 h | 10 h ago | ||
| preview-env-cleanup | Heartbeat | 0 */6 * * * | in 2 h | 4 h ago | ||
| trial-expiry-sweep | HTTP | 0 6 * * * | — | yesterday |
Every job's status, schedule, and last run — at a glance.
Exit code 0 is not a result
Agent frameworks are built to keep going: a tool call fails, the model
apologizes and moves on, and the process exits cleanly with nothing written.
Don’t ping success because the process ended — ping it after checking that the
outcome exists (the digest was sent, the rows were embedded, the output file
is non-empty), and ping /fail yourself when it doesn’t. The
heartbeat check then alerts on what actually
matters: no valid result within the expected window, whatever the cause.
Failure modes plain cron never had
- Rate limits and spend caps: a 429 storm or an exhausted monthly budget ends tonight’s run early — and tomorrow’s too. Consecutive-failure thresholds separate the transient blip from the pipeline that stays broken.
- Hung calls: an LLM request without a timeout can idle a run forever.
Because
/startarrived and/successnever did, the run shows up as overdue after the grace period — instead of hanging unnoticed for days. - Model drift: a deprecated model ID or a changed response shape breaks your parsing on the provider’s timeline, not your deploy timeline. The per-run log — status, payload, duration — shows exactly which night it started.
A good fit for
- Nightly agent runs: digests, ticket triage, report generation, scheduled scrapes that feed a model.
- RAG maintenance: embedding refreshes and index rebuilds, where staleness is invisible until answer quality degrades.
- Batch inference: classification, enrichment, or summarization jobs over yesterday’s data.
Debugging a run that already went quiet? See Scheduled AI agent not running for a step-by-step diagnosis, or Dead man’s switch for AI agents for the pattern behind it.
Related documentation
Stop finding out the hard way
Start on the free tier — no credit card required.
Start free