---
sidebar_label: Choose a Runtime
---

# Choose an agent runtime

> **Claude Code is the stable default.** The fleet agents have run on Claude Code in production for a long time; it is what a new installation gets unless you ask for something else. **pi and codex are experimental** — pi works end to end for `triage`, `prioritize`, `code`, `fix` and `review`/`retro`; codex runs OpenAI models through the same secretless credential path but has no sub-agent roster yet, so `review`/`retro` are best left on Claude Code there. Neither runtime has completed a fleet pilot. Unless you are taking part in one, keep the default.

This page explains what the choice means and where it is made. **You do not select anything on this page** — the selection happens in the next step. On GitHub, [Configuring GitHub](configuring-github.md) asks when you run `fullsend github setup` (press Enter for `claude`) or you pass `--runtime`. On GitLab, pass `--runtime` to `fullsend repos install` — see [Configuring GitLab](configuring-gitlab.md).

Fullsend supports multiple agent runtimes. A runtime is the program that runs inside the sandbox and drives the model — it owns the tool-use loop, hook wiring, and transcript format. The runner (fullsend) owns everything outside: sandbox lifecycle, credentials, metrics, and the verdict.

## Available runtimes

| Runtime | Status | Description | When to use |
|---------|--------|-------------|-------------|
| `claude` | **Stable (default)** | Claude Code on Vertex AI | Every production deployment — mature, full sub-agent support for `review`/`retro` |
| `pi` | Experimental (enablement phase) | [Pi](https://github.com/earendil-works/pi) — Claude on Vertex by default; any provider pi supports by model name (e.g. Gemini on Vertex with the same credentials) | Opt-in pilots only; see [Runtimes](../../runtimes.md) for known constraints |
| `codex` | Experimental | [Codex](https://github.com/openai/codex) — OpenAI models only, through the same secretless credential path | Opt-in pilots only, when you want GPT specifically. No sub-agent roster, so keeping `review`/`retro` on Claude Code is recommended; needs an OpenAI model named (`FULLSEND_CODEX_MODEL`) because the fleet harnesses ask for `opus`; see [Codex](../../runtimes/codex.md) |

## When and how the runtime is selected

1. **Next step — configure the forge.** On GitHub, `fullsend github setup <owner/repo>` asks which runtime to use when run from a terminal; press Enter to keep `claude`. Passing `--runtime` skips the prompt. The setup PR it opens records the choice in `.fullsend/config.yaml`. On GitLab, pass `--runtime` to `fullsend repos install` (there is no interactive prompt). Nothing runs on this page — continue with [Configuring GitHub](configuring-github.md) or [Configuring GitLab](configuring-gitlab.md).
2. **Later — changing it.** Edit `runtime:` in the repo's `.fullsend/config.yaml` (the setup PR shows the key), or, on GitHub, re-run `fullsend github setup <owner/repo> --runtime <claude|pi|codex>` (GitHub-only; it does not update a GitLab install). To put one agent on a different runtime or model than the rest — say `code` on Claude Code while `triage` runs Grok on pi — set `runtime:` on that agent's `agents:` entry in the same file (`fullsend agent set code --fullsend-dir .fullsend --runtime claude`); see [Runtimes — per-agent settings](../../runtimes.md#per-agent-runtime-model-and-effort). On GitLab (and for fleets managed through `repos.yaml` generally), edit `.fullsend/config.yaml` directly for repos that are *not* config-managed — converge does not rewrite that file for already-installed unmanaged repos, so neither `repos set-default defaults.runtime` nor a per-entry `runtime` plus `repos install` changes an existing repo's runtime. Config-managed repos (opted in via `defaults.config` or a repo's `config:` block, see [Repository Management](repo-management.md)) are the exception: editing `runtime` in `repos.yaml` and running `repos install` does update the installed `.fullsend/config.yaml`, since install and convergence rewrite the managed configuration as a whole file. `--runtime` on `repos install` only applies to repos newly added by that command. For a single agent, `fullsend agent set code --fullsend-dir .fullsend --runtime claude` also works. See [fullsend repos](../../cli/repos.md).
3. **Per run — trying without changing the repo.** `fullsend run --runtime pi --model google-vertex/gemini-2.5-flash`, or the `FULLSEND_RUNTIME` / `FULLSEND_MODEL` / `FULLSEND_EFFORT` environment variables (flag beats environment beats the agent's `agents:` entry beats repo-wide config). In CI the same names work as repository variables. Reference: [fullsend run](../../cli/run.md) and [Runtimes — selecting and overriding](../../runtimes.md#selecting-a-runtime-and-model).

## Where to see what ran

After a run completes, the selected runtime and model appear in several places:

- **Run plan block** — `Runtime: <name> (from <source>)` printed at the start of every `fullsend run`
- **Status comment** — the terminal status comment on the issue/PR includes a footer with runtime, model, effort, and cost (see [Cost data contract](../infrastructure/distributed-tracing.md#cost-data-contract) for how cost is sourced and aggregated)
- **metrics.json** — `runtime`, `requested_runtime`, `runtime_source`, `requested_model`, and `override_source` fields record what was selected and why
- **stderr** — `runtime: selected "<name>" from <source>` for script consumers

## Next steps

- [Configuring GitHub](configuring-github.md) or [Configuring GitLab](configuring-gitlab.md) to set up your repo
- [Runtimes](../../runtimes.md) for the full runtime reference, including model override precedence and the capability table
