Skip to content
LogoLogo

Using the Pi Harness

Centaur can run Pi as a session harness alongside Codex, Claude Code, Amp, Nanocodex, and Hermes. Start a Slack thread with --pi, or set pi as a Slack channel default. Pi is available from Slack only for now.

The sandbox keeps one pi --mode rpc process per thread. Pi saves the session on disk under an id derived from the thread key, so an interrupt (which stops the Pi process, as with Claude Code), a model switch, or a sandbox restart with persistent state resumes the same conversation. Pi trusts the workspace (--approve), so it loads the skills the sandbox installs, and runs with telemetry and version checks off.

Pi's codemode tool is on, so the model can write a script that calls the other tools, for example in parallel. Each call the script makes shows up as its own tool item.

Credentials

Pi supports API-key auth only. It reads ANTHROPIC_API_KEY and OPENAI_API_KEY from the sandbox environment, where api-rs sets iron-proxy placeholders that the proxy replaces with the real keys. The sandbox has the Anthropic placeholder only when CLAUDE_CODE_AUTH_MODE is api_key, and the OpenAI one only when CODEX_AUTH_MODE is api_key; Pi uses the providers it has keys for. api-rs refuses to start with pi as the default harness when CLAUDE_CODE_AUTH_MODE is access_token.

Configuration

VariablePurpose
CENTAUR_PI_MODELDefault model as provider/id, for example anthropic/claude-opus-4-8 or openai/gpt-5.5. When unset, Pi picks a default from the providers it has keys for.

Set it through sandbox.extraEnv. A per-thread --model provider/id overrides it. Turns run at the medium thinking level unless -rsn <level> sets one for that turn (none turns thinking off).

A model must be one Centaur supports on Pi, as provider/id or a bare id:

  • anthropic/: claude-fable-5, claude-haiku-4-5, claude-opus-4-7, claude-opus-4-8, claude-opus-5, claude-opus-5-5, claude-sonnet-4-6, claude-sonnet-5
  • openai/: gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.4-pro, gpt-5.5, gpt-5.5-pro, gpt-5.6-luna, gpt-5.6-sol, gpt-5.6-terra, gpt-6-astra, gpt-6-luna, gpt-6-sol

Another model fails that turn instead of reaching Pi. Slack then clears the rejected model from the thread, so later turns run the previous model.