Skip to main content

Common Agent Runtime — Python bindings for deterministic AI agent execution

Project description

car-runtime (Python)

Python bindings for Common Agent Runtime (CAR) — a deterministic execution layer for AI agents. Models propose; the runtime validates and executes.

As of v0.8, this package is a thin daemon client: every method proxies to a singleton car-server daemon over WebSocket. Inference, the per-session memory graph, and tool dispatch all live on the daemon side. Start car-server once per host before using the bindings (car-server ships in the same wheel; see "Start the daemon" below).

Pre-built wheels (abi3, Python 3.9+) for:

  • macosx_15_0_arm64, macosx_15_0_x86_64 — macOS 15+ required
  • manylinux_2_17_x86_64, manylinux_2_28_aarch64

Building from source on macOS: set MACOSX_DEPLOYMENT_TARGET=15.0 when invoking maturin build. MLX's bundled Metal shaders don't compile against the default 11.0 target, and our release wheels target 15.0 because the compiled extension pulls in libc++ symbols (notably std::exception_ptr::__from_native_exception_pointer) that only exist on macOS 15+. A lower target produces a wheel whose tag doesn't match what the binary actually requires at dlopen time.

Install

From a release wheel (substitute the current version for X.Y.Z):

pip install https://github.com/Parslee-ai/car/releases/download/vX.Y.Z/car_runtime-X.Y.Z-cp39-abi3-macosx_15_0_arm64.whl

Or build from source:

pip install maturin
cd car-rs/crates/car-ffi-pyo3
maturin develop --release

The import name is car_runtime (matching the PyPI package name).

Start the daemon

# The car-server binary ships inside the wheel. Default port 9100;
# auth on by default. Foreground (Ctrl-C to stop):
python -m car_runtime.server

# Or background:
python -m car_runtime.server &

# Override the URL the bindings use:
export CAR_DAEMON_URL=ws://127.0.0.1:9100

On macOS the SwiftUI menubar host (car-host) launches the daemon for you; install with car-host install so it comes up at login.

Quickstart

import json
from car_runtime import CarRuntime, verify

rt = CarRuntime()   # lazy-connects to ws://127.0.0.1:9100/

# Tools + policies — proxied to the daemon's per-session runtime
# and persist for the lifetime of this CarRuntime's WS connection.
rt.register_tool("shell")
rt.register_policy(
    "no_rm",
    "deny_tool_param",
    target="shell",
    key="command",
    pattern="rm -rf",
)

# Ground with facts (proxied to the daemon's per-session memgine).
rt.add_fact("project_language", "Python", "pattern")

# Static verification — runs on the daemon side, no model needed.
proposal = json.dumps({
    "actions": [{
        "id": "a1",
        "type": "tool_call",
        "tool": "shell",
        "parameters": {"command": "ls"},
        "dependencies": [],
    }],
})

check = json.loads(rt.verify_proposal(proposal))
if not check["valid"]:
    raise RuntimeError(f"invalid proposal: {check['issues']}")

# Proposal execution with a Python tool callback is not exposed on
# the PyO3 surface in v0.8 — connect to the daemon's WebSocket
# directly with `websockets` (or any WS library) and use:
#   - `proposal.submit` (your client → daemon)
#   - a `tools.execute` handler on the same connection (daemon → you)
# See docs/websocket-protocol.md and
# car-rs/examples/ws-client-python/ for a working sketch.

Streaming inference

from car_runtime import CarRuntime

rt = CarRuntime()

def on_event(event_json: str) -> None:
    e = json.loads(event_json)
    if e["type"] == "text":
        print(e["data"], end="", flush=True)

rt.infer_stream(
    "Explain CAR in one sentence.",
    on_event,
    max_tokens=256,
)

Multi-agent coordination

import json
from car_runtime import register_agent_runner, run_swarm

def agent_fn(spec_json: str, task: str) -> str:
    spec = json.loads(spec_json)
    # Call your LLM of choice, returning an AgentOutput JSON.
    return json.dumps({"name": spec["name"], "response": "...", "tool_calls": []})

# Option A: register once, then call run_* without passing agent_fn each time.
register_agent_runner(agent_fn)
result = run_swarm(
    "parallel",
    json.dumps([
        {"name": "researcher", "role": "gather facts", "model": "gpt-5"},
        {"name": "writer",     "role": "compose summary", "model": "claude-opus-4-7"},
    ]),
    "summarize the CAR paper",
)

# Option B: pass agent_fn per call.
result = run_swarm("parallel", agents_json, task, agent_fn=agent_fn)

API surface

The runtime (CarRuntime) exposes:

  • State: state_set, state_get, state_exists, state_snapshot, state_keys
  • Memory: add_fact, query_facts, fact_count, build_context, build_context_fast, persist_memory, load_memory, consolidate
  • Skills: ingest_skill, find_skill, report_outcome, distill_skills, ingest_distilled_skills, list_skills, domains_needing_evolution, repair_skill, evolve_skills
  • Tools + policies: register_tool, register_agent_basics, register_policy, set_replan_config
  • Inference: infer, infer_tracked, infer_with_context, infer_with_context_tracked, embed, rerank, classify, prepare_speech_runtime, transcribe, synthesize, infer_stream
  • Models: list_models, pull_model, remove_model, list_models_unified, register_model, route_model, model_stats
  • Execution: event_count, verify_proposal, execute_proposal

Module-level standalone functions:

  • Verification: verify, simulate, optimize, equivalent
  • Stateless execute: execute (creates a fresh Runtime; for long-lived use, prefer CarRuntime.execute_proposal)
  • Multi-agent: register_agent_runner, run_swarm, run_pipeline, run_supervisor, run_map_reduce, run_vote
  • Scheduler: create_task, run_task, run_task_loop, ensure_dream_task
  • Planner: rank_proposals

Structured returns are JSON-encoded strings — json.loads them on the Python side. This keeps the FFI surface stable across binding and protocol changes.

Type stubs

The wheel ships car_runtime.pyi alongside the compiled extension and a py.typed marker (PEP 561). mypy, pyright, Pylance, and similar tools pick up the full method signatures, parameter docstrings, and return-shape descriptions automatically — no extra install needed.

If you're editing the source tree (not the published wheel), the same files live at crates/car-ffi-pyo3/car_runtime.pyi and must be kept in sync with src/lib.rs. See CLAUDE.md for the FFI-bindings parity rule.

Development

# Install dev deps.
pip install maturin pytest

# Build and install in editable mode.
cd car-rs/crates/car-ffi-pyo3
maturin develop

# Run the smoke tests.
pytest tests/ -v

Architecture

This package is a thin PyO3 client to the singleton car-server daemon over WebSocket — CarRuntime() lazy-connects, every method proxies through the JSON-RPC dispatcher, and the daemon owns inference / memory / tool dispatch / per-session state.

Pre-v0.8 (the RuntimeMode::Embedded path) the wheel hosted an in-process car-engine + car-memgine and ran inference under py.allow_threads(...). That path was retired to close the multi-tenant overcommit hazard CAR-issue #139 was opened for — two FFI consumers in different processes each spawned a fresh admission semaphore + model cache, and concurrent runs could overwhelm the host. v0.8 takes the harder path: one daemon per host, every client attaches.

See the repo README for the broader CAR architecture and docs/proposals/daemon-as-default-runtime.md for the v0.8 rationale.

License

Free for any use including commercial; free to redistribute unmodified. Modification, reverse engineering, and derivative works are not permitted. See LICENSE for the full text. Copyright © 2026 Parslee AI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

car_runtime-0.8.1-cp39-abi3-win_amd64.whl (24.3 MB view details)

Uploaded CPython 3.9+Windows x86-64

car_runtime-0.8.1-cp39-abi3-manylinux_2_28_x86_64.whl (28.7 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

car_runtime-0.8.1-cp39-abi3-macosx_15_0_x86_64.whl (24.2 MB view details)

Uploaded CPython 3.9+macOS 15.0+ x86-64

car_runtime-0.8.1-cp39-abi3-macosx_15_0_arm64.whl (22.6 MB view details)

Uploaded CPython 3.9+macOS 15.0+ ARM64

File details

Details for the file car_runtime-0.8.1-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: car_runtime-0.8.1-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 24.3 MB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for car_runtime-0.8.1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 fc98d58b1851d3cd783dc8004605e1aae707d3d5840defad8bf7511865f5e1fa
MD5 6ecb7747497dd21ed0a6904626abbfa8
BLAKE2b-256 aaff52f349d29acb988d8d2faf0804b8eddf68eff32df8b428e090784b4764af

See more details on using hashes here.

Provenance

The following attestation bundles were made for car_runtime-0.8.1-cp39-abi3-win_amd64.whl:

Publisher: build.yml on Parslee-ai/car

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

File details

Details for the file car_runtime-0.8.1-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for car_runtime-0.8.1-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fca8b17aae49fbd89c8347b52ba57ac81858b55d9e62372e8c401fc76610540d
MD5 91f0debc0ecb94b40741ff5ff0f1895d
BLAKE2b-256 ead3266991b448bcf940073ef3d506cd8c5cf3ee9b8338164de94549ef3d1a47

See more details on using hashes here.

Provenance

The following attestation bundles were made for car_runtime-0.8.1-cp39-abi3-manylinux_2_28_x86_64.whl:

Publisher: build.yml on Parslee-ai/car

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

File details

Details for the file car_runtime-0.8.1-cp39-abi3-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for car_runtime-0.8.1-cp39-abi3-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 c78c1de8af45ecb654739c50669edb9eac3aef7103a4743f055a81f9fd4c32cf
MD5 5ede77c0119d55265e0275f5dcebec8f
BLAKE2b-256 b09de5f9e4b4e678377094605b6472e777f703c67acb441d1ebac223336a255e

See more details on using hashes here.

Provenance

The following attestation bundles were made for car_runtime-0.8.1-cp39-abi3-macosx_15_0_x86_64.whl:

Publisher: build.yml on Parslee-ai/car

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

File details

Details for the file car_runtime-0.8.1-cp39-abi3-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for car_runtime-0.8.1-cp39-abi3-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 12b9f5d548b81201bd8cb94b5a6d06dc4efa74da7a11dc1989c5065839f100fb
MD5 4eaaaf1477c7c4d66d0e1be92e790f77
BLAKE2b-256 2755e6957691b099ef6787e3f8dbe69c7d6b91994a696d279e3a1910fea4daa7

See more details on using hashes here.

Provenance

The following attestation bundles were made for car_runtime-0.8.1-cp39-abi3-macosx_15_0_arm64.whl:

Publisher: build.yml on Parslee-ai/car

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