Event-sourced agent engine — CLI and Python bindings for auditable AI workflows
Project description
zymi-core
Event-sourced agent engine for auditable AI workflows in Rust, YAML, and Python.
zymi-core helps you build agent workflows you can inspect after the fact. Every run is recorded as an immutable event stream in SQLite, agent side effects are mediated through intentions and boundary contracts, and pipelines execute as DAGs with parallel steps when possible.
Highlights
- Auditable by default: every state change is persisted as an event with hash-chain verification.
- Safer side effects: agents emit intentions first; contracts and approvals decide what is allowed to execute.
- Practical workflows: define agents and DAG pipelines in YAML, then run them from a small CLI.
- Flexible integration points: use the Rust crate, Python bindings, or both.
- LLM-provider ready: OpenAI-compatible providers, Anthropic support, Python tools, and LangFuse event services.
Installation
| If you want to... | Install with... |
|---|---|
| CLI + Python bindings | pip install zymi-core |
| Rust crate only | zymi-core = "0.1" |
pip install zymi-core gives you both the zymi CLI command and the zymi_core Python module.
Quick Start
# Install
pip install zymi-core
# Create a demo project
mkdir zymi-demo
cd zymi-demo
zymi init --example research
# Add your LLM provider config to project.yml, then run the pipeline
zymi run research -i topic="event sourcing"
# Inspect what happened
zymi events --limit 20
zymi verify
For example, this is enough to get started with OpenAI:
llm:
provider: openai
model: gpt-4o
api_key: ${env.OPENAI_API_KEY}
What this gives you:
project.ymlfor provider config, policies, contracts, and defaultsagents/for agent definitionspipelines/for DAG workflows.zymi/events.dbfor the append-only event logoutput/andmemory/directories in the research example
Common CLI commands
zymi init --name my-project
zymi init --example research
zymi run main -i task="Summarize the architecture"
zymi run research -i topic="Rust event sourcing"
zymi events
zymi events --stream conversation-1
zymi events --kind LlmCallCompleted --json
zymi replay conversation-1 --from 1
zymi verify
zymi verify --stream conversation-1
Project Layout
A zymi project is just a directory with YAML files:
my-project/
project.yml
agents/
default.yml
pipelines/
main.yml
.zymi/
events.db
The default scaffold created by zymi init is intentionally small:
# project.yml
name: my-project
version: "0.1"
defaults:
timeout_secs: 30
max_iterations: 10
policy:
enabled: true
allow: ["ls *", "cat *", "echo *"]
deny: ["rm -rf *"]
# agents/default.yml
name: default
description: "Default agent"
tools:
- web_search
- read_file
- write_memory
max_iterations: 10
# pipelines/main.yml
name: main
steps:
- id: process
agent: default
task: "${inputs.task}"
input:
type: text
output:
step: process
Python Bindings
The same pip install zymi-core that gives you the CLI also exposes Event, EventBus, EventStore, Subscription, and ToolRegistry for programmatic use.
from zymi_core import ToolRegistry
registry = ToolRegistry()
@registry.tool
def search(query: str) -> str:
return f"Results for: {query}"
result = registry.call("search", '{"query":"rust async"}')
intention_json = registry.to_intention("search", '{"query":"rust async"}')
definitions = registry.definitions()
For lower-level event primitives the same package gives you the event store and bus directly:
from zymi_core import Event, EventBus, EventStore
store = EventStore("./events.db")
bus = EventBus(store)
subscription = bus.subscribe()
event = Event(
stream_id="conversation-1",
kind={"type": "UserMessageReceived", "data": {
"content": {"User": "Hello"},
"connector": "python",
}},
source="python",
)
bus.publish(event)
received = subscription.try_recv()
Rust Crate
Add the crate to your Cargo.toml:
[dependencies]
zymi-core = "0.1"
Example:
use std::sync::Arc;
use zymi_core::{Event, EventBus, EventKind, Message, SqliteEventStore};
let store = Arc::new(SqliteEventStore::new("events.db")?);
let bus = EventBus::new(store.clone());
let mut rx = bus.subscribe().await;
let event = Event::new(
"conversation-1".into(),
EventKind::UserMessageReceived {
content: Message::User("Hello".into()),
connector: "cli".into(),
},
"cli".into(),
);
bus.publish(event).await?;
let received = rx.recv().await.unwrap();
assert_eq!(received.kind_tag(), "user_message_received");
let verified_count = store.verify_chain("conversation-1").await?;
How It Works
zymi-core is built around a small set of ideas:
- Every meaningful state change becomes an event. The SQLite event store is the source of truth.
- Agents express intentions, not side effects. Intentions are evaluated against boundary contracts before execution.
- Pipelines are DAGs. Independent steps can run in parallel, while dependencies remain explicit.
- Runs stay replayable. You can inspect events, replay streams, and verify hash-chain integrity later.
Core intention types include ExecuteShellCommand, WriteFile, ReadFile, WebSearch, WebScrape, WriteMemory, SpawnSubAgent, and CallCustomTool.
Feature Flags (Rust crate)
The pip wheel ships with python and cli enabled. These flags are relevant when depending on the Rust crate directly.
| Feature | Description |
|---|---|
python |
PyO3 bindings for the _zymi_core Python extension module |
cli |
The zymi CLI binary |
runtime |
Async runtime and HTTP dependencies used by runtime integrations |
webhook |
HTTP approval handler built on Axum |
services |
Event-bus services such as LangFuse |
Development
cargo test
cargo test --features services,webhook
cargo clippy -- -D warnings
cargo clippy --features services -- -D warnings
maturin develop --features python,cli
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 zymi_core-0.1.1.tar.gz.
File metadata
- Download URL: zymi_core-0.1.1.tar.gz
- Upload date:
- Size: 110.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07ebdab24ffdc8ebdaac48bb101c5aff28d2eff7914592fab0a59721c4da73ed
|
|
| MD5 |
9dc8eed12ee407f7d4c7ff8c1bdaffa6
|
|
| BLAKE2b-256 |
97a839626bb69aede2a934b13de578829e1789d8093388b2b62c0f746fcd9a93
|
Provenance
The following attestation bundles were made for zymi_core-0.1.1.tar.gz:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.1.1.tar.gz -
Subject digest:
07ebdab24ffdc8ebdaac48bb101c5aff28d2eff7914592fab0a59721c4da73ed - Sigstore transparency entry: 1244126786
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.1.1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: zymi_core-0.1.1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9b199645b65217c89355bad63772d455005c4939ee0b10da6e9b56bac0cdf85
|
|
| MD5 |
6cd0d2b65083ce5a61d941379f013f5d
|
|
| BLAKE2b-256 |
53f9cc96a496b7d57bdd5c80d91a3d9e52dcd9a5292268dfd7b6e7587d88108a
|
Provenance
The following attestation bundles were made for zymi_core-0.1.1-cp311-cp311-win_amd64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.1.1-cp311-cp311-win_amd64.whl -
Subject digest:
f9b199645b65217c89355bad63772d455005c4939ee0b10da6e9b56bac0cdf85 - Sigstore transparency entry: 1244126841
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f8e8a6ba0c5e3dab0135ed90b8ba39546f967153875d6bee7e72e451c50d65d
|
|
| MD5 |
34382ada3c88333c87fe4b79842790c9
|
|
| BLAKE2b-256 |
50e1344bd0ce086cb33d56287bece2009f58c2f73327cf0b4935ebb82835aa5f
|
Provenance
The following attestation bundles were made for zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
6f8e8a6ba0c5e3dab0135ed90b8ba39546f967153875d6bee7e72e451c50d65d - Sigstore transparency entry: 1244126796
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.5 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
199276e38476e379fd9b6005a7964fe22d16aa06813ad3f2ff42b406ad8f4233
|
|
| MD5 |
50eef978496122d6a1334fac2f0cb4ee
|
|
| BLAKE2b-256 |
4d324e7392252922a31f2bae073657209d235bc6547a4d7c6df126a1931611ed
|
Provenance
The following attestation bundles were made for zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl -
Subject digest:
199276e38476e379fd9b6005a7964fe22d16aa06813ad3f2ff42b406ad8f4233 - Sigstore transparency entry: 1244126807
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.7 MB
- Tags: CPython 3.11, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ede94998843ac39dcf3baa8dbfdd0d21d575fd1c8eaec107cd3b144846e8b9c
|
|
| MD5 |
01c7a4e40828bcaa7660c7a388ab089e
|
|
| BLAKE2b-256 |
196295d7e4bbee612117163f57a8421c3b5650e2ef12f44340fc29ef44e62af2
|
Provenance
The following attestation bundles were made for zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl -
Subject digest:
1ede94998843ac39dcf3baa8dbfdd0d21d575fd1c8eaec107cd3b144846e8b9c - Sigstore transparency entry: 1244126817
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.8, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00efd6f3c755108cee28a07a20e003e4bfe73123db54782385cf77290e33512c
|
|
| MD5 |
953b5bd726d752de04535e35284ab2d6
|
|
| BLAKE2b-256 |
13dd21e5c85691fb3275447eed6b21be9c124080af7edb9ff86c7e9ad89deffa
|
Provenance
The following attestation bundles were made for zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
00efd6f3c755108cee28a07a20e003e4bfe73123db54782385cf77290e33512c - Sigstore transparency entry: 1244126826
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5300f9c93fdcb2d7884927788dca4c2b9a3536db -
Trigger Event:
push
-
Statement type: