Skip to content

Scheduled agents

Each scheduled job can select its own provider, model, project, role, runtime, permission policy, guardrails, MCP servers, skills, and persistent session. One provider failure is isolated and does not stop other due jobs.

from shipit_agent import (
    AgentScheduler,
    ScheduledAgentConfig,
    ScheduledAgentFactory,
    connect_mcp,
)
from shipit_agent.cli.llm import build_llm

factory = ScheduledAgentFactory(
    llm_factory=build_llm,
    mcp_factory=connect_mcp,
)
scheduler = AgentScheduler(
    agent_resolver=factory,
    on_event=lambda job, event: print(job.name, event.type, event.message),
)
scheduler.add(
    "Audit the repository and report release blockers.",
    cron="0 8 * * 1-5",
    name="release-audit",
    session_id="release-history",
    agent_config=ScheduledAgentConfig(
        provider="openai",
        model="gpt-5.5",
        project_root="/path/to/repo",
        runtime="project",
        optimized=True,
        permission_mode="plan",
        guardrails="strict",
        mcps=["github"],
        connections=["slack"],
        skills=["release-audit"],
        stream_events=True,
    ),
)
scheduler.run_forever()

stream_events=True routes live AgentEvent objects through the scheduler's on_event callback and still returns a ScheduleResult when the run completes. Use SQLiteJobStore for durable run counts, next-run times, pause state, failure status, and complete agent configuration.

CLI

shipit jobs add "Audit the release" \
  --cron "0 8 * * 1-5" \
  --name release-audit \
  --provider openai \
  --model gpt-5.5 \
  --project-root /path/to/repo \
  --permission-mode plan \
  --guardrails strict \
  --mcp github \
  --connection slack \
  --skill release-audit \
  --session-id release-history \
  --stream-events

shipit jobs list
shipit jobs pause release-audit
shipit jobs resume release-audit
shipit jobs start

Connection names are capability requirements, not stored credentials. Keep tokens and secrets in the configured credential store or environment; the scheduler database never persists them.