I'm using GPT Sol and Claude Opus for free. No credit card, no per-token bill, no "you've hit your monthly limit" email.
Two pieces of software make it happen:
Here's the exact setup, from install to first prompt.
OmniRoute ships with free-tier providers pre-wired into the auto
model. You don't paste an API key — a fresh install just answers. But auto
also reaches frontier-class models through the free routes, so I can pick them by name:
aug/gpt5.6-sol # GPT Sol
aug/opus4.8 # Claude Opus
auto/best-coding # best free coding model
auto/best-reasoning # best free reasoning model
auto # let OmniRoute pick
Pi talks to one endpoint (http://localhost:20128/v1
). OmniRoute handles which provider actually serves the request, and falls back automatically if one goes down or hits a rate limit.
npm install -g omniroute
omniroute
The gateway boots on port 20128
; the dashboard is at http://localhost:20128
.
npm install -g @earendil-works/pi-coding-agent
Quick note so you install the right thing: this is the npm
pi
(@earendil-works/pi-coding-agent
), a coding agent with read / bash / edit / write tools. It's unrelated to the Rust project also calledpi-coding-agent
.
Pi reads its providers from ~/.pi/agent/models.json
. Add an omniroute
entry:
{
"providers": {
"omniroute": {
"api": "openai-completions",
"apiKey": "",
"baseUrl": "http://localhost:20128/v1",
"models": [
{ "_launch": true, "id": "auto", "input": ["text"], "reasoning": true },
{ "id": "auto/best-coding", "input": ["text"], "reasoning": true },
{ "id": "auto/best-reasoning", "input": ["text"], "reasoning": true },
{ "id": "auto/best-fast", "input": ["text"], "reasoning": true },
{ "id": "aug/gpt5.6-sol", "input": ["text"], "reasoning": true },
{ "id": "aug/opus4.8", "input": ["text"], "reasoning": true }
]
}
}
}
api: "openai-completions"
— OmniRoute speaks the OpenAI protocol.baseUrl
— the local gateway. Keep the /v1
.apiKey
— empty is fine: OmniRoute runs keyless locally. If you've created a key on the dashboard's Endpoints page, put it here instead.If you already have providers in that file, just add the omniroute
key next to them — don't overwrite the rest.
Edit ~/.pi/agent/settings.json
:
{
"defaultProvider": "omniroute",
"defaultModel": "auto"
}
Now pi
uses OmniRoute out of the box, no flags needed.
pi "fix the failing test in src" # interactive, routes through OmniRoute
pi -p "summarize this file" # non-interactive, print and exit
pi --model aug/gpt5.6-sol # GPT Sol specifically
pi --model aug/opus4.8 # Claude Opus specifically
pi --model auto/best-reasoning # best free reasoning model
pi -c # continue the last session
pi --list-models # see every available model
Switching models is one flag — no reconfiguring keys, no new accounts. If you ever want your local Ollama model back, pi --provider ollama
does it.
1. The dashboard writes the wrong file for this Pi. OmniRoute's built-in "Pi" integration (dashboard → CLI tools → Pi) writes ~/.pi/config.json
. This Pi reads ~/.pi/agent/models.json
. Edit the file by hand as above and you're done — the dashboard button won't do it for this version.
2. Bare OpenAI model names fail. Requesting gpt-5.6-luna
(no prefix) returns No active credentials for provider: openai
. The free routes are namespaced — use auto
, auto/*
, or aug/*
IDs like aug/gpt5.6-sol
.
http://localhost:20128/v1
.--model
, not a support ticket.Install OmniRoute, point Pi at it, and go. Ten minutes, and GPT Sol and Claude Opus are just models you can pick.