AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
Project description
AbstractRuntime
AbstractRuntime is a durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
Version: 0.4.3 (see pyproject.toml) • Python: 3.10+
Status: pre-1.0 (API may evolve). For production use, pin versions and follow CHANGELOG.md.
AbstractFramework ecosystem
AbstractRuntime is one component of the wider AbstractFramework ecosystem:
- AbstractRuntime (this repo) — durable workflow kernel (
src/abstractruntime/core/*) - AbstractCore — LLM + tools integration (wired via
src/abstractruntime/integrations/abstractcore/*)
Repo: lpalbou/abstractcore
At a high level, hosts define workflow graphs (WorkflowSpec) and AbstractRuntime executes them durably. When nodes request LLM/tool work (EffectType.LLM_CALL, EffectType.TOOL_CALLS), those effects are typically handled via AbstractCore.
flowchart LR
Host["Host app / orchestrator"] -->|"WorkflowSpec"| RT["AbstractRuntime"]
RT -->|"LLM_CALL / TOOL_CALLS"| AC["AbstractCore"]
AC -->|"results / waits"| RT
Install
Core runtime:
pip install abstractruntime
AbstractCore integration (LLM + tools):
pip install "abstractruntime[abstractcore]"
The abstractcore extra installs AbstractCore 2.13.5 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, and current tool catalog are available.
MCP worker entrypoint (default toolsets over stdio):
pip install "abstractruntime[mcp-worker]"
Quick start (pause + resume)
from abstractruntime import Effect, EffectType, Runtime, StepPlan, WorkflowSpec
from abstractruntime.storage import InMemoryLedgerStore, InMemoryRunStore
def ask(run, ctx):
return StepPlan(
node_id="ask",
effect=Effect(
type=EffectType.ASK_USER,
payload={"prompt": "Continue?"},
result_key="user_answer",
),
next_node="done",
)
def done(run, ctx):
answer = run.vars.get("user_answer") or {}
text = answer.get("text") if isinstance(answer, dict) else None
return StepPlan(node_id="done", complete_output={"answer": text})
wf = WorkflowSpec(workflow_id="demo", entry_node="ask", nodes={"ask": ask, "done": done})
rt = Runtime(run_store=InMemoryRunStore(), ledger_store=InMemoryLedgerStore())
run_id = rt.start(workflow=wf)
state = rt.tick(workflow=wf, run_id=run_id)
assert state.status.value == "waiting"
state = rt.resume(
workflow=wf,
run_id=run_id,
wait_key=state.waiting.wait_key,
payload={"text": "yes"},
)
assert state.status.value == "completed"
What’s included (v0.4.3)
Kernel (dependency-light):
- workflow graphs:
WorkflowSpec(src/abstractruntime/core/spec.py) - durable execution:
Runtime.start/tick/resume(src/abstractruntime/core/runtime.py) - durable waits/events:
WAIT_EVENT,WAIT_UNTIL,ASK_USER,EMIT_EVENT - append-only ledger (
StepRecord) + node traces (vars["_runtime"]["node_traces"]) - retries/idempotency hooks:
src/abstractruntime/core/policy.py - runtime-aware limits (
_limits) with a default iteration budget of 50 (docs/limits.md)
Durability + storage:
- stores: in-memory, JSON/JSONL, SQLite (
src/abstractruntime/storage/*) - durable command inbox primitives (idempotent, append-only):
CommandStore,CommandCursorStore(src/abstractruntime/storage/commands.py,src/abstractruntime/storage/sqlite.py) - artifacts + offloading (store large payloads by reference)
- snapshots/bookmarks (
docs/snapshots.md) - tamper-evident hash-chained ledger (
docs/provenance.md)
Drivers + distribution:
- scheduler:
create_scheduled_runtime()(src/abstractruntime/scheduler/*) - VisualFlow compiler + WorkflowBundles (
src/abstractruntime/visualflow_compiler/*,src/abstractruntime/workflow_bundle/*) - VisualFlow multi-entry execution lowering for fan-in routes and per-entry input overrides (
docs/workflow-bundles.md) - run history export:
export_run_history_bundle(...)(src/abstractruntime/history_bundle.py)
Optional integrations:
- AbstractCore (LLM + tools, prompt cache, tool approval waits):
docs/integrations/abstractcore.md - comms toolset gating (email/WhatsApp/Telegram):
docs/tools-comms.md
Built-in scheduler (zero-config)
from abstractruntime import create_scheduled_runtime
sr = create_scheduled_runtime()
run_id, state = sr.run(my_workflow)
if state.status.value == "waiting":
state = sr.respond(run_id, {"text": "yes"})
sr.stop()
For persistent storage:
from abstractruntime import create_scheduled_runtime, JsonFileRunStore, JsonlLedgerStore
sr = create_scheduled_runtime(
run_store=JsonFileRunStore("./data"),
ledger_store=JsonlLedgerStore("./data"),
)
Documentation
| Document | Description |
|---|---|
| Getting Started | Install + first durable workflow |
| API Reference | Public API surface (imports + pointers) |
| Docs Index | Full docs map (guides + reference) |
| FAQ | Common questions and gotchas |
| Architecture | Component map + diagrams |
| Overview | Design goals, core concepts, and scope |
| Integrations | Integration guides (AbstractCore) |
| Snapshots | Named checkpoints for run state |
| Provenance | Tamper-evident ledger documentation |
| Evidence | Artifact-backed evidence capture for web/command tools |
| Limits | _limits namespace and RuntimeConfig |
| WorkflowBundles | .flow bundle format (VisualFlow distribution) |
| MCP Worker | abstractruntime-mcp-worker CLI |
| Changelog | Release notes |
| Contributing | How to build/test and submit changes |
| Security | Responsible vulnerability reporting |
| Acknowledgments | Credits |
| ROADMAP | Prioritized next steps |
Development
python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install -e ".[abstractcore,mcp-worker,test,docs]"
python -m pytest -q
See CONTRIBUTING.md for contribution guidelines and doc conventions.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file abstractruntime-0.4.3.tar.gz.
File metadata
- Download URL: abstractruntime-0.4.3.tar.gz
- Upload date:
- Size: 489.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
344427272e5a0849457d05a6c1e7026f88af3453f920c657840e65add75c25ab
|
|
| MD5 |
19d8b44c14fe50229540b8e66f0fecea
|
|
| BLAKE2b-256 |
2c8aa32142c59cc41e7a1da8c5adb15697b0571e7583e895681bd9240f294ae6
|
Provenance
The following attestation bundles were made for abstractruntime-0.4.3.tar.gz:
Publisher:
release.yml on lpalbou/AbstractRuntime
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
abstractruntime-0.4.3.tar.gz -
Subject digest:
344427272e5a0849457d05a6c1e7026f88af3453f920c657840e65add75c25ab - Sigstore transparency entry: 1454055376
- Sigstore integration time:
-
Permalink:
lpalbou/AbstractRuntime@84e4411ac225a2b9c89de0c84c43633a40250e7c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lpalbou
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84e4411ac225a2b9c89de0c84c43633a40250e7c -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file abstractruntime-0.4.3-py3-none-any.whl.
File metadata
- Download URL: abstractruntime-0.4.3-py3-none-any.whl
- Upload date:
- Size: 346.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f0dae329d89f124ff94e93948d4b321bda085cc17133a11766b26d603d624b6
|
|
| MD5 |
b6000ff7c003215f1eb8db0160e72a4d
|
|
| BLAKE2b-256 |
0f51ac4d0dccb0b7b954e311c935c6b4482ec79a2537f1bce7ba4a014ecffc57
|
Provenance
The following attestation bundles were made for abstractruntime-0.4.3-py3-none-any.whl:
Publisher:
release.yml on lpalbou/AbstractRuntime
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
abstractruntime-0.4.3-py3-none-any.whl -
Subject digest:
9f0dae329d89f124ff94e93948d4b321bda085cc17133a11766b26d603d624b6 - Sigstore transparency entry: 1454055535
- Sigstore integration time:
-
Permalink:
lpalbou/AbstractRuntime@84e4411ac225a2b9c89de0c84c43633a40250e7c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lpalbou
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84e4411ac225a2b9c89de0c84c43633a40250e7c -
Trigger Event:
workflow_dispatch
-
Statement type: