Repository navigation
Releases: schowave/llmenu
Release list
v0.11.0
GitHub Copilot CLI
llmenu copilot picks a model in the menu and starts GitHub Copilot CLI with it, using your gateway as Copilot's own provider (BYOK). No GitHub login is needed, and ~/.copilot stays untouched.
llmenu copilot # menu, then Copilot starts
llmenu copilot -p "fix the failing test" # no terminal: copilot.default
llmenu copilot --model azure/gpt-6-sol # no menu- Protocol: Copilot speaks Chat Completions to
<gateway>/v1by default.llmenu config set copilot.provider_type anthropicswitches to the Messages API. - Offline:
llmenu config set copilot.offline truealso turns off telemetry, web tools and auto-update. - Model details: Copilot gets the model's context and output limits from the gateway. Claude models also get their Anthropic ID, so Copilot counts tokens correctly.
- Setup:
llmenu setup copilotasks for the default model, protocol and offline mode. Copilot is also in the list of tools inllmenu setup tools. providers.jsonwarning: if a~/.copilot/providers.jsondeclares providers, Copilot ignores what llmenu passes, and llmenu warns about it at startup.
Setup: back to the list
llmenu setup without a section now returns to the list after each section, ticks the ones you have done and ends with Done. Esc in a section goes back to the list without saving it. Errors such as an unreachable gateway no longer end the setup. In other dialogs, Esc now cancels like Ctrl+C.
v0.10.0
All gateway models in Claude Code's /model
In a session started with llmenu claude, /model now lists all of the gateway's models instead of Claude's own, with context, prices and benchmark, sorted like the menu. You can switch models without restarting:
2. aws/claude-opus-5-5 ✔ 1M · $4.40 in / $22.00 out · intelligence 57.6
3. azure/gpt-6-sol 922k · $2.00 in / $10.00 out · intelligence 47.6
6. gcp/claude-sonnet-4-5 200k · $3.00 in / $15.00 out, more above 200k · intelligence 20.7
Pick with s (this session only). If you press Enter, Claude Code saves the gateway model as its default in ~/.claude/settings.json. A plain claude on your subscription then fails with "There's an issue with the selected model". Run /model once and pick one of Claude's own models to fix it.
To keep Claude's own list: llmenu config set claude.picker false.
Project and spend in the status line, on by default
Sessions started with llmenu claude now show the project and the key's budget below your own status line without any setup:
project acme · team budget $40.00 / $100.00 · this key $12.45 · resets in 19d
To turn it off: llmenu config set claude.statusline false. If you answered "No" to this in an earlier llmenu setup claude, that answer was not stored, so the status line is now on for you too.
v0.9.0
Long-prompt prices at a glance
A * after the output price marks models that cost more once the prompt is long, in the menu and in llmenu list. Claude Haiku 5.5, for example, costs five times as much above 100k tokens, a size Claude Code sessions reach quickly. The preview lists the levels:
aws/claude-haiku-5-5 1M 0.11 0.55*
Free or unknown, not 0.00
A model whose gateway price is 0, e.g. a self-hosted one, now shows free. If the gateway names no price at all, the table shows - and the preview says the price is unknown. Before, both looked like 0.00. llmenu list --json has a new no_price field.
Speed and long-context reasoning in the preview
The benchmark block in the preview now also shows the model's output speed in tokens per second and Artificial Analysis' Long Context Reasoning score:
Benchmarks (claude-sonnet-5-5)
Intelligence 56.0
Terminal-Bench 63.6 %
Long context 82.7 %
Output speed 141 tok/s at the provider
The speed is measured at the model's own provider, not through your gateway, so take it as a guide. Both values appear after the next benchmark refresh; run llmenu bench to get them now.
The Coding Index column only when you sort by it
Artificial Analysis no longer publishes the Coding Index for most current models, so the column was mostly -. It now appears only while you sort by it (Tab in the menu, or bench.metric = code); the preview still shows the value.
Upgrade
brew update && brew upgrade --cask llmenu
llmenu benchv0.8.2
The budget stays in Claude Code's status line
With a project key, the status line shows the key's budget. On gateways with large teams, LiteLLM's /user/info takes over a second, and the status line often gave up before it answered; after an hour without a fresh value the budget disappeared. llmenu now asks /user/info at the same time as /key/info instead of after it, and the status line waits up to 3 seconds. Thanks to the one-minute cache, that wait comes at most about once a minute.
Long-prompt prices in opencode
llmenu sync now writes opencode's context_over_200k price for models whose gateway price rises at 200k tokens. opencode knows only this one threshold, so levels at other sizes (e.g. 100k or 272k) are left out rather than billed at the wrong size.
Upgrade
brew update && brew upgrade --cask llmenu
llmenu sync # if you use opencodev0.8.1
Faster start
The menu no longer waits for the key's budget. On gateways with large teams, LiteLLM's /user/info alone can take over a second, and the menu waited for it on nearly every start. It now opens as soon as the models are loaded; the budget appears in the top right when it arrives.
Upgrade
brew update && brew upgrade --cask llmenuv0.8.0
Correct prices for Vertex AI on regional endpoints
LiteLLM bills Vertex AI models on a regional endpoint (a vertex_location other than global) with the model's regional_endpoint_uplift_multiplier on top, typically +10 %. llmenu showed the price without it, so gcp/ models looked cheaper than their aws/ twins although they cost the same. The uplift is now included everywhere: the menu, llmenu list, sorting, the slot suggestions for Claude Code, and the prices llmenu sync writes into pi and opencode. Where both cost the same, the suggestion may now be the aws/ model instead of the gcp/ one.
Prices for long prompts
Some models cost more once the prompt crosses a size, e.g. Claude Haiku 5.5 five times as much above 100k tokens, or GPT 6 twice the input price above 272k. Above the threshold LiteLLM bills the whole request at the higher price. The preview now lists these levels under the prices:
$ per 1M tokens
in 0.11 · out 0.55
prompt > 100k: in 0.55 · out 2.75
Upgrade
brew update && brew upgrade --cask llmenuv0.7.1
The same model at several providers stays selectable
If your gateway offers a model at more than one provider, e.g. aws/claude-haiku-5-5 and gcp/claude-haiku-5-5, the menu and llmenu list now show both, so you can pick the provider. Before, llmenu showed only one of them. Aliases such as aws/claude-opus-latest stay hidden, and copies of a model at the same provider (e.g. several regions) are still shown once.
Upgrade
brew update && brew upgrade --cask llmenuv0.7.0
A project per folder
A folder can now have its own project, so the right key is used in each customer's repository without switching. Outside your home directory, llmenu project asks after the choice:
Applies to
> Only in ~/repos/acme and below
Everywhere
Remove the project of ~/repos/acme (use the global choice, …)
Choosing again in the same folder replaces its project. Subfolders follow it, a global switch leaves it alone, and LLMENU_PROJECT still wins. Without the picker: llmenu project use acme --here and llmenu project unpin. llmenu project list shows all bound folders. The bindings live in llmenu's config, not in the repository.
A default tool for llmenu
llmenu without a command can now start your tool after the menu, so you need not type llmenu claude every time. The setup asks for it; if you are already set up, llmenu asks once. Change it with llmenu default (a list), llmenu default codex, or llmenu default --none to only print the model name. Captured as in "$(llmenu)", it always prints only the name, so scripts keep working.
llmenu reset
Removes everything llmenu stored, to start over or before uninstalling: settings, all keys in the keyring (projects included), caches, and the provider entry llmenu sync wrote into pi and opencode (the previous file stays as *.bak; entries llmenu did not write stay). It lists what it removes and asks first; --dry-run only lists, --yes skips the question. The README's manual removal steps are replaced by it.
Upgrade
brew update && brew upgrade --cask llmenuv0.6.0
Budget and spend
llmenu now shows the budget of the key you are using and how much of it is gone:
- In the menu, next to the project:
user budget $18.00 / $50.00 · this key $12.45 · resets in 19d. On a narrow table the details are shortened rather than running into the search field. - In
llmenu project list, a new SPEND column for the main key and every project. - In Claude Code's status line (see below).
A project's team key spends from its team's budget, a personal key from your user budget; a key's own budget is shown if it has less left. Without any budget llmenu shows what the key has spent. The numbers come from LiteLLM's /key/info and /user/info, which every key may call about itself, so no admin rights are needed; /team/info is only a fallback. They are LiteLLM's estimate, not the provider's invoice. If the gateway answers none of this, nothing is shown and everything else works as before.
Status line adds to yours
claude.statusline no longer replaces your own status line. llmenu runs the statusLine command from your project or user settings with the same session data and appends one line:
project acme · team budget $40.00 / $100.00 · this key $12.45 · resets in 19d
The key comes from the session's environment (never the keyring), the gateway is asked at most once a minute, and the cache holds only a hash of URL and key. llmenu setup claude now asks whether to turn the status line on.
README
New sections Budget and spend and Troubleshooting; the demo shows the budget in the menu.
Upgrade
brew update && brew upgrade --cask llmenuTo see the budget in Claude Code: llmenu config set claude.statusline true (or llmenu setup claude).
v0.5.0
Security hardening
- The key only goes to its gateway. llmenu records which gateway a key was stored for (
llmenu setup,llmenu config set gateway.url; keys from older versions are bound on first use). Ifconfig.tomlorLLMENU_BASE_URLlater points elsewhere, llmenu asks on a terminal and otherwise refuses to send the key. A key fromLLMENU_API_KEYis not bound. - No plain http by accident.
setupandconfig set gateway.urlaccepthttp://only for localhost; a URL from the config or environment that uses plain http triggers a warning. - Symlink-safe writes. Config, state, benchmarks, the keyring file and the files of pi and opencode (including their
*.bakbackups) are written via random temporary names, so a planted symlink is never followed. - Bounded responses: gateway and benchmark responses are limited to 16 MB.
- Keyring file:
LLMENU_KEYRING_FILE(tests and sandbox only) is always written with mode 0600. - Signed provenance for release archives:
gh attestation verify <archive> --repo schowave/llmenu. - SECURITY.md now explains what a tool started by llmenu can see (the key is in its environment).
README
More compact; the projects section is titled "one key per project".
Upgrade
brew update && brew upgrade --cask llmenuIf a gateway URL was changed behind llmenu's back, the next start asks once whether the key may go there; llmenu config set gateway.url <url> confirms it.