Self-hosted runners
⚠️
Preview — this feature is being built; the design below is the spec.
By default an agent’s tools run in an environment that Syntic hosts. With self-hosted runners, tool execution happens on machines you operate instead: inside your network, next to your data, on your hardware. The agent’s reasoning still runs on Syntic; only the individual tool calls travel to your runners.
When to use it
- Tools must reach systems that cannot be exposed, even through a tunnel.
- Data may not leave your premises, even into a sandbox.
- You need hardware Syntic does not offer, such as specific GPUs or licensed software.
How it works
- Create an environment with
"hosting": "self_hosted". - Register a runner for it and install the runner on your machine with the token you receive.
- The runner long-polls Claim work. When a session needs a tool run, the runner receives the call, runs it, and reports the result.
- Leases keep work safe: if a runner stops sending heartbeats for 60 seconds, the call is handed to another runner. After three failed leases the agent receives a tool error.
docker run -d --restart unless-stopped \
-e SYNTIC_RUNNER_TOKEN=srt_live_… \
-v /srv/agent-workspace:/workspace \
syntic/agent-runner:1.3What runs on the runner
| Tool | Runs on the runner |
|---|---|
syntic_shell, syntic_text_editor, code execution | Yes |
Function tools with executor: client | No; your application still answers those |
| Server-run tools such as searching and fetching pages | No; Syntic runs them |
| MCP servers | No, unless the environment marks them via_runner: true, in which case the runner makes the call |
Security
- The runner only makes outbound HTTPS calls to
app.syntic.ai. - Runner tokens can only claim work for their environment; they cannot call models or read sessions.
- Run each session in its own container or VM; the runner image does this by default with one container per session.
Labels and routing
Give runners labels (gpu, eu) and set runner_selector on the environment to send its sessions only to matching runners. A session with no matching online runner waits up to 5 minutes, then fails with no_runner_available.
API reference: Self-hosted runners.
Was this page helpful?