Skip to content

Releases: schowave/llmenu

v0.11.0

Choose a tag to compare

@schowave schowave released this 17 Oct 01:03

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>/v1 by default. llmenu config set copilot.provider_type anthropic switches to the Messages API.
  • Offline: llmenu config set copilot.offline true also 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 copilot asks for the default model, protocol and offline mode. Copilot is also in the list of tools in llmenu setup tools.
  • providers.json warning: if a ~/.copilot/providers.json declares 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

Choose a tag to compare

@schowave schowave released this 16 Oct 08:49

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

Choose a tag to compare

@schowave schowave released this 16 Oct 06:24

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 bench

v0.8.2

Choose a tag to compare

@schowave schowave released this 16 Oct 04:19

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 opencode

v0.8.1

Choose a tag to compare

@schowave schowave released this 15 Oct 16:01

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 llmenu

v0.8.0

Choose a tag to compare

@schowave schowave released this 15 Oct 15:37

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 llmenu

v0.7.1

Choose a tag to compare

@schowave schowave released this 15 Oct 07:59

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 llmenu

v0.7.0

Choose a tag to compare

@schowave schowave released this 13 Oct 10:05

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 llmenu

v0.6.0

Choose a tag to compare

@schowave schowave released this 13 Oct 07:52

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 llmenu

To see the budget in Claude Code: llmenu config set claude.statusline true (or llmenu setup claude).

v0.5.0

Choose a tag to compare

@schowave schowave released this 12 Oct 21:33

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). If config.toml or LLMENU_BASE_URL later points elsewhere, llmenu asks on a terminal and otherwise refuses to send the key. A key from LLMENU_API_KEY is not bound.
  • No plain http by accident. setup and config set gateway.url accept http:// 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 *.bak backups) 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 llmenu

If 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.