Skip to main content

JamJet Python SDK — agent-native workflow authoring and CLI

Project description

JamJet

The agent-native runtime — built for performance, designed for interoperability, reliable enough for production.

CI PyPI License Python Docs

JamJet demo

JamJet is a performance-first, agent-native runtime and framework for building reliable, interoperable AI agent systems. It is not another prompt wrapper or thin agent SDK — it is a production-grade orchestration substrate for agents that need to work, not just demo.


Why JamJet?

Problem JamJet's answer
Fragile agent runs that lose state on crash Durable graph execution with event sourcing and crash recovery
No way to pause for human approval Human-in-the-loop as a first-class workflow primitive
Agents siloed in their own framework Native MCP + A2A — interoperate with any agent, any framework
Slow Python orchestration at scale Rust core for scheduling, state, concurrency; Python for authoring
Weak observability, no replay Full event timeline, replay from any checkpoint
No standard agent identity Agent Cards — every agent is addressable, discoverable, composable
Inconsistent tool contracts Typed schemas everywhere — Pydantic, TypedDict, JSON Schema

How JamJet compares

As of March 2026. All frameworks evolve quickly — check their docs for the latest.

Capability JamJet LangChain AutoGen CrewAI BeeAI
Default model Agent-first + strategy Chain / LCEL Conversational agents Role-based crew Agent loop
Durable execution ✅ event-sourced; crash-safe resume ❌ ephemeral ❌ ephemeral ❌ ephemeral ❌ ephemeral
Human-in-the-loop ✅ first-class primitive 🟡 callback hooks 🟡 first-class for conversational flows 🟡 manual
MCP support ✅ client + server 🟡 client only 🟡 client only 🟡 client only 🟡 client only
A2A protocol ✅ client + server
Pluggable reasoning strategies ✅ react, plan-and-execute, critic, reflection, consensus, debate ❌ manual wiring 🟡 user-built 🟡 role-based tasks 🟡 user-built
Enforced cost/iteration limits ✅ compile-time guards 🟡 partial 🟡 partial
Typed state schemas ✅ Pydantic / TypedDict / JSON Schema 🟡 optional 🟡 optional 🟡 partial 🟡 partial
Built-in observability ✅ OTel GenAI, full event timeline, replay 🟡 LangSmith (external)
Agent identity + discovery ✅ Agent Cards, A2A discovery 🟡 framework-level discovery
Runtime language Rust core + Python authoring Python Python Python TypeScript
Scheduler / throughput ✅ Rust async scheduler; low-overhead worker pool 🟡 Python asyncio; GIL-bound 🟡 Python asyncio; message-passing overhead 🟡 Python; sequential by default 🟡 Node.js event loop
Deployment model Long-running server (local or cloud) Library (in-process) Library (in-process) Library (in-process) Library (in-process)
Best for Production multi-agent systems needing durability and interop Rapid prototyping, LLM chains Conversational multi-agent apps Role-based collab agents TypeScript agentic apps

Key Features

Durable graph workflows — every step is checkpointed; crash the runtime and execution resumes exactly where it left off.

Native MCP + A2A — connect to any MCP server, expose your tools as an MCP server, delegate to or serve external agents via A2A.

Agent-native identity — every agent has a URI, an Agent Card describing its capabilities, and a managed lifecycle.

Human-in-the-loop — pause any workflow for human approval or input as a first-class primitive.

Configurable autonomy — from strict deterministic graph execution to bounded autonomous agents operating within defined budgets.

Typed schemas everywhere — Pydantic, TypedDict, JSON Schema. No stringly-typed state.

Distributed workers — horizontal scale with lease semantics, retry policies, and queue isolation by workload type.

Python-friendly authoring — define workflows with Python decorators or YAML; both compile to the same runtime graph.


Quick Start

Requirements: Python 3.11+

# Install the CLI (runtime binary included)
pip install jamjet

# Option A — scaffold a new project
jamjet init my-agent-project
cd my-agent-project

# Option B — add JamJet to an existing project (works like git init)
cd my-existing-project
jamjet init

# Start local dev runtime (SQLite, embedded — no server setup needed)
jamjet dev

In another terminal:

# Run the example workflow
jamjet run examples/basic_tool_flow

Hello World — Python

from jamjet import Workflow, tool
from pydantic import BaseModel

class SearchResult(BaseModel):
    summary: str
    sources: list[str]

@tool
async def web_search(query: str) -> SearchResult:
    # your implementation here
    ...

workflow = Workflow("research")

@workflow.state
class ResearchState(BaseModel):
    question: str
    result: SearchResult | None = None

@workflow.step
async def search(state: ResearchState) -> ResearchState:
    result = await web_search(query=state.question)
    return state.model_copy(update={"result": result})

@workflow.step
async def summarize(state: ResearchState) -> ResearchState:
    # model call here
    ...

Hello World — YAML

# workflow.yaml
workflow:
  id: research
  version: 0.1.0
  state_schema: schemas.ResearchState
  start: search

nodes:
  search:
    type: tool
    tool_ref: tools.web_search
    input:
      query: "{{ state.question }}"
    output_schema: schemas.SearchResult
    next: summarize

  summarize:
    type: model
    model: default_chat
    prompt: prompts/summarize.md
    output_schema: schemas.Summary
    next: end
jamjet validate workflow.yaml
jamjet run workflow.yaml --input '{"question": "What is JamJet?"}'

Connecting to an MCP Server

# agents.yaml
agents:
  researcher:
    model: default_chat
    mcp:
      servers:
        github:
          transport: http_sse
          url: https://mcp.github.com/v1
          auth:
            type: bearer
            token_env: GITHUB_TOKEN
# workflow.yaml (node using MCP tool)
nodes:
  search_github:
    type: mcp_tool
    server: github
    tool: search_code
    input:
      query: "{{ state.search_query }}"
    output_schema: schemas.SearchResults
    retry_policy: io_default

Delegating to an External Agent via A2A

nodes:
  code_review:
    type: a2a_task
    remote_agent: partner_reviewer   # defined in agents.yaml
    skill: security_review
    input:
      code: "{{ state.generated_code }}"
    stream: true
    timeout: 300s
    on_input_required: human_review

Architecture

┌──────────────────────────────────────────────────────────┐
│                     Authoring Layer                       │
│              Python SDK  |  YAML  |  CLI                  │
├──────────────────────────────────────────────────────────┤
│                 Compilation / Validation                   │
│         Graph IR  |  Schema  |  Policy lint               │
├────────────────────────────┬─────────────────────────────┤
│      Rust Runtime Core     │      Protocol Layer          │
│  Scheduler  |  State SM    │  MCP Client  |  MCP Server   │
│  Event log  |  Snapshots   │  A2A Client  |  A2A Server   │
│  Workers    |  Timers      │  Protocol Adapter Framework  │
├────────────────────────────┴─────────────────────────────┤
│                      Runtime Services                      │
│  Model Adapters  |  Tool Execution  |  Memory/Retrieval   │
│  Policy Engine   |  Observability   |  Secret Management  │
├──────────────────────────────────────────────────────────┤
│                    Control Plane / APIs                    │
│        REST / gRPC  |  Agent Registry  |  Admin           │
├──────────────────────────────────────────────────────────┤
│                         Storage                           │
│           Postgres (production)  |  SQLite (local)        │
└──────────────────────────────────────────────────────────┘

Read more: Architecture Overview


Documentation

Start here

Guide Description
Quickstart Get a workflow running in 10 minutes
Core Concepts Agents, workflows, nodes, state, durability
Workflow Authoring YAML and Python authoring guide
Python SDK Full SDK reference
YAML Reference Complete YAML spec

Connect to other systems

Guide Description
MCP Integration Connect to MCP servers, expose tools
A2A Integration Delegate to and serve external agents
Agent Model Agent Cards, lifecycle, autonomy levels
Human-in-the-Loop Approval nodes, state editing, audit
Observability Traces, replay, cost attribution, OTel GenAI
Deployment Production deployment guide

Advanced & enterprise

Guide Description
Security Auth, secrets, RBAC, OAuth delegated agent auth
WASI Sandboxing Sandboxed tool execution via Wasmtime
Eval Node Evaluation as a workflow primitive
ANP Discovery Decentralized agent discovery via DID

Architecture deep-dives

Document Description
Architecture Overview Full system architecture
Execution Model State machine, node types, IR
State & Durability Event sourcing, snapshotting, recovery
Agent Model Agent-native runtime design
MCP Architecture MCP client/server internals
A2A Architecture A2A protocol internals
Protocol Adapters Extensible protocol layer

Roadmap

Phase Status Goal
0 — Architecture & RFCs In progress Design docs, RFCs, scaffolding
1 — Minimal Viable Runtime Planned Local durable execution, MCP client, agent cards
2 — Production Core Planned Distributed workers, MCP server, full A2A
3 — Developer Delight Planned Templates, eval harness, trace debugging
4 — Enterprise Planned Policy engine, tenant isolation, federation security
5 — Scale & Ecosystem Planned Go SDK, TypeScript SDK, hosted plane, agent marketplace

Track milestone progress in GitHub Issues and the project board.


Contributing

We welcome contributions of all kinds — bug reports, feature requests, documentation, and code.


Community


License

Apache 2.0 — see LICENSE.

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

jamjet-0.2.0.tar.gz (106.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jamjet-0.2.0-py3-none-any.whl (63.1 kB view details)

Uploaded Python 3

File details

Details for the file jamjet-0.2.0.tar.gz.

File metadata

  • Download URL: jamjet-0.2.0.tar.gz
  • Upload date:
  • Size: 106.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for jamjet-0.2.0.tar.gz
Algorithm Hash digest
SHA256 09f004ba07943741e5c83fe0fa0b53739d574708cabc5a8f9dab7b14043bb27d
MD5 0184584e90b90d301a95eb01cf571eee
BLAKE2b-256 648ce21a27194711fdeac9b4f8a5155cf9c0007f7eaf818c8e7ef69789d69874

See more details on using hashes here.

Provenance

The following attestation bundles were made for jamjet-0.2.0.tar.gz:

Publisher: release-wheels.yml on jamjet-labs/jamjet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file jamjet-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: jamjet-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 63.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for jamjet-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 26fc86c8ff46babce3a02c2d449c8f2c84fa40000c2df47e3c5681ace07f94d9
MD5 0b6d5ba22cde86acd79a2d8712ea356a
BLAKE2b-256 c615c111b784d44e83d3228969b8020204dfa73b532a6f7c2900950a604990d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for jamjet-0.2.0-py3-none-any.whl:

Publisher: release-wheels.yml on jamjet-labs/jamjet

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