Skip to main content
oh-my-pi (command omp, also known as pi-mono — the same project) is a minimal, extensible terminal coding agent.
Protocol: OpenAI-compatible
  • Base URL: https://api.orcarouter.ai/v1 (includes the /v1 suffix)

Install

bun install -g @oh-my-pi/pi-coding-agent
Requires bun >= 1.3.14. The installed command is omp.

Configure

First export your API key as an environment variable:
export ORCA_KEY="sk-orca-..."
Config file: ~/.omp/agent/models.yml.
providers:
  orcarouter:
    baseUrl: https://api.orcarouter.ai/v1
    api: openai-completions
    apiKey: ORCA_KEY
    authHeader: true
    models:
      - id: orcarouter/auto
        name: OrcaRouter Auto
        reasoning: false
        input: [text]
        contextWindow: 200000
        maxTokens: 8192
        compat:
          supportsDeveloperRole: false
          maxTokensField: max_tokens
Swap orcarouter/auto for a specific model if you prefer, e.g. anthropic/claude-opus-4.8 or google/gemini-2.5-flash. Model IDs always use the vendor/model format.

Run

omp -p --model "orcarouter/orcarouter/auto" "Reply with exactly: OK"
Expected output: OK.

Notes

  • Requires bun >= 1.3.14.
  • The base_url must include /v1.
  • The apiKey field takes the name of an environment variable, not the key itself; with authHeader: true it is sent as Authorization: Bearer <value>.
  • Model references use the provider/model format — here orcarouter/orcarouter/auto (provider orcarouter + model ID orcarouter/auto).
  • Use -p for non-interactive runs.
  • oh-my-pi and pi-mono are the same project; the command is omp in both.

Enable thinking / reasoning

The default model entry above has reasoning: false. To enable reasoning and allow effort selection, declare a thinking block plus a compat.reasoningEffortMap on the model:
models:
  - id: anthropic/claude-sonnet-4.6
    name: Claude Sonnet 4.6
    reasoning: true
    thinking:
      minLevel: low
      maxLevel: xhigh
      mode: effort
    input: [text]
    contextWindow: 200000
    maxTokens: 8192
    compat:
      supportsDeveloperRole: false
      supportsReasoningEffort: true
      maxTokensField: max_tokens
      thinkingFormat: openai
      reasoningEffortMap: { low: low, medium: medium, high: high, xhigh: high }
Then pick an effort level at runtime with a model:level suffix (within minLevel..maxLevel):
omp -p --model "orcarouter/anthropic/claude-sonnet-4.6:high" "What is 17*23?"
Verified: the :high suffix selects the effort level and works against OrcaRouter.