Event-driven workflow orchestration framework with flexible connection, state management, and workflow orchestration capabilities
Project description
Routilux โก
Routilux is a powerful, event-driven workflow orchestration framework that makes building complex data pipelines and workflows effortless. With its intuitive API and flexible architecture, you can create sophisticated workflows in minutes, not hours.
โจ Why Routilux?
- ๐ Event Queue Architecture: Non-blocking event emission with unified execution model for both sequential and concurrent modes
- ๐ Flexible Connections: Many-to-many relationships between routines with intelligent data routing
- ๐ Built-in State Management: Track execution state, performance metrics, and history out of the box
- ๐ก๏ธ Robust Error Handling: Multiple strategies (STOP, CONTINUE, RETRY, SKIP) with automatic recovery
- โก Concurrent Execution: Automatic parallelization for I/O-bound operations via unified event queue
- ๐พ Persistence & Recovery: Save and resume workflows from any point with pending task serialization
- ๐ฏ Production Ready: Comprehensive error handling, execution tracking, and monitoring
- ๐จ Simplified API: Automatic flow detection - no need to pass flow parameter in most cases
๐ฏ Perfect For
- Data Pipelines: ETL processes, data transformation workflows
- API Orchestration: Coordinating multiple API calls with complex dependencies
- Event Processing: Real-time event streams and reactive systems
- Workflow Automation: Business process automation and task scheduling
- Microservices Coordination: Managing interactions between services
- LLM Agent Workflows: Complex AI agent orchestration and chaining
๐ฆ Installation
โก One-Line Install (Recommended)
# Mac / Linux - Auto-detects best method (uv > pipx > pip)
curl -fsSL https://raw.githubusercontent.com/lzjever/routilux/main/install.sh | bash
# Or with wget
wget -qO- https://raw.githubusercontent.com/lzjever/routilux/main/install.sh | bash
Installation options:
# Use pipx instead of uv
METHOD=pipx curl -fsSL https://raw.githubusercontent.com/lzjever/routilux/main/install.sh | bash
# Install specific version
VERSION=0.14.0 curl -fsSL https://raw.githubusercontent.com/lzjever/routilux/main/install.sh | bash
Recommended: Isolated CLI Installation (pipx)
The best way to install Routilux CLI without affecting your system:
# Install CLI with isolated environment
pipx install "routilux[cli]"
# Use anywhere
routilux --help
routilux run workflow.yaml
Why pipx?
- โ Creates isolated virtual environment (no dependency conflicts)
- โ CLI available globally
- โ
Easy to update:
pipx upgrade routilux - โ Works on Mac and Linux
Alternative: Modern (uv tool)
Using uv (faster than pipx):
# Install
uv tool install "routilux[cli]"
# Use
routilux --help
macOS / Linux: Homebrew
# Add tap and install
brew tap lzjever/routilux
brew install routilux
# Or directly
brew install lzjever/routilux/routilux
Standard pip Install
For library use or development:
# Library only
pip install routilux
# With CLI support
pip install "routilux[cli]"
Development Setup with uv (Recommended)
This project uses uv for fast dependency management. Install uv first:
curl -LsSf https://astral.sh/uv/install.sh | sh
Then set up the development environment:
Recommended: For active development
# Install package with all development dependencies (recommended)
make dev-install
# Or manually with uv (dev group is installed by default)
uv sync --group docs --all-extras
Alternative: Dependencies only (for CI/CD or code review)
# Create virtual environment and install dependencies only (without installing the package)
# Useful for: CI/CD pipelines, code review, or when you only need development tools
make setup-venv
# Later, if you need to install the package:
make install
Understanding dependency groups vs extras:
- Dependency groups (
dev,docs): Development dependencies that are not published to PyPI. Thedevgroup is installed by default withuv sync. - Extras: Currently none, but may be added in the future.
All make commands will automatically use uv if available, otherwise fall back to pip.
Development Install (Legacy - using pip)
For development with all dependencies using pip:
pip install -e ".[dev]"
# Or using Makefile
make dev-install
๐ฅ๏ธ CLI
Routilux includes a command-line interface for workflow management:
# Install with CLI support
pip install routilux[cli]
# Run a workflow
routilux run --workflow flow.yaml
# Start server
routilux server start
# See all commands
routilux --help
CLI Commands
routilux init- Initialize a new project with example filesroutilux run- Execute a workflow from a DSL fileroutilux server- Start the HTTP server for API accessroutilux job- Submit and manage jobsroutilux list- List available routines or flowsroutilux validate- Validate a workflow DSL file
See CLI Documentation for details.
Server with Flow Loading
Start the HTTP server with flow auto-loading:
# Start server with flows directory
routilux server start --flows-dir ./flows --port 8080
# Built-in routines (Mapper, Filter, etc.) are automatically available
# Flows from ./flows/*.yaml are loaded at startup
# Hot reload enabled - flow files are watched for changes
Job Management
Submit and manage jobs via CLI:
# Submit job locally
routilux job submit --flow myflow --routine processor --data '{"input": "value"}'
# Submit job to remote server
routilux job submit --server http://localhost:8080 --flow myflow --routine processor --data '{}'
# Check job status
routilux job status <job_id>
# List jobs
routilux job list --flow myflow
๐ Quick Start
For development with all dependencies using pip:
pip install -e ".[dev]"
# Or using Makefile
make dev-install
๐ Quick Start
Create Your First Workflow in 3 Steps
Step 1: Define a Routine
from routilux import Routine
class DataProcessor(Routine):
def __init__(self):
super().__init__()
# Define input slot
self.input_slot = self.define_slot("input", handler=self.process_data)
# Define output event
self.output_event = self.define_event("output", ["result"])
def process_data(self, data=None, **kwargs):
# Flow is automatically detected from routine context
result = f"Processed: {data}"
self._stats["processed_count"] = self._stats.get("processed_count", 0) + 1
self.emit("output", result=result) # No need to pass flow!
Step 2: Create and Connect a Flow
from routilux import Flow
flow = Flow(flow_id="my_workflow")
processor1 = DataProcessor()
processor2 = DataProcessor()
id1 = flow.add_routine(processor1, "processor1")
id2 = flow.add_routine(processor2, "processor2")
# Connect: processor1's output โ processor2's input
flow.connect(id1, "output", id2, "input")
Step 3: Execute
job_state = flow.execute(id1, entry_params={"data": "Hello, Routilux!"})
print(job_state.status) # "completed"
print(processor1.stats()) # {"processed_count": 1}
๐ Done! You've created your first workflow.
๐ก Key Features
๐ Event Queue Architecture
Routines communicate through events and slots using a unified event queue pattern:
# Multiple routines can listen to the same event
flow.connect(processor1, "output", processor2, "input")
flow.connect(processor1, "output", processor3, "input") # Fan-out
# Multiple events can feed into the same slot
flow.connect(processor1, "output", aggregator, "input")
flow.connect(processor2, "output", aggregator, "input") # Fan-in
# emit() is non-blocking - returns immediately after enqueuing tasks
# Flow is automatically detected from routine context
self.emit("output", data="value") # No flow parameter needed!
๐๏ธ Flexible State Management
Track everything automatically:
# Access routine state
stats = routine.stats() # {"processed_count": 42, "errors": 0}
# Track execution history
history = job_state.get_execution_history()
# Performance metrics
perf = flow.execution_tracker.get_routine_performance("processor1")
๐ก๏ธ Built-in Error Handling
Choose the right strategy for your use case:
from routilux import ErrorHandler, ErrorStrategy
# Stop on error (default)
flow.set_error_handler(ErrorHandler(ErrorStrategy.STOP))
# Continue and log errors
flow.set_error_handler(ErrorHandler(ErrorStrategy.CONTINUE))
# Retry with exponential backoff
flow.set_error_handler(ErrorHandler(
ErrorStrategy.RETRY,
max_retries=3,
retry_delay=1.0,
backoff_multiplier=2.0
))
โก Unified Execution Model
Both sequential and concurrent modes use the same event queue mechanism:
# Sequential mode (default): max_workers=1
flow = Flow() # Sequential by default
# Concurrent mode: max_workers>1
flow.set_execution_strategy("concurrent", max_workers=4)
# Tasks are processed fairly in queue order
# Long chains don't block shorter ones
job_state = flow.execute(entry_routine_id)
flow.wait_for_completion() # Wait for async tasks
๐พ Persistence & Recovery
Save and resume workflows:
# Save workflow state
job_state.save("workflow_state.json")
# Later, resume from saved state
saved_state = JobState.load("workflow_state.json")
flow.resume(saved_state)
๐ Documentation
๐ Full documentation available at: routilux.readthedocs.io
Documentation Highlights
- ๐ User Guide: Comprehensive guide covering all features
- ๐ง API Reference: Complete API documentation
- ๐ป Examples: Real-world code examples
- ๐๏ธ Design: Architecture and design principles
Build Documentation Locally
pip install -e ".[docs]"
cd docs && make html
๐ Examples
Check out the examples/ directory for practical examples:
Core Examples
basic_example.py- Your first workflowdata_processing.py- Multi-stage data pipelineconcurrent_flow_demo.py- Parallel executionerror_handling_example.py- Error handling strategiesstate_management_example.py- State tracking and recoverybuiltin_routines_demo.py- Using built-in routines
Real-World Usage Patterns
data_pipeline.py- Multi-stage data processing with validation, transformation, and quality checksasync_orchestration.py- Concurrent task execution with result aggregationlong_running_workflow.py- Pause/resume execution with state persistence and recoveryerror_handling.py- Retry patterns and fallback mechanisms
Run examples:
python examples/basic_example.py
python examples/data_pipeline.py
python examples/async_orchestration.py
python examples/long_running_workflow.py
python examples/error_handling.py
๐งฉ Built-in Routines
Routilux comes with a rich set of built-in routines ready to use:
- Text Processing:
TextClipper,TextRenderer,ResultExtractor - Data Processing:
DataTransformer,DataValidator,DataFlattener - Control Flow:
ConditionalRouterfor dynamic routing - Utilities:
TimeProviderfor timestamps
from routilux.builtin_routines import ConditionalRouter, DataTransformer
# Use built-in routines directly
router = ConditionalRouter()
transformer = DataTransformer()
๐๏ธ Project Structure
routilux/
โโโ routilux/ # Main package
โ โโโ routine.py # Routine base class
โ โโโ flow.py # Flow manager
โ โโโ job_state.py # State management
โ โโโ connection.py # Connection management
โ โโโ event.py # Event class
โ โโโ slot.py # Slot class
โ โโโ error_handler.py # Error handling
โ โโโ execution_tracker.py # Performance tracking
โโโ tests/ # Comprehensive test suite
โโโ examples/ # Usage examples
โโโ docs/ # Sphinx documentation
๐งช Testing
Routilux comes with comprehensive tests:
# Run all tests
make test-all
# Run with coverage
make test-cov
# Run specific test suite
pytest tests/ # Core tests
pytest routilux/builtin_routines/ # Built-in routines tests
๐ค Contributing
We welcome contributions! Here's how you can help:
- Star the project โญ - Show your support
- Report bugs ๐ - Help us improve
- Suggest features ๐ก - Share your ideas
- Submit PRs ๐ง - Contribute code
๐ข About Agentsmith
Routilux is part of the Agentsmith open-source ecosystem. Agentsmith is a ToB AI agent and algorithm development platform, currently deployed in multiple highway management companies, securities firms, and regulatory agencies in China. The Agentsmith team is gradually open-sourcing the platform by removing proprietary code and algorithm modules, as well as enterprise-specific customizations, while decoupling the system for modular use by the open-source community.
๐ Agentsmith Open-Source Projects
- Varlord โ๏ธ - Configuration management library with multi-source support
- Routilux โก - Event-driven workflow orchestration framework
- Serilux ๐ฆ - Flexible serialization framework for Python objects
- Lexilux ๐ - Unified LLM API client library
These projects are modular components extracted from the Agentsmith platform, designed to be used independently or together to build powerful applications.
๐ License
Routilux is licensed under the Apache License 2.0. See LICENSE for details.
๐ Links
- ๐ฆ PyPI: pypi.org/project/routilux
- ๐ Documentation: routilux.readthedocs.io
- ๐ GitHub: github.com/lzjever/routilux
- ๐ง Issues: github.com/lzjever/routilux/issues
โญ Show Your Support
If Routilux helps you build amazing workflows, consider giving it a star on GitHub!
Built with โค๏ธ by the Routilux Team
Making workflow orchestration simple, powerful, and fun.
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 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 routilux-0.15.2.tar.gz.
File metadata
- Download URL: routilux-0.15.2.tar.gz
- Upload date:
- Size: 606.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a6b3703649c3ab41a1fb821e695ba53150bbd2f55f8cb267122f37257d4f247
|
|
| MD5 |
4076108509f03ab5e122501346f7383e
|
|
| BLAKE2b-256 |
985f631e103af53bb8768fe42efd64e58cafe603e55c0e48462a9f1488fe1c96
|
File details
Details for the file routilux-0.15.2-py3-none-any.whl.
File metadata
- Download URL: routilux-0.15.2-py3-none-any.whl
- Upload date:
- Size: 375.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7108ae48b523f1a24d6d6d880edef76b4144e9d68f761d5d43776434c5933468
|
|
| MD5 |
9994af18ca4cb49028b816a8f69d0ccf
|
|
| BLAKE2b-256 |
f8ff21d0825e1bb82ce1987643377767a4c67166486f38cd8db50e6ade35c9c1
|