Actor-model multi-agent framework — spawn, coordinate and monitor AI agents at runtime
Project description
AI agents that don't stop when you close the tab.
Docs | Installation | Architecture | Home Assistant Addon | Issues
Wactorz runs LLM-driven agents as long-lived actors on the hardware you already have - a Raspberry Pi in the garage, an old laptop, a VM in your closet. You describe what you want in chat; the planner writes the Python, spawns it on a node, and supervises it. When an agent crashes, only that one restarts. State persists across restarts and you can move an agent to a different machine without losing it.
It runs on MQTT, so anything happening inside the system surfaces as a topic external code can subscribe to. Home Assistant talks to it the same way Discord and Telegram do - it's one channel among several, alongside a REST API and an MCP server. The LLM provider is configurable (Anthropic, OpenAI, Gemini, NIM) or fully local via Ollama for offline use.
Quick Start
git clone https://github.com/waldiez/wactorz
cd wactorz
pip install -e ".[all]"
# Start the MQTT broker
docker compose up -d mosquitto
# Set your provider, model, and key (or put them in .env)
export LLM_PROVIDER=anthropic # anthropic | openai | ollama | nim | gemini
export LLM_MODEL=claude-sonnet-4-6
export LLM_API_KEY=your-key-here
python -m wactorz
Dashboard: http://localhost:8888.
If you'd rather skip the clone, pull the image from Docker Hub. To run without an API key, use Ollama:
ollama pull llama3
python -m wactorz --llm ollama --ollama-model llama3
Windows setup is in docs/windows.md; the full set of deployment options lives in docs/deployment.md.
Example prompts
when a person is detected in my pc camera, open the office light
when the door opens, make reachy wakeup
when the light has been on for too long, send me a discord notification
Architecture
flowchart LR
User["User<br/>CLI, REST, Discord, Telegram, HA"] --> Main["MainActor<br/>intent routing"]
Main --> Actuate["OneOffActuatorAgent<br/>direct service calls"]
Main --> Planner["PlannerAgent<br/>pipeline planning"]
Main --> HA["HomeAssistantAgent<br/>REST + WebSocket"]
Main --> Chat["LLM reply<br/>streaming response"]
Planner --> Dynamic["DynamicAgents<br/>LLM-generated runtime code"]
Actuate --> Bus["MQTT broker"]
HA --> Bus
Dynamic --> Bus
Bus --> Dashboard["Live dashboard<br/>agents, logs, cost, heartbeats"]
Bus --> Remote["Remote nodes"]
Bus --> External["Sensors, services, and IoT systems"]
Interfaces
| Interface | How to use it |
|---|---|
| CLI | python -m wactorz |
| Live dashboard | http://localhost:8888 |
| REST API | python -m wactorz --interface rest |
| Discord | python -m wactorz --interface discord |
| Telegram | python -m wactorz --interface telegram |
| MCP server | wactorz-mcp |
| Flutter app | iOS/Android companion app for agents, chat, and activity feed |
| Home Assistant addon | One-click install inside the HA Supervisor |
LLM Configuration
Set these three env vars in .env or export them in your shell:
# Options: anthropic | openai | ollama | nim | gemini | none
LLM_PROVIDER=anthropic
# Model ID — examples:
# anthropic → claude-sonnet-4-6
# openai → gpt-4o
# ollama → llama3
# nim → meta/llama-3.3-70b-instruct
# gemini → gemini-2.5-flash
LLM_MODEL=claude-sonnet-4-6
# Generic key — used for anthropic / openai / nim / gemini
# For Ollama, set OLLAMA_URL instead (default: http://localhost:11434)
# For OpenAI-compatible endpoints (Groq, Together, vLLM…), set OPENAI_URL to redirect
LLM_API_KEY=your-key-here
Repository Map
| Path | What lives there |
|---|---|
wactorz/ |
Python actor runtime, built-in agents, interfaces, monitoring, HA integration |
frontend/ |
Vite + TypeScript card dashboard |
mobile/ |
Flutter companion app |
ha-addon/ |
Home Assistant Supervisor addon |
docs/ |
Markdown docs source |
infra/ |
Mosquitto, Prometheus, OpenTelemetry, nginx, and HA configs |
tests/ |
Python test suite |
Documentation
| Start here | For |
|---|---|
| Quickstart | First run and Windows setup |
| Docker Hub | Run from Docker without cloning the repo |
| Architecture | Actor system, supervision, MQTT flow |
| Agents | Built-in agents, recipes, and dynamic agents |
| Pipelines | Reactive automation patterns |
| Remote nodes | Edge deployment over SSH |
| Interfaces | CLI, REST, chat platforms, dashboard, MCP |
| API reference | REST endpoints and payloads |
| Deployment | Docker, Home Assistant add-on, environment setup |
| Prometheus | Metrics and monitoring |
| Technical reference | Deeper internals |
Contributors
|
Panagiotis Kasnesis 📆 💻 |
Lazaros Toumanidis 💻 🎨 |
Chris 💻 📓 |
Amalia Contiero 💻 📣 |
Contributions of any kind are welcome. See CONTRIBUTING.md to get started.
Contributing
| What | How |
|---|---|
| Found a bug | Open an issue |
| Have an idea | Start a discussion |
| Want to code | Fork, branch, and open a PR against main |
| Docs, tests, UI | Same drill, open a PR |
| New agent recipe | Add it in wactorz/catalogue_agents/ and open a PR |
| Home Assistant | HA integrations and addon config PRs are very welcome |
Read CONTRIBUTING.md for setup instructions, code style, and the PR process.
License
Apache 2.0. Free to use, modify, and distribute.
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 wactorz-0.5.0.tar.gz.
File metadata
- Download URL: wactorz-0.5.0.tar.gz
- Upload date:
- Size: 4.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b544bdf45d1c487818a9295f1ac4dcbfa9c6f37d7ab20058646c5a204728538a
|
|
| MD5 |
242f3e5f6eea968a4e409481686c0a1f
|
|
| BLAKE2b-256 |
366e6a6ff43675f1e500b81973b5300a25c2661f1a16474cf8a6084e6638ca20
|
Provenance
The following attestation bundles were made for wactorz-0.5.0.tar.gz:
Publisher:
release.yml on waldiez/wactorz
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wactorz-0.5.0.tar.gz -
Subject digest:
b544bdf45d1c487818a9295f1ac4dcbfa9c6f37d7ab20058646c5a204728538a - Sigstore transparency entry: 1910697351
- Sigstore integration time:
-
Permalink:
waldiez/wactorz@faf8f61020eb2a0086002e45391c4e8ab5ac74f6 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/waldiez
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@faf8f61020eb2a0086002e45391c4e8ab5ac74f6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wactorz-0.5.0-py3-none-any.whl.
File metadata
- Download URL: wactorz-0.5.0-py3-none-any.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
802dfcc6e81a3f011e9a44901a00669ba779d7e4247985a09175276cbe8dd68b
|
|
| MD5 |
458e1feff947cad232ec325611f001ef
|
|
| BLAKE2b-256 |
e9198f99bc19b2986f6fec2ea2d6325b1dd8904d9c7c8a99327c2a5a27688f6d
|
Provenance
The following attestation bundles were made for wactorz-0.5.0-py3-none-any.whl:
Publisher:
release.yml on waldiez/wactorz
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wactorz-0.5.0-py3-none-any.whl -
Subject digest:
802dfcc6e81a3f011e9a44901a00669ba779d7e4247985a09175276cbe8dd68b - Sigstore transparency entry: 1910697429
- Sigstore integration time:
-
Permalink:
waldiez/wactorz@faf8f61020eb2a0086002e45391c4e8ab5ac74f6 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/waldiez
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@faf8f61020eb2a0086002e45391c4e8ab5ac74f6 -
Trigger Event:
push
-
Statement type: