A DOT-based pipeline runner for AI workflows
Project description
Attractor
A DOT-based pipeline runner that uses directed graphs (defined in Graphviz DOT syntax) to orchestrate multi-stage AI workflows.
Overview
Attractor lets you define multi-stage AI workflows as directed graphs using Graphviz DOT syntax. The graph is the workflow: nodes are tasks, edges are transitions, and attributes configure behavior.
Based on the Attractor Specification.
Features
- Declarative pipelines defined in DOT syntax
- Pluggable handlers for different node types (LLM calls, conditionals, human gates)
- Checkpoint and resume for crash recovery
- Goal gates to enforce critical stages
- Edge-based routing with conditions and priorities
- Retry logic with exponential backoff
- Comprehensive validation and linting
Installation
pip install -e .
Quick Start
Create a simple pipeline in example.dot:
digraph Simple {
graph [goal="Run tests and report"]
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
run_tests [label="Run Tests", prompt="Run the test suite"]
report [label="Report", prompt="Summarize results for $goal"]
start -> run_tests -> report -> exit
}
Run the pipeline:
# Validate the pipeline
python -m attractor.cli example.dot --validate-only
# Execute the pipeline
python -m attractor.cli example.dot
Or use the Python API:
from attractor import parse_dot, run_pipeline
graph = parse_dot("example.dot")
outcome = run_pipeline(graph)
print(f"Pipeline completed with status: {outcome.status.value}")
Documentation
- Usage Guide - Detailed usage and examples
- Attractor Specification - Complete specification
Testing
# Run all tests
pytest tests/
# Run with verbose output
pytest tests/ -v
Currently 47 tests passing, including:
- DOT parser tests
- Validation and linting tests
- Execution engine tests
- Condition evaluation tests
- Handler tests (tool, human-in-the-loop, parallel)
- Stylesheet parsing and matching tests
- Integration tests matching the spec's smoke test
Examples
See the examples/ directory for complete working pipelines:
simple.dot- Basic linear workflowbranching.dot- Conditional branching with goal gates
Implementation Status
Core features implemented:
- ✅ DOT parser for the supported subset
- ✅ Validation with 7 built-in lint rules
- ✅ Execution engine with retry logic and checkpointing
- ✅ Edge selection with 5-step priority algorithm
- ✅ Condition evaluation (=, !=, && operators)
- ✅ Basic handlers (start, exit, codergen, conditional)
- ✅ Tool handler (parallelogram nodes) - shell command execution
- ✅ Human-in-the-loop handler (hexagon nodes) - interactive gates
- ✅ Parallel execution handler (component nodes) - concurrent branches
- ✅ Fan-in handler (tripleoctagon nodes) - result consolidation
- ✅ Model stylesheet parser - CSS-like LLM configuration
- ✅ CLI interface
- ✅ Variable expansion ($goal)
Not yet implemented:
- ⏳ Manager loop handler (house nodes) - supervisor pattern
- ⏳ HTTP server mode
- ⏳ Observability events
- ⏳ Full parallel subgraph execution (current implementation is simplified)
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
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 py_attractor-0.3.0.tar.gz.
File metadata
- Download URL: py_attractor-0.3.0.tar.gz
- Upload date:
- Size: 27.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de57e4390a673cd2a249e928e33a580c4b72ecba9d35df364d8e1471ae033146
|
|
| MD5 |
a92fe49cb750e1b5b9caa275e30ca8e2
|
|
| BLAKE2b-256 |
163b297b8cffdb46f338b35a0ded2dc757adccb58965bf51a1a2d9971e11001c
|
Provenance
The following attestation bundles were made for py_attractor-0.3.0.tar.gz:
Publisher:
publish.yml on anishkny/attractor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
py_attractor-0.3.0.tar.gz -
Subject digest:
de57e4390a673cd2a249e928e33a580c4b72ecba9d35df364d8e1471ae033146 - Sigstore transparency entry: 929127827
- Sigstore integration time:
-
Permalink:
anishkny/attractor@b838c9af670dca08107365cb835625501833bd51 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/anishkny
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b838c9af670dca08107365cb835625501833bd51 -
Trigger Event:
push
-
Statement type:
File details
Details for the file py_attractor-0.3.0-py3-none-any.whl.
File metadata
- Download URL: py_attractor-0.3.0-py3-none-any.whl
- Upload date:
- Size: 22.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f6b59127d63ef22b759ab8d20fbdd3a9fc4848fc258ca44722f89af89f6b985
|
|
| MD5 |
07d283f3a9f97d309bd03441b30000ac
|
|
| BLAKE2b-256 |
e29eb5bd2305e90c14513ac22f52cbb6fae7184d91ad6f7f58f489d1069a24bd
|
Provenance
The following attestation bundles were made for py_attractor-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on anishkny/attractor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
py_attractor-0.3.0-py3-none-any.whl -
Subject digest:
7f6b59127d63ef22b759ab8d20fbdd3a9fc4848fc258ca44722f89af89f6b985 - Sigstore transparency entry: 929127828
- Sigstore integration time:
-
Permalink:
anishkny/attractor@b838c9af670dca08107365cb835625501833bd51 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/anishkny
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b838c9af670dca08107365cb835625501833bd51 -
Trigger Event:
push
-
Statement type: