scheduler Plan Research Analyze Review Synthesize

Your agents crash.
Ours recover.

JamJet checkpoints every event as it happens. When a worker dies mid-run, the scheduler reclaims the lease and resumes from exactly where it left off — zero events lost, zero reruns.

$ pip install jamjet
Read the docs

See it run

jamjet · research-pipeline.yaml
$ jamjet run research-pipeline.yaml
▸ Starting execution exec_7f3a...
▸ [Plan]       ✓ completed  420ms
▸ [Research]   ✓ completed  1.2s
▸ [Analyze]    ✗ worker crashed
▸ Lease expired · reclaiming...
▸ [Analyze]    ✓ resumed    890ms
▸ [Review]     ✓ completed  650ms
▸ [Synthesize] ✓ completed  1.1s
▸ Execution complete · 5/5 nodes · 0 events lost
View full example on GitHub →
pipeline.py Python · 12 lines
from jamjet import task, workflow

@task
async def analyze(data: dict) -> dict:
    # your logic here — crash-safe by default
    return {"summary": llm.call(data)}

@workflow
async def pipeline():
    raw  = await fetch_data()
    out  = await analyze(raw)
    return out

12 lines of Python. Crash-safe by default.

Production patterns

Click any card to expand the code.

Investment Due Diligence

Multi-agent pipeline: market analyst, financial reviewer, risk assessor, and compliance checker collaborate on investment reports.

multi-agenta2adurable
due-diligence.py View on GitHub →
@task(model="claude-sonnet-4-6", tools=[market_data, sec_filings])
async def analyze_company(ticker: str) -> Report:
    """Deep financial analysis with risk assessment."""

RAG Assistant

Retrieval-augmented agent that searches, retrieves, and synthesizes — with every step checkpointed.

ragtoolsdurable
rag-agent.py View on GitHub →
@task(tools=[search, retrieve, summarize])
async def answer(question: str) -> str:
    """Search knowledge base, retrieve docs, synthesize answer."""

Human Approval Workflow

Durable suspension at approval checkpoints. The process sleeps until a human responds — survives restarts.

hitldurableproduction
approval.py View on GitHub →
@workflow.step(type="human_approval")
async def approve(state):
    return await state.wait_for_approval()

MCP Tool Integration

Connect to any MCP server. Your agent's tool calls are durable workflow steps — crash-safe by default.

mcptoolsinterop
mcp-agent.py View on GitHub →
@task(tools=[web_search, calculator], strategy="react")
async def research(q: str) -> str:
    """Research with MCP tools, crash-safe."""

Agent-to-Agent Delegation

Route tasks to specialized agents via A2A protocol. Identity-aware, cost-aware, fully durable.

a2aroutingproduction
delegation.py View on GitHub →
card = await discover("/.well-known/agent.json")
result = await delegate(card, task="analyze report")
Open source — Apache 2.0
pip install jamjet