skip to content
Everything else

Tools

Everything else

Any tool with a base-URL field takes the same three values and lands on Conifer. Each section below gives the wiring for one tool and the one setting that commonly goes wrong.

FieldValue
Base URLhttps://api.conifer.build/v1
API key$CONIFER_API_KEY
Modelan id from the catalog

Tools that speak only the Anthropic wire drop the /v1 suffix. A tool pointed at a local model takes http://127.0.0.1:8080/v1, any non-empty key, and the served model’s name instead. See Serve an endpoint.

opencode

~/.config/opencode/opencode.json
{
  "provider": {
    "conifer": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Conifer",
      "options": {
        "baseURL": "https://api.conifer.build/v1",
        "apiKey": "{env:CONIFER_API_KEY}"
      },
      "models": {
        "claude-haiku-4-5": {},
        "claude-fable-5": {},
        "gpt-5.5": { "options": { "reasoningEffort": "none" } }
      }
    }
  }
}
terminal
opencode run --model conifer/claude-haiku-4-5 "add error handling to fetchUser"

The reasoningEffort line keeps reasoning off on gpt-5.5. opencode sends its tool set on every turn, and that model family will not take function tools with reasoning on. Claude ids need nothing extra. opencode’s prompt caching applies to them and the cache reads show on the receipt.

Pi

~/.pi/agent/models.json
{
  "providers": {
    "conifer": {
      "baseUrl": "https://api.conifer.build/v1",
      "api": "openai-completions",
      "apiKey": "$CONIFER_API_KEY",
      "models": [
        { "id": "claude-haiku-4-5", "name": "Claude Haiku (Conifer)", "contextWindow": 200000, "maxTokens": 32000 }
      ]
    }
  }
}

The $ in apiKey is Pi’s environment interpolation, resolved on each request. Without it Pi sends the literal variable name as the key and gets a 401. Then run it.

terminal
pi --provider conifer --model claude-haiku-4-5 "review this diff for races"

Aider

terminal
export OPENAI_API_BASE=https://api.conifer.build/v1
export OPENAI_API_KEY=$CONIFER_API_KEY
aider --model openai/claude-haiku-4-5

The openai/ prefix tells Aider which client to use. The rest of the id is the catalog model.

Continue and any base-URL field

Enter the three values from the table above wherever the tool keeps its provider settings. The key is yours, so the tool bills to your Conifer account and every turn gets a receipt. An agent loop needs tools, so check caps on the catalog before pointing a tool at an unfamiliar id. A tool that speaks only the Anthropic wire follows the Claude Code page. Cursor and VS Code have their own pages.

OpenClaw, Hermes & droid

Install each one the upstream way. OpenClaw and droid speak the Anthropic wire, so point them at https://api.conifer.build with no /v1, put your key in the apiKey field and name a claude-* id from the catalog. All three send a large tool preamble, so pick a model with a context window of at least 8,750 tokens for OpenClaw, 13,500 for droid and 18,000 for Hermes.

openclaw.json
{
  "models": { "providers": { "conifer": {
    "baseUrl": "https://api.conifer.build",
    "apiKey": "sk-conifer-…",
    "api": "anthropic-messages",
    "models": [{ "id": "claude-haiku-4-5", "name": "Conifer", "contextWindow": 200000, "maxTokens": 8192 }]
  } } },
  "agents": { "defaults": { "model": { "primary": "conifer/claude-haiku-4-5" } } }
}

OpenClaw needs Node 22.19 or newer. Set contextWindow to the model’s window from the catalog. Pointed at a local endpoint it also needs "request": { "allowPrivateNetwork": true } in the provider block, or it drops loopback requests silently.

config.yaml
model:
  provider: "custom"
  base_url: "http://127.0.0.1:8080/v1"
  default: "<model>"

Hermes speaks the OpenAI chat wire and keeps the /v1. It will only send OPENAI_API_KEY to OpenAI’s own host, so the recipe here runs it against a local conifer serve endpoint. HERMES_MANAGED_DIR names the directory that holds config.yaml, not the file itself.

conifer-droid-settings.json
{
  "customModels": [
    {
      "provider": "anthropic",
      "baseUrl": "https://api.conifer.build",
      "apiKey": "sk-conifer-…",
      "model": "claude-haiku-4-5",
      "displayName": "Conifer"
    }
  ],
  "model": "custom:Conifer-0"
}

Launch droid as droid --settings /path/to/conifer-droid-settings.json. The model value custom:Conifer-0 selects the first customModels entry by display name and index, so it changes if you rename the entry.

Conductor, cmux & Zed

Wrappers launch the same binaries, so they need the same two values, put where each wrapper reads them.

Conductor: Settings, Env
ANTHROPIC_BASE_URL=https://api.conifer.build
ANTHROPIC_AUTH_TOKEN=sk-conifer-

In Conductor, leave ANTHROPIC_API_KEY unset both in Conductor and in the shell that launches it, or Claude Code may go to Anthropic directly. Codex sessions read ~/.codex/config.toml, so the Codex page covers them.

~/.claude/settings.json
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.conifer.build",
    "ANTHROPIC_AUTH_TOKEN": "sk-conifer-…"
  }
}

cmux strips ANTHROPIC_* variables when it spawns an agent, so put the endpoint in Claude Code’s own settings file instead. That block applies machine-wide and stores the key in plaintext. Delete it to undo both.

settings.json
{
  "language_models": {
    "anthropic_compatible": {
      "Conifer": {
        "api_url": "https://api.conifer.build",
        "available_models": [
          { "name": "claude-haiku-4-5", "display_name": "Claude Haiku (Conifer)", "max_tokens": 200000, "max_output_tokens": 32000 }
        ]
      }
    },
    "openai_compatible": {
      "conifer": {
        "api_url": "https://api.conifer.build/v1",
        "available_models": [
          { "name": "gpt-5.5", "display_name": "GPT-5.5 (Conifer)", "max_tokens": 1050000 }
        ]
      }
    }
  }
}

In Zed the key does not go in the file. Enter it in the Agent Panel’s provider settings, or export it, since a provider named conifer reads CONIFER_API_KEY. Copy max_tokens from the catalog, because Zed budgets context by the number you write. A tool with no environment settings, no config file and no base-URL field has no path yet. Antigravity is in that state today.

The agent catalog

conifer agents list prints every terminal agent the CLI can wire, with the wire it speaks, whether the CLI launches it or only configures it, and whether it is installed. conifer agents show <id> prints the full spec, conifer agents install <id> runs the upstream installer, and conifer agents add my-agent.json registers one of your own.

terminal
$ conifer agents list
ID            WIRE              INTEGRATION  STATUS        ORIGIN         INSTALLED  VERSION
claude-code   anthropic         cli          supported     builtin        yes        2.1.220
codex         openai-responses  cli          supported     builtin        yes        0.144.0
aider         openai-chat       cli          supported     builtin        no         -
droid         anthropic         cli          supported     builtin        no         -
openclaw      anthropic         cli          supported     builtin        no         -
hermes        openai-chat       cli          supported     builtin        no         -
opencode      openai-chat       configure    supported     builtin        n/a        -
pi            openai-chat       configure    supported     builtin        n/a        -

Prove the redirect

terminal
curl -sI https://api.conifer.build/v1/models \
  -H "Authorization: Bearer $CONIFER_API_KEY" | head -1   # HTTP/2 200 = key and route are live

Then run one live turn. Every response from Conifer carries an x-conifer-request-id header and, on a buffered call, the cost. If a turn comes back without them, the tool went to the provider directly and not through Conifer.