AgentsSelf-hosted runners

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

  1. Create an environment with "hosting": "self_hosted".
  2. Register a runner for it and install the runner on your machine with the token you receive.
  3. The runner long-polls Claim work. When a session needs a tool run, the runner receives the call, runs it, and reports the result.
  4. 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.3

What runs on the runner

ToolRuns on the runner
syntic_shell, syntic_text_editor, code executionYes
Function tools with executor: clientNo; your application still answers those
Server-run tools such as searching and fetching pagesNo; Syntic runs them
MCP serversNo, 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?