Skip to main content

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.yml for provider config, policies, contracts, and defaults
  • agents/ for agent definitions
  • pipelines/ for DAG workflows
  • .zymi/events.db for the append-only event log
  • output/ and memory/ 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:

  1. Every meaningful state change becomes an event. The SQLite event store is the source of truth.
  2. Agents express intentions, not side effects. Intentions are evaluated against boundary contracts before execution.
  3. Pipelines are DAGs. Independent steps can run in parallel, while dependencies remain explicit.
  4. 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


Download files

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

Source Distribution

zymi_core-0.1.1.tar.gz (110.1 kB view details)

Uploaded Source

Built Distributions

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

zymi_core-0.1.1-cp311-cp311-win_amd64.whl (3.9 MB view details)

Uploaded CPython 3.11Windows x86-64

zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl (3.5 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

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

Hashes for zymi_core-0.1.1.tar.gz
Algorithm Hash digest
SHA256 07ebdab24ffdc8ebdaac48bb101c5aff28d2eff7914592fab0a59721c4da73ed
MD5 9dc8eed12ee407f7d4c7ff8c1bdaffa6
BLAKE2b-256 97a839626bb69aede2a934b13de578829e1789d8093388b2b62c0f746fcd9a93

See more details on using hashes here.

Provenance

The following attestation bundles were made for zymi_core-0.1.1.tar.gz:

Publisher: release.yml on metravod/zymi-core

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

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

Hashes for zymi_core-0.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f9b199645b65217c89355bad63772d455005c4939ee0b10da6e9b56bac0cdf85
MD5 6cd0d2b65083ce5a61d941379f013f5d
BLAKE2b-256 53f9cc96a496b7d57bdd5c80d91a3d9e52dcd9a5292268dfd7b6e7587d88108a

See more details on using hashes here.

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

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

File details

Details for the file zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zymi_core-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6f8e8a6ba0c5e3dab0135ed90b8ba39546f967153875d6bee7e72e451c50d65d
MD5 34382ada3c88333c87fe4b79842790c9
BLAKE2b-256 50e1344bd0ce086cb33d56287bece2009f58c2f73327cf0b4935ebb82835aa5f

See more details on using hashes here.

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

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

File details

Details for the file zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zymi_core-0.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 199276e38476e379fd9b6005a7964fe22d16aa06813ad3f2ff42b406ad8f4233
MD5 50eef978496122d6a1334fac2f0cb4ee
BLAKE2b-256 4d324e7392252922a31f2bae073657209d235bc6547a4d7c6df126a1931611ed

See more details on using hashes here.

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

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

File details

Details for the file zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zymi_core-0.1.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1ede94998843ac39dcf3baa8dbfdd0d21d575fd1c8eaec107cd3b144846e8b9c
MD5 01c7a4e40828bcaa7660c7a388ab089e
BLAKE2b-256 196295d7e4bbee612117163f57a8421c3b5650e2ef12f44340fc29ef44e62af2

See more details on using hashes here.

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

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

File details

Details for the file zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zymi_core-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 00efd6f3c755108cee28a07a20e003e4bfe73123db54782385cf77290e33512c
MD5 953b5bd726d752de04535e35284ab2d6
BLAKE2b-256 13dd21e5c85691fb3275447eed6b21be9c124080af7edb9ff86c7e9ad89deffa

See more details on using hashes here.

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

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