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.
| Field | Value |
|---|---|
| Base URL | https://api.conifer.build/v1 |
| API key | $CONIFER_API_KEY |
| Model | an 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
{
"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" } }
}
}
}
}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
{
"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.
pi --provider conifer --model claude-haiku-4-5 "review this diff for races"Aider
export OPENAI_API_BASE=https://api.conifer.build/v1
export OPENAI_API_KEY=$CONIFER_API_KEY
aider --model openai/claude-haiku-4-5The 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.
{
"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.
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.
{
"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.
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.
{
"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.
{
"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.
$ 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
curl -sI https://api.conifer.build/v1/models \
-H "Authorization: Bearer $CONIFER_API_KEY" | head -1 # HTTP/2 200 = key and route are liveThen 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.