Pull-workers

Instead of routsi hosting an agent, a remote worker registers a named queue and answers requests routed to it. The worker is outbound-only — credentials never leave its machine.

Register & answer

on any machine with an agent logged in
routsi worker run --proxy https://your-proxy:8080 --queue my-agent \
  --agent 'codex exec --skip-git-repo-check -'   # reads the question on stdin

# now {"model":"my-agent"} routes to that worker; shows in /v1/models,
# /v1/workers (live status), and the dashboard. No worker live? → fast 503.

routsi install --skills    # install the worker as an agent skill (~/.claude, ~/.codex)
A queue is a normal routable model. One worker per queue in v1; delivery is at-most-once; no worker auth yet (reserved workers.auth placeholder).

Full walk-through, including a live request: Scenarios → Pull-worker.

Tool calling — a live agent as an OpenAI model

The queue path speaks OpenAI function calling: a request's tools ride along in the job, and the worker may answer with tool calls instead of text. The client executes them and sends the results back as the next request — the worker only decides.

worker answers a job with a tool call
curl -s -X POST "$PROXY/v1/workers/my-agent/jobs/$JOB_ID" \
  -H 'Content-Type: application/json' \
  -d '{"tool_calls":[{"name":"write","arguments":{"filePath":"a.txt","content":"hi"}}]}'

# → the client receives a wire-correct response:
#   finish_reason:"tool_calls", string-encoded arguments, generated call ids

This makes a long-lived interactive agent TUI (devin, Claude Code, codex) a first-class model for any OpenAI client. Live-proven: opencode built and refactored apps using devin / Claude Code / codex TUIs as its model — 7–14 tool-call rounds per task, three worker queues on one proxy. A job is handed to the TUI as a file, so there is no prompt-size ceiling (one-shot devin -p dies near ~80KB — smaller than opencode's system prompt), and the session stays warm.

serve a queue with a live agent TUI — built into the CLI
routsi worker join --queue devin-live --workdir ~/devin-jobs \
  --notify 'tmux send-keys -t devin "Read $ROUTSI_JOB_FILE and follow its HOW TO ANSWER section." Enter'
# jobs land as files (no size limit); the agent answers by writing answer-<id>.json
# ({"content"} or {"tool_calls"}); join re-nudges every 45s and posts it back
Setup guide: examples/interactive-worker. Evidence: spike 006. The routsi install --skills agent skill documents the answer contract for agent-driven workers.

Next: Auth & mTLS →