Skip to content

Agent runtimes

A runtime is the agent program fullsend runs inside the sandbox — the thing that talks to the model and executes tool calls. fullsend run delegates to it and owns everything around it: the sandbox, the credentials, and the verdict.

RuntimeUse it forStatus
claudeProduction agent runs (Claude Code)Default
piSecond runtime, opt-in per org/repo — Claude, Grok and GeminiSupported for triage, prioritize, code, fix
dummyBehaviour tests — scripted ops, no inferenceInternal
opencodeNot yet functionalStub

Pick one with runtime: in .fullsend/config.yaml, or per run with --runtime.

bash
fullsend run triage --runtime pi --model xai-vertex/xai/grok-4.6

How a run uses the runtime

The runner owns the sandbox, credentials and verdict; the runtime owns what happens between "start" and "event stream".

Loading diagram...

Choosing between claude and pi

Claude Codepi
ModelsAnthropic on VertexClaude, Grok and Gemini on Vertex
Sub-agentsNative (Agent tool)Not wired — agents execute sub-agent definitions inline (#6527)
Fallback model chainFULLSEND_FALLBACK_MODELS, tried in orderIgnored with a warning
RolesAllreview/retro stay on Claude Code — they rely on sub-agent rosters
Effort--effort low..max--thinking, same levels (high when unset)
Security controlsFull matrixFull matrix; stricter on failed-call sanitizing

Both run unattended in the same sandbox, on the same WIF credentials, behind the same egress allowlist. Choose pi when you want a non-Anthropic model; stay on claude when you need sub-agents or a fallback chain.

Selecting a runtime and model

First non-empty wins — the usual flag > env var > config > default. fullsend run resolves this once, validates it, prints the source, and records it in metrics.json; runtimes never read the override variables themselves.

Loading diagram...
SettingFlagEnvConfig
Runtime--runtimeFULLSEND_RUNTIMEruntime: in .fullsend/config.yaml
Model--modelFULLSEND_MODEL (FULLSEND_PI_MODEL is a lower-precedence alias on pi)harness model:, then agent frontmatter model:
Effort--effortFULLSEND_EFFORTharness effort:

In CI these are repository variables of the same name, plain or role-prefixed (TRIAGE_FULLSEND_MODEL), so a repo can switch one role's model without a pull request. Harness env.runner does not reach the fullsend process.

Set the runtime per repo with fullsend github setup <owner/repo> --runtime pi. Repos on pi need a sandbox image that carries PI_VERSION.

Models

On Claude Code, pass an alias (opus, sonnet, haiku, fable) or a model id.

On pi, a model is provider/id — aliases and bare ids still work, and the provider comes from FULLSEND_PI_PROVIDER (default anthropic-vertex). pi reaches Claude, Gemini and Grok, each through its own provider; see Pi › Models and providers.

Because harness model: cannot contain / (validModelName is ^[a-zA-Z0-9_.@-]+$), a harness selects a pi provider with a bare model: plus FULLSEND_PI_PROVIDER.

Where the selection appears

SurfaceWhat it shows
Run plan blockRuntime: <name> (from <source>) next to Model and Effort
stderrruntime: selected "<name>" from <source>
Status comment / ::notice::Runtime · Model: <requested → reported> · Effort · Cost
OTel spanfullsend.runtime, next to gen_ai.request.model
metrics.jsonruntime, requested_runtime, runtime_source, requested_model, override_source

requested_model is what was handed to the runtime after overrides, and override_source says where it came from — so a silent override is visible after the fact. The reported model is the provider-stripped id (claude-opus-4-6); for a provider whose ids are publisher-qualified it keeps that segment (xai/grok-4.6), since that is the wire id.

Harness config keys per runtime

Harness keys are runtime-neutral in YAML; each runtime owns the translation.

Harness keyClaude Codepi
model--modelalias table, then provider/id; see Models
effort--effort--thinking (superset of the harness levels; high when unset)
tools:Native Claude permission syntax--tools (strict) + a first-token Bash allowlist
skillsCLAUDE_CONFIG_DIR/skills/PI_CODING_AGENT_DIR/skills/, discovered natively
pluginsMarketplace layoutUnsupported — warned and skipped
security.sandbox_hookshooks.json via --settingsHook scripts + manifest + adapter extension
validation_loop.feedback_modeReplaces the prompt on retrySame

Full per-key detail, including the exact --tools mapping and allowlist parsing rules, is in Implementing an agent runtime.

Content