OpenRouter
Many hosted models under one key. Pricing and cache support follow whichever model you select.
OPENROUTER_API_KEYreference · /help answers many of these topics inside the session
squeezy runs on the model you choose. Reading your code, checking permissions, and counting the spend all happen on your machine; what reaches the provider is the request for that turn.
contents
squeezy works with 27 providers, and the tables below list every one. The quickest start is an aggregator: one key reaches many hosted models. A vendor's own API, a subscription you already pay for, your cloud account, a dedicated model host, and a server on your own machine all work the same way. Pick one, then give it a credential. Each row names what that provider reads.
The first launch walks you through it: a theme, then a provider, then a model, then how hard that model should think. When the provider needs a credential, one more step takes the key or starts the sign-in. What it saves is a named model config in your own settings, with your everyday work pointed at that name.
Later, squeezy auth set <provider> stores a key in your
protected User credential store. Add --local to keep it in
this checkout's protected store instead. It reads the key from
standard input, so nothing lands in your shell history. The two
subscription sign-ins have commands of their own:
squeezy auth openai-codex login, and
squeezy auth github-copilot login.
Two commands tell you whether it worked.
squeezy auth status reports which providers have a
credential and where each one resolved from.
squeezy providers list prints every provider with the
address it calls, the environment variable it reads, and whether it is
configured. If a matching variable is exported for this launch it
beats a key in protected storage, and squeezy auth set
reports that shadowing rather than implying the stored key took effect.
One account in front of models from several vendors, so you can try a model without opening an account with the vendor behind it.
Many hosted models under one key. Pricing and cache support follow whichever model you select.
OPENROUTER_API_KEYHosted model access through Vercel, on one gateway key.
AI_GATEWAY_API_KEYVirtual keys, routing, and observability in front of your own provider integrations.
PORTKEY_API_KEYAn org-wide proxy in front of your chosen models. An optional gateway token sets its own header alongside the upstream key.
CLOUDFLARE_API_KEYThe vendor's own API, billed against a key you create there. Anthropic requires an API key from the Anthropic Console.
OpenAI's own API, on its responses endpoint, with per-turn usage and cache accounting read back from the stream.
OPENAI_API_KEYAnthropic's own API. Takes an API key and reports cache reads and writes separately.
ANTHROPIC_API_KEYGoogle's direct Gemini API, distinct from Vertex AI. Keys are managed in Google AI Studio. Reads GOOGLE_API_KEY, and accepts the Gemini-branded GEMINI_API_KEY as well.
GOOGLE_API_KEY
A plan you already pay for, used instead of a metered key. Each sign-in
prints a URL and tries to open it in your browser;
--no-browser skips the launch and leaves you the URL, which
is what a machine you reached over SSH wants. Finishing it takes one more
step, and which one depends on the provider: a short code to type into
the page, or the browser's result copied back to the terminal. squeezy
keeps the token from there on.
A ChatGPT Plus or Pro subscription instead of a metered key. Sign in with squeezy auth openai-codex login.
ChatGPT sign-inA GitHub Copilot subscription instead of a metered key. Sign in with squeezy auth github-copilot login.
Copilot sign-inModels billed to a cloud account you already have, reached with the credentials that account already gives you.
Models on your AWS account, through the credential chain you already use: environment keys, a named profile, an instance role, or a Bedrock API key.
AWS credentialsYour own Azure deployment, by endpoint and deployment name, with an API key or an Entra ID bearer token.
AZURE_OPENAI_API_KEYGemini and Claude models on Google Cloud, via Application Default Credentials or a short-lived access token.
Google Cloud authEach serves its own catalog and takes its own key.
Hosted open-weight models: Llama, gpt-oss, Qwen.
GROQ_API_KEYHosted open-weight models: gpt-oss, GLM.
CEREBRAS_API_KEYThe DeepSeek models, from DeepSeek itself.
DEEPSEEK_API_KEYHosted open-weight models: Llama, Qwen, DeepSeek.
TOGETHER_API_KEYHosted open-weight models: Llama, DeepSeek.
FIREWORKS_API_KEYHosted open-weight models: Llama, Qwen, DeepSeek.
DEEPINFRA_API_KEYHosted open-weight models: Kimi, DeepSeek, GLM, Nemotron.
BASETEN_API_KEYThe Mistral and Ministral models, from Mistral itself.
MISTRAL_API_KEYxAI's Grok models.
XAI_API_KEYOpen-weight models served from Cloudflare's network: Llama, DeepSeek, Gemma, Kimi.
CLOUDFLARE_API_KEYA model server you run needs no key, and squeezy calls that runtime's usual local address unless you name a different one. Name the model too: only you know which one you loaded, so there is no default to fall back on. The last row is the escape hatch: any endpoint that speaks the same request format as OpenAI's chat API, including a proxy you host yourself. For that one you supply the address and the name of the variable holding the key.
Whatever your Ollama server has pulled. squeezy asks it what it holds and how much context each model has.
no key neededWhatever your LM Studio server has loaded.
no key neededA vLLM server you run yourself.
no key neededA llama.cpp server you run yourself.
no key neededPoint the openai_compatible preset at any other endpoint that speaks the OpenAI chat-completions API, a self-hosted LiteLLM proxy included. You name the base URL and which environment variable holds the key.
custom base URLEvery provider above has a short id. In a settings file you write that id into a model config: a provider, a model, and any knobs you want, kept together under a name you choose. You then point your everyday work at the name. It is the same shape the first launch writes for you, so the first edit you make by hand is a variation on something rather than a cold start.
[models.work]
provider = "openrouter" # a provider id from the tables above
model = "anthropic/claude-sonnet-5" # an exact id that provider serves
[roles]
build = "work" # the config your everyday work runs on
[providers.openrouter]
api_key_env = "OPENROUTER_API_KEY" # credential identity only; use `squeezy auth set openrouter`
Model configs belong to you, not to a repository. A provider config
can name a credential identity, but never carries the secret itself;
shared squeezy-settings.toml files cannot own credentials.
squeezy config init --user writes a commented starter file
in the right place. Store the secret with
squeezy auth set <provider>; the
api_key_env line is only the profile's credential
identifier. A provider's ambient variable remains useful for one
launch or CI.
For one run, --provider <id> on its own is enough,
and the model falls back to that provider's default -- except on Azure
OpenAI, PortKey, and a server on your own machine, which have no
default to fall back on and ask for an exact id.
On top of the built-in defaults, a setting can come from six places:
your personal settings, the project's squeezy-settings.toml,
per-machine settings for that project, the environment, the flags you
launched with, and the session itself. Each one overrides the one
before it. When a value is not what you expected,
squeezy config show model.provider names which place it
came from, and squeezy config dump prints the whole merged
result with secrets redacted. The
configuration page covers the layers in
full.
Turn routing is on by default. Left to itself, every turn starts on the model you chose. When the work looks self-contained and mechanical, the rest of that turn can run on the model you pointed routing at; when it turns out to be harder than that -- tool calls piling up, errors, a refusal -- the same turn steps back up without starting over. That model is one you name, and it runs on whichever provider profile you gave it: point it at the exact profile your main model uses and your traffic and bill stay there, or point it anywhere else -- another vendor, or a second profile of your own on the same vendor -- and that turn bills to the key that profile names. Same vendor is not the same account: a sibling profile with its own credential is billed as its own. Naming a cheaper one is the whole point, but nothing here checks a price list -- the turn goes where you pointed it. Nothing routes at all until you point it somewhere, so a session with neither a cheaper nor a more capable model configured simply stays on yours.
You can decide it by hand for one turn. /router cheap runs
the next turn on the model you pointed routing at, or on your own model
when nothing is pointed there -- an unset pointer, one resolving to the
very Model profile you are already on, or one whose provider will not
build -- so the turn runs rather than being refused. A second profile of
your own naming that same model is a rung in its own right, and
/router cheap runs on it. /router main runs it on
the active role's Model profile; either takes the prompt on the same
line.
/model switches which saved config the session runs, and
that switch applies at once without touching a file, with a separate
key on the same screen to write it down. See
how it works for the full picture, or
run squeezy help providers for the same reference offline.