Rust-based epistemic graph engine for agent-utilities
Project description
epistemic-graph
Unified Rust-Native Compute Engine for AI Agent Infrastructure
Consolidates graph operations, quantitative finance, data science, AST analysis, and OWL reasoning into a single high-performance binary.
Documentation — The architecture, service-mode operations, Rust compute reference, measured transport benchmarks, and concept registry for the engine are maintained in the official documentation.
This is the compute engine for
agent-utilities— a standalone Rust service reached out-of-process over MessagePack/UDS (no PyO3). You can use it on its own (binary + pure-Python client), or letagent-utilitiesdrive it. Contributing? See CONTRIBUTING.md.
Architecture
The epistemic-graph crate is the singular computation engine for the agent-utilities ecosystem. All high-performance operations route through this crate, exposed to Python out-of-process over a long-running Tokio service speaking length-prefixed MessagePack over Unix Domain Sockets (default) or TCP, authenticated with HMAC-SHA256. There is no PyO3 / in-process FFI — the engine runs as a separate process (maturin ships it as bindings = "bin"), so callers cross a network boundary, not a function call. This is enforced by scripts/check_no_pyo3.sh.
┌──────────────────────────────────────────────────────────┐
│ epistemic-graph │
│ │
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌───────────┐ │
│ │ Graph │ │ Finance │ │ Data │ │ Reasoning │ │
│ │ Core │ │ Engine │ │ Science │ │ Engine │ │
│ │(petgraph)│ │ │ │ │ │ (Datalog) │ │
│ └─────────┘ └──────────┘ └─────────┘ └───────────┘ │
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ │
│ │ AST │ │ Semantic │ │ Algo │ │
│ │ Parser │ │ Store │ │ Library │ │
│ └─────────┘ └──────────┘ └─────────┘ │
│ │
│ ╔════════════════════════════════════════════════════╗ │
│ ║ Tokio Server (UDS/TCP + HMAC-SHA256 auth) ║ │
│ ╚════════════════════════════════════════════════════╝ │
│ ↕ length-prefixed MessagePack (UDS / TCP) │
│ ╔════════════════════════════════════════════════════╗ │
│ ║ Python: EpistemicGraph class ║ │
│ ╚════════════════════════════════════════════════════╝ │
└──────────────────────────────────────────────────────────┘
Features
Core Graph Engine (CONCEPT:KG-2.2)
- petgraph-backed: Native-compiled Rust graph structures
- Temporal Knowledge Graph (TKG): Ebbinghaus Forgetting Curve and fact decay natively integrated
- Topological Sort: Sub-millisecond DAG resolving
- DFS Cycle Detection: Returns precise cycle paths
- Shortest Path: Efficient unweighted BFS traversal
- Blast Radius: Transitive impact analysis to configurable depth
- PageRank & PPR: Centrality computation
- Community Detection: Louvain-style graph clustering
- VF2 Subgraph Isomorphism: Pattern matching queries
- Reactive State Ledger: Transaction log with replay for backend persistence
Finance Engine (CONCEPT:QF-1.0)
- Portfolio Optimization: Mean-variance (MVO), min-variance, risk-parity, efficient frontier
- Risk Metrics: VaR (historical + Monte Carlo), CVaR, Sortino, Calmar, max drawdown
- Regime Detection: Hidden Markov Model (Baum-Welch + Viterbi)
- Signal Generation: Rolling Z-score, EWMA, momentum, alpha combination, information coefficient
- Execution Algorithms: TWAP/VWAP scheduling, market impact estimation, LOB matching
- Pairs Trading: Spread signal generation and regime-aware position sizing
Data Science Engine (CONCEPT:DS-1.0)
- OLS Regression: Gradient descent with configurable learning rate and epochs
- K-Means Clustering: Parallel centroid computation
- PCA: Eigenvalue decomposition via power iteration
- Dataset Statistics: Mean, std, min, max, correlation matrix
- Estimators: ridge / lasso / elasticnet / decisiontree / randomforest / gradientboosting / adaboost / svr (replaces sklearn on the hot path)
- Training loss / optimizer kernels (CONCEPT:KG-2.22):
softmax/log_softmax,cross_entropy(+grad),dpo_loss(Bradley-Terry, +grads),grpo_surrogate(PPO clip, +grad),kl_divergence(Schulman k3),adam_step/sgd_step— the pure-Rust performance path for the in-house training substrate, mirroringdata-science-mcp trainers/objectives.py.client.datascience.{...}.
Reasoning Engine (CONCEPT:KG-2.23)
- Transitive/Symmetric Inference: Compiled Datalog closures
- Domain/Range Rules: OWL-style type inference
- Property Chain Composition: Multi-hop rule chaining
AST Parser
- Multi-Language: 9 languages via tree-sitter — Python, Rust, TypeScript, JavaScript, Go, Java, C, C++, C# (
src/parser/tree_sitter.rs::lang_for_path) - Full Granularity: Functions, classes, methods, imports stored as
Symbolnodes - Repository Ingestion: Directory walker with automatic graph population
Cargo Feature Flags
| Feature | Description | Dependencies |
|---|---|---|
ast |
Tree-sitter AST parser | tree-sitter, language grammars |
finance |
Quantitative finance engine | (pure Rust) |
datascience |
ML primitives | (pure Rust) |
reasoning |
OWL/Datalog reasoning | (pure Rust) |
compute |
All compute features | finance + datascience + reasoning |
server |
Tokio UDS/TCP server | tokio, hmac, rmp-serde |
full |
Everything | compute + server + ast |
all |
Alias for full |
(same as full) |
Build examples
# Library only (default, no server)
cargo build
# With compute modules
cargo build --features compute
# Full build including server binary
cargo build --features full
# Run all tests
cargo test --lib --features compute
Quickstart
1. Installation
uv pip install -e .
# or
pip install -e .
2. Python Usage
The client speaks to the out-of-process engine and exposes capabilities through
typed namespaces (g.nodes, g.edges, g.graph, g.finance, g.datascience,
g.reasoning, ...). Use SyncEpistemicGraphClient for blocking code or
EpistemicGraphClient for async.
from epistemic_graph import SyncEpistemicGraphClient
# Connect to the running engine (starts/attaches to the UDS service)
g = SyncEpistemicGraphClient()
# Graph operations
g.nodes.add("AgentA", {"type": "coordinator"})
g.nodes.add("AgentB", {"type": "worker"})
g.edges.add("AgentA", "AgentB", {"weight": 1.5})
print("Order:", g.graph.topological_sort())
print("Cycle:", g.graph.find_cycle())
# Finance — portfolio optimization
weights = g.finance.optimize_portfolio([0.1, 0.15, 0.08], [[0.04, 0.01, 0.005], ...], 0.02)
# Finance — risk metrics
metrics = g.finance.risk_metrics([0.01, -0.02, 0.03, -0.005, 0.02])
# Data Science — regression
coeffs = g.datascience.linear_regression([[1.0, 2.0], [3.0, 4.0]], [3.0, 7.0])
# Reasoning — OWL/RDFS forward chaining (CONCEPT:KG-2.17)
# Materialises inferred edges/types in-graph and returns the inferred triples.
result = g.reasoning.reason(
subclass_relations=[("Dog", "Animal")],
transitive_properties=["ancestor"],
)
print("Inferred:", result["inferred_count"], "triples")
Security: Authentication & Tenant Isolation
- Auth is mandatory. Every request carries an
HMAC-SHA256(secret, request_id)token. The server refuses to start with an empty secret — setGRAPH_SERVICE_AUTH_SECRET(or--auth-secret). To intentionally run unauthenticated (development only) pass--allow-insecureor setEPISTEMIC_GRAPH_ALLOW_INSECURE=1; the server then starts with a prominentSECURITY:warning naming the bind addresses. - ACLs are enforced in dispatch. Once any identity is registered
(
client.consensus.register_identity), every graph-targeted operation is checked by the isolation layer (src/isolation.rs): peer agent graphs are denied, managers reach subordinate graphs, team graphs are member-read / manager-write,global:graphs are read-only, and__commons__stays open to all authenticated agents. Callers identify themselves with the optionalagent_idfield (EpistemicGraphClient.connect(..., agent_id="worker1")). With zero registered identities nothing is checked — single-tenant deployments are unchanged. Violations returnACCESS_DENIED: ...errors. - TCP has no TLS. The optional TCP listener is plaintext; keep it on loopback or behind a TLS-terminating proxy / WireGuard / SSH tunnel.
See docs/service_mode.md for the full protocol, policy table, and examples.
Engine Internals
Capabilities living in the binary beyond the headline features:
- HNSW semantic store (
src/compute/semantic.rs) — per-graph embedding store with anhnsw_rsapproximate-nearest-neighbor index for O(log n) cosine search, falling back to brute force below 32 embeddings. Served over the protocol asAddEmbedding/SemanticSearch; search results are re-weighted by temporal confidence decay (Ebbinghaus) before ranking. - Lock-free heavy compute (CONCEPT:KG-2.51) — CPU-heavy read-only
operations (semantic search, PageRank, betweenness, community detection,
MST, similarity edges, VF2, lifecycle metrics) never run while holding the
per-graph lock: dispatch takes a cheap structural snapshot
(
GraphCore::topology_snapshot/analysis_snapshot) under the read lock and computes on the tokio blocking pool, so a large analytics request no longer stalls writers on that graph. Single-pass O(V+E) ops stay under-lock (a snapshot would cost as much as the computation). - Prometheus metrics (
src/metrics.rs, cargo featuremetrics, on by default; CONCEPT:KG-2.51) — per-op request counters + latency histograms, in-flight / admission-permit gauges, BUSY-rejection counter, per-graph op counters and node/edge gauges (bounded label cardinality), checkpoint duration/timestamp, and auth-failure / ACL-denial counters. Exposed by a dependency-free HTTP listener on--metrics-addr/GRAPH_SERVICE_METRICS_ADDR(disabled when unset; e.g.127.0.0.1:9101), entirely separate from the MessagePack RPC transports. - Parser symbol metadata (
src/parser/tree_sitter.rs) — beyond raw symbols, each parse extracts per-symbol metadata (name, kind, line, docstring, argument list) plus import edges, and stamps every symbol with a stable language label so the graph can answer per-language queries ("all Java symbols") and compute per-language metrics. - Spectral clustering (
src/compute/spectral.rs) — a normalized-Laplacian spectral cluster navigator. Source-only today: the module is not compiled into the crate (excluded fromcompute/mod.rs) and theSpectralClusterprotocol method returns a deprecation error pointing at thedatascienceprimitives (kmeans/pca). - Hypergraph interaction encoding (
src/compute/hypergraph.rs) — a seeded 2-layer MLP positional-interaction encoder with an encoder cache, used to embed (position, position) interactions into fixed-width vectors. Compiled, but itsHypergraphEncodeInteractionprotocol method is deprecated in favor of thedatascienceprimitives. - Execution orchestrator (
src/execution/orchestrator.rs) — scaffold for executing compiled task graphs (topological scheduling ofTaskGraphSpec). Not wired into the crate (noexecutionmodule inlib.rs); orchestration currently lives in agent-utilities, which compiles task graphs client-side.
Scaling & HA Reality
What the architecture does and does not give you (measured numbers in docs/benchmarks.md):
- Sharding is client-side. Shards are independent server processes, one
graph universe each; the Python
ShardRouter(epistemic_graph/pool.py) picks a shard per graph name with rendezvous/HRW hashing overGRAPH_SERVICE_ENDPOINTS. There is no server-side coordination, rebalancing, or cross-shard query. - No replication, no HA. Each graph lives in exactly one process's memory. If a shard dies, its graphs are unavailable until the process restarts and reloads its last snapshot.
- RPO = checkpoint interval. Durability is periodic snapshotting
(
--persist-dir, default every 300 s) plus checkpoint-on-shutdown; a crash loses writes since the last checkpoint. There is no WAL. - The 100M-agent figure is a projection, not a load test: it assumes ~52 kB resident per agent (measured on bounded 40-node subgraphs), 64 GB RAM per host, and linear shard scaling — arithmetic that yields ~78 hosts.
Development & Test
Run Unit Tests
# Rust tests (29 compute + graph tests)
cargo test --lib --features compute
# Python tests
uv run pytest
Format and Lint
pre-commit run --all-files
Documentation
- Technical Overview — Rust-side structures and graph algorithm layouts.
- Concept Registry — Registered
CONCEPTbridges. - AI Agent Handbook — Quick command sheet for coding assistants.
- Changelog — Progression of updates and releases.
Environment Variables
| Variable | Description |
|---|---|
GRAPH_SERVICE_AUTH_SECRET |
HMAC-SHA256 secret for inter-process authentication (required — the server refuses to start without it unless the insecure opt-out is set) |
EPISTEMIC_GRAPH_ALLOW_INSECURE |
1/true: explicit opt-out allowing an empty auth secret (development only; logs a prominent warning) |
GRAPH_SERVICE_SOCKET |
Path to Unix Domain Socket for UDS communication |
GRAPH_SERVICE_ENDPOINTS |
Comma-separated shard endpoints consumed by the Python ShardRouter |
EPISTEMIC_GRAPH_MAX_INFLIGHT |
Server backpressure cap (default 1024); excess load is shed with BUSY |
GRAPH_SERVICE_METRICS_ADDR |
Prometheus /metrics HTTP listener address (e.g. 127.0.0.1:9101). Disabled when unset |
XDG_RUNTIME_DIR |
Directory for UDS socket placement |
License
This project is licensed under the MIT License — see the LICENSE file for details.
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 epistemic_graph-0.31.0.tar.gz.
File metadata
- Download URL: epistemic_graph-0.31.0.tar.gz
- Upload date:
- Size: 375.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3f7613554480801548810952f2f44185c090a791a66968b87f23a6299ba282f
|
|
| MD5 |
0334e85fa80446c55a3ff5c44a53b2bf
|
|
| BLAKE2b-256 |
608c0ae54c4254cce6e46d7256fdea65d2f1d87d9df3333b58b365a3690e6d24
|
File details
Details for the file epistemic_graph-0.31.0-py3-none-win_amd64.whl.
File metadata
- Download URL: epistemic_graph-0.31.0-py3-none-win_amd64.whl
- Upload date:
- Size: 1.9 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2405d6db51bab0656ec284d67220670b1a53f2a3ac1c3cb93ce770243af773b0
|
|
| MD5 |
3cb14c5cab843c59c785d5135bd8df88
|
|
| BLAKE2b-256 |
71274e27b172bac84e54bd51b13181793c965a8e2af39150364f65f786124211
|
File details
Details for the file epistemic_graph-0.31.0-py3-none-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: epistemic_graph-0.31.0-py3-none-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.1 MB
- Tags: Python 3, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16263853d7e86675339f244e3537240e043b8485f1a30d0ba63c3b55fba80ae6
|
|
| MD5 |
5bc4b43b2733b3a3e98205de4db0c7ae
|
|
| BLAKE2b-256 |
c2297add39ea7b21a2d3068229d19824133781cd8ffe6ffb10a47102a6bcd577
|
File details
Details for the file epistemic_graph-0.31.0-py3-none-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: epistemic_graph-0.31.0-py3-none-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 1.9 MB
- Tags: Python 3, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60c7aa9f5f81691cdabe2e6486ecdb48a4501c180254c63ce50f6cd9b938d5f5
|
|
| MD5 |
3083c47d63977064aa83c1a9412ec4f8
|
|
| BLAKE2b-256 |
4d810af0ccfad2173d5417494fe2ef939ed6e30dce6c1e6d1d58582d0b45f99f
|
File details
Details for the file epistemic_graph-0.31.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: epistemic_graph-0.31.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.7 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55d3cacfe789b2b44e9c8ba2736522198dd9c505a8555105c4b23bf81f9ea289
|
|
| MD5 |
9f16a6c4c217a25625bae162e8120aa0
|
|
| BLAKE2b-256 |
211ccae5f82430ed35e700169c9c1fa643bc33958a8005e95b488880e99ac032
|