Skip to content

feat(app): add Opus 5.5 to the Claude model picker - #1827

Open
chphch wants to merge 1 commit into
slopus:mainfrom
chphch:feat/opus-5-5-model-picker
Open

chphch wants to merge 1 commit into
slopus:mainfrom
chphch:feat/opus-5-5-model-picker

Conversation

@chphch

@chphch chphch commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Claude Opus 5.5 shipped on 22 September and the Claude picker still stops at Opus 5, so reaching the new model from Happy means leaving the app and passing --model on the machine running the session. This adds two rows — claude-opus-5-5 and the 1M-context claude-opus-5-5[1m] — at the head of the Opus group. Every existing row is untouched, and so is the code default (claude-opus-5).

Why these exact keys

  • Full IDs, not short aliases — the reason the list already documents in-file: the aliases do not all resolve to the model the row names.
  • A separate [1m] row, following Opus 5's precedent rather than Fable 5.1's. The bracket suffix is part of the ID Claude Code accepts rather than a flag it drops, so the 1M build is a real second variant. Fable 5.1 has no such row because 1M is that model's default; Opus 5.5 has both.
  • Both spellings were run against the installed CLI (2.1.280) before being offered here — claude --model claude-opus-5-5 and claude --model 'claude-opus-5-5[1m]' each returned a completion — so neither row can hand a session an ID the harness rejects.

Placement

At the head of the Opus group, not the top of the list. The catalog groups by family with each family's newest member first, and this keeps that. Opus 5.5 [1M] therefore sits between Opus 5.5 and Opus 5, matching how the Opus 5 pair is already ordered.

Proof

Screenshot in the comment below: the /new model picker open, showing all seven Anthropic rows in one frame with Opus 5.5 and Opus 5.5 [1M] above the currently-selected Opus 5. Captured on a throwaway standalone happy-server (PGlite) + Expo web, authenticated via the dev-token URL bypass and driven headlessly with Playwright; the row order was also read back from the live DOM rather than eyeballed. vitest run sources/components/modelModeOptions.test.ts passes with the assertions updated alongside, and tsc --noEmit is clean.

🤖 Generated with Claude Code

Anthropic released Claude Opus 5.5 on 2026-09-22 and the picker still stops at
Opus 5, so the only way to reach the new model from Happy is to leave the app
and pass --model on the machine running the session.

Both rows carry full model IDs for the reason the list already documents: the
short aliases do not all resolve to the model the row names. The 1M-context
build is a separate row, as Opus 5's is, because the bracket suffix is part of
the ID Claude Code accepts rather than a flag it ignores. Both spellings were
run against the installed CLI (2.1.280) before being offered here, so neither
row can send a session to an ID the harness rejects.

The rows sit at the head of the Opus group rather than the top of the list, so
the picker keeps grouping by family with each family's newest member first.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
@chphch

chphch commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

Proof — the picker offers Opus 5.5

Captured locally: a throwaway standalone happy-server (PGlite, port 3222) + Expo web (port 8252), authenticated through the dev_token URL bypass and driven headlessly with Playwright, booted from this PR's commit.

Claude model picker showing Opus 5.5 and Opus 5.5 [1M] above Opus 5

The row order was read back from the live DOM as well as screenshotted, so the frame is not the only evidence:

["Fable 5.1","Fable 5","Opus 5.5","Opus 5.5 [1M]","Opus 5","Opus 5 [1M]","Sonnet 5"]

Opus 5 carries the filled check because it is still the code default — this PR adds rows, it does not change what a new session starts on.

One framing note: the capture uses a 1000px-wide viewport on purpose. At ≥1100px the picker renders embedded and scrolls at ~4 rows (embeddedOptionList's maxHeight: 176), so the seven rows are all present but cannot share one frame. Below the sidebar threshold it renders as a popover and they do.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant