Weavegraph
NOTE:
NodeKind::StartandNodeKind::Endare virtual structural endpoints.
You never register them withadd_node; attempts to do so are ignored with a warning.
Define only your executable (custom) nodes and connect them with edges fromStartand toEnd.
Graph-driven, concurrent agent workflow framework with versioned state, deterministic barrier merges, and rich diagnostics.
Weavegraph is a modern Rust framework for building complex, stateful workflows using graph-based execution. It's designed for AI agents, data processing pipelines, and any application requiring sophisticated state management with concurrent node execution.
โจ Key Features
- ๐ Concurrent Graph Execution: Bounded-concurrency scheduler with dependency resolution and versioned barrier synchronization
- ๐ Rich Message System: Type-safe message construction with role-based messaging for AI workflows
- ๐ฏ Versioned State Management: Channel-based state with snapshot isolation and deterministic merges
- ๐จ Comprehensive Error Handling: Structured error propagation with beautiful diagnostics via
mietteandthiserror - ๐ Built-in Observability: Rich tracing spans and event streaming for monitoring and debugging
- ๐พ Flexible Persistence: SQLite checkpointing with automatic schema management, plus in-memory options
- ๐ญ Conditional Workflows: Dynamic routing and edge conditions based on runtime state
- ๐ง Developer Experience: Extensive examples, comprehensive docs, and ergonomic APIs
๐ Quick Start
Add Weavegraph to your Cargo.toml:
[]
= "0.1"
Basic Example
use ;
use async_trait;
// Define a simple greeting node
;
async
๐ Core Concepts
Messages
Messages are the primary communication primitive with convenient constructors:
use Message;
// Use convenience constructors (recommended)
let user_msg = user;
let assistant_msg = assistant;
let system_msg = system;
// For custom roles
let function_msg = new;
// Complex cases with builder pattern
let complex_msg = builder
.role
.content
.build;
State Management
Versioned state with channel isolation and snapshot consistency:
use VersionedState;
// Simple initialization
let state = new_with_user_message;
// Rich initialization with builder
let state = builder
.with_user_message
.with_system_message
.with_extra
.build;
Graph Building
Declarative workflow definition with conditional routing:
use GraphBuilder;
use NodeKind;
use Arc;
let graph = new
.add_node
.add_node
.add_node
.add_node
// Virtual Start/End: connect from Start and into End explicitly
.add_edge
.add_edge
.add_conditional_edge
.add_edge
.add_edge
.compile;
Note: Conditional predicates must return the name of a valid next node or a virtual endpoint. The runtime accepts:
- Custom nodes by name (e.g., "respond", "escalate") that were registered via add_node
- The virtual endpoints "Start" and "End" If a predicate returns an unknown target, the route is skipped and a warning is logged.
Conditional Edges
Use conditional edges to route dynamically based on runtime state. Predicates return target node names (Vec), allowing flexible routing to single or multiple nodes.
Compact example:
use Arc;
use ;
use NodeKind;
let route: EdgePredicate = new;
let app = new
.add_node
.add_node
.add_node
.add_edge
.add_conditional_edge
.add_edge
.add_edge
.compile;
Troubleshooting:
- If nothing happens after a node with a conditional edge, ensure the predicate returns valid target names matching registered nodes, or the virtual endpoints "Start"/"End".
- For readability, use small helper predicates (EdgePredicate) and unit test them with sample StateSnapshots.
๐ง Examples
The repository includes comprehensive examples demonstrating different patterns:
# Basic node patterns and message handling
# Advanced patterns: error handling, conditional routing, data transformation
# Error handling and pretty diagnostics
Demo Applications
Historical demo applications showcase evolution of capabilities:
# Basic graph execution patterns (examples/demo1.rs)
# Direct scheduler usage and barrier synchronization (examples/demo2.rs)
# LLM workflows with Ollama integration (examples/demo3.rs)
# Advanced multi-step workflows (examples/demo4.rs)
Note: Demo3 requires Ollama running at http://localhost:11434 with models like gemma3. Use the provided docker-compose.yml to set up Ollama:
๐๏ธ Architecture
Weavegraph is built around several core modules:
- [
message] - Type-safe message construction and role-based messaging - [
state] - Versioned state management with channel isolation - [
node] - Node execution primitives and async trait definitions - [
graph] - Workflow graph definition and conditional routing - [
schedulers] - Concurrent execution with dependency resolution - [
runtimes] - High-level execution runtime and checkpointing - [
channels] - Channel-based state storage and versioning - [
reducers] - State merge strategies and conflict resolution - [
event_bus] - Event streaming and observability infrastructure
๐ Observability & Debugging
Tracing
Rich tracing integration with configurable log levels:
# Debug level for weavegraph modules
RUST_LOG=debug
# Error level globally, debug for weavegraph
RUST_LOG=error,weavegraph=debug
Event Streaming
Built-in event bus for monitoring workflow execution:
use ;
// Custom event handling for testing
let event_bus = with_sink;
let runner = with_bus;
// Events include node starts/completions, state changes, errors
Error Diagnostics
Beautiful error reporting with context and suggestions:
// Automatic error context and pretty printing
๐พ Persistence
SQLite Checkpointing
Automatic state persistence with configurable database location:
use SqliteCheckpointer;
let checkpointer = new.await?;
let runner = with_checkpointer;
Database URL resolution order:
WEAVEGRAPH_SQLITE_URLenvironment variable- Explicit URL in code
SQLITE_DB_NAMEenvironment variable (filename only)- Default:
sqlite://weavegraph.db
In-Memory Mode
For testing and ephemeral workflows:
let runner = new; // Uses in-memory state
๐งช Testing
Run the comprehensive test suite:
# All tests with output
# Specific test categories
Property-based testing with proptest ensures correctness across edge cases.
Overview mermain flowchart of the app
flowchart TB
subgraph Client
user[Client App or UI]
end
subgraph Build
gb[GraphBuilder]
end
subgraph Graph
cg[CompiledGraph]
end
subgraph Runtime
app[App]
sched[Scheduler]
router[Router Edges and Commands]
barrier[Barrier Applier]
end
subgraph Nodes
usernode[User Nodes]
llmnode[LLM Node]
toolnode[Tool Node]
end
subgraph State
vstate[Versioned State]
snap[State Snapshot]
end
subgraph Reducers
redreg[Reducer Registry]
end
subgraph Checkpoint
cpif[Checkpointer]
end
subgraph Rig
rigad[Rig Adapter]
llmprov[LLM Provider]
end
subgraph Tools
toolreg[Tool Registry]
exttools[External Tools]
end
subgraph Stream
stream[Stream Controller]
end
subgraph Viz
viz[Visualizer]
end
user --> gb
gb --> cg
user --> app
cg --> app
app --> sched
sched --> snap
vstate --> snap
sched --> usernode
sched --> llmnode
sched --> toolnode
usernode --> barrier
llmnode --> barrier
toolnode --> barrier
redreg --> barrier
barrier --> vstate
snap --> router
app --> router
router --> sched
llmnode --> rigad
rigad --> llmprov
llmprov --> rigad
rigad --> llmnode
toolnode --> toolreg
toolnode --> exttools
exttools --> toolnode
barrier --> cpif
app --> stream
stream --> user
cg --> viz
๐ Production Considerations
Performance
- Bounded concurrency prevents resource exhaustion
- Snapshot isolation eliminates state races
- Channel-based architecture enables efficient partial updates
- SQLite checkpointing supports failure recovery
Monitoring
- Structured event streaming for observability platforms
- Rich tracing spans for distributed tracing
- Error aggregation and pretty diagnostics
- Custom event sinks for metrics collection
Deployment
- Docker-ready with provided compose configuration
- Environment-based configuration
- Graceful shutdown handling
- Migration support for schema evolution
๐ Project Background
Weavegraph originated as a capstone project for a Rust online course, developed by contributors with Python backgrounds and experience with LangGraph and LangChain. The goal was to bring similar graph-based workflow capabilities to Rust while leveraging its performance, safety, and concurrency advantages.
While rooted in educational exploration, Weavegraph has evolved into a production-ready framework with continued active development well beyond the classroom setting.
๐ค Contributing
We welcome contributions! Please see our contributing guidelines for details.
Areas we're particularly interested in:
- Additional persistence backends (PostgreSQL, Redis)
- Enhanced AI/LLM integration patterns
- Performance optimizations
- Documentation improvements
- Example applications
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.