radioactive-ralph is provider-agnostic. The runtime dispatches claimed tasks to whichever provider CLI the variant’s config binds to. All three shipped providers — claude, codex, gemini — are external CLIs that must be installed and authenticated separately.

Claude (Anthropic)

Install

# macOS / Linux / WSL2
curl -fsSL https://anthropic.com/install.sh | sh

# Or via npm
npm install -g @anthropic-ai/claude-code

Authenticate

claude

First run prompts you to sign in at console.anthropic.com. Session tokens are cached in your user config under ~/.claude/.

Verify

claude --version
claude -p --input-format stream-json < /dev/null

The second command should print a stream-json init frame, then exit cleanly. If it prompts for auth, the session cache is missing.

radioactive-ralph stateful binding

Claude supports session resume, so the provider binding for claude is stateful — internal/provider/claudesession holds the session lifecycle across task boundaries.

Codex (OpenAI)

Install

# npm install -g @openai/codex-cli
# (tracking — verify the current package name on the OpenAI docs)

Authenticate

export OPENAI_API_KEY=sk-proj-...
codex --version

radioactive-ralph stateless binding

Codex is bound stateless in v1 — each turn is independent. If the OpenAI CLI grows session-resume, the binding can promote to stateful in a later release.

Gemini (Google)

Install

# Install the Google CLI (tracking — verify current name)
gemini --version

Authenticate

export GOOGLE_API_KEY=AIza...
gemini --version

radioactive-ralph stateless binding

Same as Codex — stateless binding in v1.

Choosing a provider per variant

Provider selection is per-variant, configured in .radioactive-ralph/config.toml:

[variants.fixit]
provider = "claude"
plan_model = "claude-opus-4-5"
plan_effort = "high"

[variants.grey]
provider = "codex"

[variants.red]
provider = "gemini"

If no provider is set, the runtime falls back to claude. Passing an unknown provider fails loudly at service start.

Verify end-to-end

After all three are installed and authenticated:

radioactive_ralph doctor

Expected:

[OK] claude       — claude X.Y.Z
[OK] codex        — codex X.Y.Z
[OK] gemini       — gemini X.Y.Z

If any provider is missing but you don’t plan to use it, that’s fine — only the providers that appear in your config.toml need to authenticate.