What is the Agent Daemon?
Miri can use AI for agentic Taks, but AI also needs a local Connection for relevant business data, like a SAP ERP connection. For this purpose, the AI task will not be processed centrally on the Miri web platform but decentralized within the Agent Daemon. The Agent Daemon can be installed anywhere, but it should run where the system connections are possible. Miri needs no open port or inbound channel to connect to the agent. The agent connects via outbound to the central Miri application.
The daemon is available as a Docker image to limit the capabilities of AI and has an additional native security sandbox within the AI agent, too. This is the recommended approach for productive AI Workloads within an enterprise.
Prerequisites
- Docker and Docker Compose are installed on the host
- Network access to the Agent Orchestrator backend
- A registration token from the Agent Orchestrator UI
- An API Key from an AI Model Provider
System Ressources
The Agents can run on any local devices like a laptop but for stable access, it is recommended to install it on a dedicated host with
- CPU Requirements: 2 VCPUs
- Memory (RAM): 4 GB
- Recommended OS: Linux (Debian, Ubuntu, etc)
- Network Ingres: No requirements, No Public IP or Proxy needed
- Network Outgres: Internet Access required – Communication over HTTPS 443 to miri.simplifier.cloud
Step 1: Prepare Your API Key from your AI Model Provider
Currently we support
- Antrophic (via API Key)
- OpenRouter
- Github Enterprise
Step 2 Getting a Registration Token
- Login to Miri Webinterface as Administrator
- Navigate to Runtimes in the sidebar.
- Press the Registration Token button.
- Copy the token shown in the dialog.
If no runtime exists yet, create one first via the New Runtime button on the Agent Management page.
If you don’t have admin rights, request a token from your Simplifier Contact Partner.
Step 3: Prepare the Compose File
Create an environment file and a Docker Compose configuration:
# Create the environment file
cat > .env <<'EOF'
AGENTHUB_SERVER_URL=https://miri.simplifier.cloud
AGENTHUB_TOKEN=<Enter your Registration Token here>
AGENTHUB_RUNTIME_NAME=Miri Agent Runtime
AGENTHUB_MAX_CONCURRENT=4
ANTHROPIC_API_KEY=
OPENROUTER_API_KEY=
GITHUB_ENTERPRISE_AI_KEY=
EOF
# Create docker-compose.yml
cat > docker-compose.yml <<'EOF'
services:
daemon:
image: simplifierag/miri-daemon:latest
container_name: miri-daemon
environment:
AGENTHUB_SERVER_URL: "${AGENTHUB_SERVER_URL}"
AGENTHUB_TOKEN: "${AGENTHUB_TOKEN}"
AGENTHUB_WORKSPACE_ID: "${AGENTHUB_WORKSPACE_ID:-}"
AGENTHUB_RUNTIME_NAME: "${AGENTHUB_RUNTIME_NAME:-Docker Runtime}"
AGENTHUB_MAX_CONCURRENT: "${AGENTHUB_MAX_CONCURRENT:-4}"
AGENTHUB_POLL_INTERVAL: "${AGENTHUB_POLL_INTERVAL:-3s}"
AGENTHUB_IDLE_WATCHDOG: "${AGENTHUB_IDLE_WATCHDOG:-}"
# Provider API keys for opencode — the daemon spawns opencode with `env = dict(os.environ)`,
# so these are passed straight through to every agent subprocess.
# With a key set, agent can use that provider's models (set AGENTHUB_OPENCODE_MODEL to e.g.
# "anthropic/claude-sonnet-4-5" or "openrouter/anthropic/claude-sonnet-4-5", or use per-agent
# model overrides). Multiple keys can be set simultaneously — agent discovers all available
# providers' models on startup.
ANTHROPIC_API_KEY: "${ANTHROPIC_API_KEY:-}"
OPENROUTER_API_KEY: "${OPENROUTER_API_KEY:-}"
GITHUB_ENTERPRISE_AI_KEY: "${GITHUB_ENTERPRISE_AI_KEY:-}"
volumes:
- daemon-workspaces:/root/agenthub_workspaces
labels:
- wud.watch.digest=true
restart: unless-stopped
# WUD — What's Up Docker? Watches container images for new versions and
# exposes a web UI for status. Checks every 6 hours.
wud:
image: getwud/wud:latest
container_name: miri-wud
environment:
WUD_WATCHER_LOCAL_WATCHBYDEFAULT: "true"
WUD_WATCHER_LOCAL_CRON: "0 */6 * * *"
WUD_SERVER_ENABLED: "false"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
restart: unless-stopped
volumes:
daemon-workspaces:
EOF
After the config is completed, start the Daemon
# Start the daemon
docker compose up -d
Docker Environment Variables
| Variable | Default | Description |
|---|---|---|
AGENTHUB_SERVER_URL |
(required) | Backend base URL |
AGENTHUB_TOKEN |
(required) | Runtime registration token |
AGENTHUB_WORKSPACE_ID |
(none) | Pin to a specific workspace |
AGENTHUB_RUNTIME_NAME |
Docker Runtime |
Display name in registry |
AGENTHUB_MAX_CONCURRENT |
4 |
Maximum parallel runs |
AGENTHUB_POLL_INTERVAL |
3s |
Seconds between work-claim polls |
AGENTHUB_IDLE_WATCHDOG |
(disabled) | Auto-restart after idle period |
ANTHROPIC_API_KEY |
(disabled) | Antropic API Key for accessing Models like Sonnet, Opus etc |
OPENROUTER_API_KEY |
(disabled) | OpenRouter API Key for accessing over 500 AI Models |
GITHUB_ENTERPRISE_AI_KEY |
(disabled) | API Key for GitHub Enterprise Subscription |
Managing the Agent Daemon
# View logs
docker compose logs -f
# Restart
docker compose restart
# Stop
docker compose down
# Update to latest image
docker compose pull
docker compose up -d
Multiple Daemons
To run multiple daemons on the same Docker host, use different project names and container names:
# Daemon 1
docker compose -p daemon1 up -d
# Daemon 2 (with a different runtime name)
Edit the env. file
AGENTHUB_RUNTIME_NAME="GPU Worker"
Restart the Container
docker compose -p daemon2 up -d
Verifying Installation
After starting the daemon, check the Runtimes page in Agent Orchestrator. Your new runtime should appear with a green Connected status badge within a few seconds. Recent runs will show up in the Activity column.
Troubleshooting
| Symptom | Check |
|---|---|
| Daemon won’t start | journalctl -u agenthub-daemon -n 50 |
| No runs claimed | Verify the workspace has queued tasks with agent assignments |
| Docker: container exits immediately | Check docker compose logs daemon for registration errors |
| Docker: 403 registration error | Verify AGENTHUB_TOKEN is a valid, non-expired registration token |











