LLM releases, April 2026ShortcutSettings.swift:159-163modelId.contains("opus") => Smart

Every April 2026 LLM release roundup lists model IDs. Fazm's Mac app shows users three personas.

Opus 4.7 GA, Sonnet 4.6, Haiku 4.5, GPT-5 Turbo, Gemma 4, Grok 4.1, GLM-5.1, Qwen 3.6-Plus, DeepSeek V4, Mistral Medium 3, Arcee Trinity. Every SERP result enumerates IDs and benchmarks. None describe what a non-technical Mac user clicks the day those releases ship. A three-row tuple at ShortcutSettings.swift lines 159 to 163 renames every incoming model into Scary, Fast, or Smart via a single contains() match, with zero work per release.

F
Fazm
13 min read
4.9from 200+
Renames every April 2026 Claude release into Scary, Fast, or Smart
Zero code change when Opus 4.7 ships: modelId.contains("opus") matches
Three rows, four columns, twelve tuple values shape every dropdown
0Rows in the registry tuple
0Columns per row (substring, short, family, order)
0Anthropic April 2026 releases absorbed with zero code change
0+Other April 2026 LLM releases that land in the else branch

Every April 2026 release every roundup enumerates, plus the three personas that absorb the Anthropic ones

Claude Opus 4.7 GAClaude Sonnet 4.6Claude Haiku 4.5GPT-5 TurboGPT-6 previewGrok 4.1Gemma 4 31B DenseGemma 4 26B MoELlama 4 ScoutQwen 3.6-PlusGLM-5.1 754B MoEDeepSeek V4 1T MoEMistral Medium 3Arcee Trinity 400BGemini 2.5 ProScary personaFast personaSmart persona

The anchor fact

0 rows of Swift absorb every April 2026 Anthropic release

Open Desktop/Sources/FloatingControlBar/ShortcutSettings.swift. Go to lines 159 to 163. You will see a private static array called modelFamilyMap typed as [(substring: String, short: String, family: String, order: Int)]. It has three rows. Those three rows are the entire bridge between the April 2026 LLM release cycle and the pill a Mac user taps. The label "Smart (Opus, latest)" means "the most recent model whose API ID contains the substring opus", and that definition survives every future version bump.

Desktop/Sources/FloatingControlBar/ShortcutSettings.swift

The four-hop path from Anthropic's release to the Mac dropdown

The ACP SDK reports availableModels on session/new. The bridge strips "default" and emits a stdout JSON event. Swift decodes it. The registry runs a single contains() match per modelId. The user sees a persona, not a version number.

From session/new to the chevron pill

claude-haiku-4-5
claude-sonnet-4-6
claude-opus-4-7
default (pseudo)
modelFamilyMap
Scary
Fast
Smart
else: raw name

Hop one: the Node bridge

availableModels arrives, "default" is stripped, JSON event fires

The ACP bridge subprocess intercepts session/new at acp-bridge/src/index.ts line 1345, pulls models.availableModels off the response, and routes it through emitModelsIfChanged. That function drops the "default" pseudo-model (line 1274), dedups against the last emission, and writes the JSON event models_available to stdout. The day Anthropic adds a new model ID to the availableModels list on its side, this function picks it up on the next session/new call.

acp-bridge/src/index.ts

Hop two: the Swift decoder

models_available becomes a Swift tuple array

ACPBridge.swift lines 1202 to 1213 handles the typed Swift side. It pattern-matches on .modelsAvailable, compactMaps the dict array into an array of (modelId, name, description) tuples, and calls onModelsAvailable, a closure that is wired to ShortcutSettings.updateModels on app startup. No decoding of version numbers, no semver parsing. The closure is the entire interface.

Desktop/Sources/Chat/ACPBridge.swift

Hop three: the SwiftUI Menu

ForEach(shortcutSettings.availableModels) renders the three personas

AIResponseView.swift lines 1116 to 1159 defines ModelToggleButton. The visible label is the selected model's shortLabel, either "Scary", "Fast", or "Smart". The expanded menu iterates over availableModels and shows each entry's full label. When the user taps a new option, selectedModel is written to UserDefaults and the floating bar rebinds. Clicking persona "Smart" writes "claude-opus-4-7" to disk, not a version number the user remembers.

Desktop/Sources/FloatingControlBar/AIResponseView.swift

The day Opus 4.7 ships, as a terminal log

A fresh Fazm launch after the April 2026 Opus 4.7 GA. No code update, no settings migration, no user action. The registry absorbs the new ID and the dropdown re-renders with the same three personas the user had yesterday.

fazm-dev.log (ACP bridge stdout, then Swift)

Six things the three-row registry commits to

The April 2026 release wave includes three Anthropic updates, nine non-Anthropic releases, one migration, and a handful of proxy configurations. Each gets a specific behavior from the registry.

Scary = Haiku family

Matches any modelId containing the substring 'haiku'. Label 'Scary (Haiku, latest)'. Short label 'Scary'. Sort order 0, so it sits at the top of the dropdown. April 2026 this resolves to claude-haiku-4-5 without any code change in Fazm.

Fast = Sonnet family

Matches any modelId containing 'sonnet'. Label 'Fast (Sonnet, latest)'. Short label 'Fast'. Sort order 1. Default selection when UserDefaults has no saved value (ShortcutSettings.swift line 325). April 2026 this resolves to claude-sonnet-4-6.

Smart = Opus family

Matches any modelId containing 'opus'. Label 'Smart (Opus, latest)'. Short label 'Smart'. Sort order 2. April 2026 this resolves to the newly GA'd claude-opus-4-7 after the 4.7 launch, with a one-time migration from older Opus IDs handled at lines 310 to 316.

The rest of April 2026 = the else branch

Every other family (Gemma 4, Llama 4 Scout, Qwen 3.6-Plus, GLM-5.1, DeepSeek V4, Mistral Medium 3, Arcee Trinity, Grok 4.1) falls through to the else branch at lines 187 to 189. That branch uses model.name (or the raw modelId if name is empty) and assigns sort order 99, so it appears under the three core personas. Unknowns are allowed, not silenced.

One-time Opus to Sonnet migration

The init block at lines 310 to 316 reads shortcut_didMigrateFromOpus. If a user had saved an opus ID before this migration shipped, UserDefaults is rewritten to 'sonnet' and didMigrateFromOpus is flipped true. This rotates the user away from Opus during a rate-limit incident while keeping their ability to return to Smart afterward.

The full path from a new LLM release to a rendered dropdown

1

ACP SDK answers session/new with availableModels

The Claude Agent SDK's session/new response carries a models.availableModels array, one entry per model the currently authenticated account can call. April 2026 this includes claude-opus-4-7 for accounts with Opus access, the default pseudo-model, and legacy IDs.

acp-bridge/src/index.ts:1345 — const result = (await acpRequest('session/new', sessionParams)) as { sessionId: string; models?: { availableModels?: Array<{ modelId: string; name: string; description?: string }> } };
2

Bridge strips 'default' and emits a stdout JSON event

emitModelsIfChanged at lines 1271 to 1281 filters out modelId === 'default' because it is a pseudo-model, not a real option. The remaining list is JSON-encoded, compared to the last emission for dedup, and sent as { type: 'models_available', models: [...] }.

acp-bridge/src/index.ts:1279 — send({ type: 'models_available', models: filtered });
3

Swift parses the event into typed tuples

ACPBridge.swift:1202-1213 pattern-matches on .modelsAvailable(let models), compactMaps to an array of (modelId, name, description) tuples, and calls onModelsAvailable if non-empty. No decoding of version numbers, just a typed handoff.

ACPBridge.swift:1210 — if !parsed.isEmpty { onModelsAvailable?(parsed) }
4

updateModels runs the registry

ShortcutSettings.updateModels iterates every tuple. For each modelId, it calls modelFamilyMap.first(where: { modelId.contains($0.substring) }). That single line, the substring match, is what absorbs an Opus 4.7 release into the Smart persona.

ShortcutSettings.swift:183 — if let match = Self.modelFamilyMap.first(where: { modelId.contains($0.substring) }) { ... }
5

Publish and sort

Each matched modelId becomes (ModelOption, order), where order is the fourth column of the tuple. The whole list is sorted by order and the ModelOptions are extracted. availableModels is reassigned on @Published, which triggers SwiftUI recomputation across ModelToggleButton and SettingsPage.

ShortcutSettings.swift:191-192 — .sorted(by: { $0.1 < $1.1 }).map { $0.0 }
6

The user sees Scary, Fast, Smart

AIResponseView.swift:1131 iterates the new availableModels inside a SwiftUI Menu. A user tapping the chevron-down pill sees the three persona labels. The underlying modelId is stored on selection, session/set_model sends it to the bridge, and a query proceeds against claude-opus-4-7, claude-sonnet-4-6, or claude-haiku-4-5.

AIResponseView.swift:1131 — ForEach(shortcutSettings.availableModels) { model in Button { ... } }

Consumer abstraction vs developer enumeration

What the April 2026 SERP roundups do, next to what a consumer Mac app actually has to do. The differences come from Fazm's position above the model layer.

FeatureEvery April 2026 LLM release roundupFazm
How April 2026 releases are surfaced to the userModel ID dropdowns, radio lists of claude-sonnet-4-6 vs opus-4-7 vs gpt-5-turbo vs grok-4-1.Three personas: Scary, Fast, Smart. The IDs claude-haiku-4-5, claude-sonnet-4-6, claude-opus-4-7 never appear.
Work required when a new release like Opus 4.7 shipsAdd the new model ID to a config file, push an update, notify users to re-select.Zero. modelId.contains("opus") at ShortcutSettings.swift:184 matches on the day of release.
Where versioning churn livesVisible. User sees the model ID change and has to opt in to each new version.Hidden. Fazm's persona keeps pointing at 'latest Opus' across 4.5, 4.6, 4.7, and beyond.
What happens to users who had pinned an old versionUser is pinned until they notice and manually update.Lines 310 to 316 migrate them once, during a rate-limit incident, with a durable shortcut_didMigrateFromOpus bool.
What happens when a new family like Gemma 4 or DeepSeek V4 arrives via an Anthropic-compatible proxyEither invisible until hardcoded, or dumped into the same flat list with no ordering.Else branch at lines 187 to 189 shows the raw API name, sort order 99, below the three personas.
How many tuple columns shape the UIA JSON config file with hand-maintained entries per release.Twelve: three rows by four columns (substring, short, family, order) at lines 159 to 163.

What a user sees the day after a release

The same Mac UI, before and after the April 2026 Opus 4.7 GA.

The Fazm floating bar across an Opus 4.7 launch

Floating bar dropdown shows three entries: 'Scary (Haiku, latest)', 'Fast (Sonnet, latest)', 'Smart (Opus, latest)'. Selecting 'Smart' writes 'claude-opus-4-6' to UserDefaults. Queries are answered by Opus 4.6.

  • Scary / Fast / Smart visible
  • Underlying ID: claude-opus-4-6
  • User saw no version string

One-time migration

The only release-era branch that writes state

The registry is declarative. The one imperative exception is a one-time Opus to Sonnet rotation triggered by a rate-limit incident earlier in 2026. It runs once per user, guarded by a durable bool in UserDefaults. It does not repeat per release. It is the proof that Fazm treats release churn as a UI concern, not a configuration one.

Desktop/Sources/FloatingControlBar/ShortcutSettings.swift

What the three-row registry commits to

Six claims encoded in twelve tuple values

The registry at ShortcutSettings.swift lines 159 to 163 looks like a three-row lookup table. It is in fact a statement about how release churn should feel inside a consumer Mac app.

What the three-row tuple claims

  • modelId.contains() is the entire release-absorption logic. No semver parsing.
  • Three rows in modelFamilyMap cover every Anthropic release past, present, and future.
  • Scary/Fast/Smart never changes even when Opus goes from 4.5 to 4.6 to 4.7 to 4.8.
  • Unknown model families survive via the else branch as first-class but below-the-fold options.
  • The ACP SDK's 'default' pseudo-model is stripped at bridge time, never reaches the UI.
  • shortcut_didMigrateFromOpus is a one-time rate-limit-era migration, not a pattern repeated per release.
1 line, every future Opus

modelFamilyMap.first(where: { modelId.contains($0.substring) })

ShortcutSettings.swift line 183, the entire release-absorption logic on one line

Watch an April 2026 release land as a persona chip on a real Mac

Thirty minutes with the team. Pick any new Claude release, switch accounts, and watch Scary, Fast, and Smart re-bind automatically in the floating bar.

Book a call

FAQ: April 2026 LLM releases as three Mac personas

What were the major large language model releases in April 2026?

April 2026 was the most release-dense month on record. Anthropic shipped Claude Opus 4.7 GA, Sonnet 4.6, and Haiku 4.5. OpenAI shipped GPT-5 Turbo and GPT-6 previews. xAI shipped Grok 4.1. Google released Gemma 4 under Apache 2.0 with Dense 31B and MoE 26B variants on April 2. Meta shipped Llama 4 Scout. Alibaba shipped Qwen 3.6-Plus. Z.ai shipped GLM-5.1 as a 754B MoE. DeepSeek released V4, a one-trillion-parameter MoE under Apache 2.0. Mistral released Medium 3 on April 9 with open weights. Arcee released Trinity, a 400B Apache 2.0 model. Every SERP roundup lists these with benchmarks, API IDs, training costs, and pricing tables.

What does every April 2026 LLM release roundup miss?

They enumerate releases from the provider side: model IDs, parameter counts, benchmark scores, API pricing, training compute. None describe what the non-technical Mac user actually clicks the day a new release ships. That is a product question, not a model question. Fazm answers it concretely: three personas called Scary, Fast, and Smart, backed by a three-row substring registry that auto-absorbs every Haiku, Sonnet, or Opus release without a UI update.

Where is the three-row registry in the Fazm source?

Open Desktop/Sources/FloatingControlBar/ShortcutSettings.swift, go to lines 159 to 163. You will see a private static constant called modelFamilyMap typed as an array of four-column tuples with columns (substring, short, family, order). The three rows are literally: ('haiku', 'Scary', 'Haiku', 0), ('sonnet', 'Fast', 'Sonnet', 1), ('opus', 'Smart', 'Opus', 2). Three rows, twelve columns total, renames every shipping Claude model for every Fazm user on every Mac.

How does the registry actually pick up a new release like Opus 4.7?

At ShortcutSettings.swift lines 178 to 212, the updateModels function receives the ACP SDK's availableModels payload (an array of { modelId, name, description }). For every model, it runs Self.modelFamilyMap.first(where: { modelId.contains(substring) }). Because 'claude-opus-4-7' contains 'opus', it matches the third row, which yields a ModelOption with label 'Smart (Opus, latest)' and shortLabel 'Smart'. The sort step at line 191 orders by the fourth column so Scary, Fast, Smart always appear in that order in the dropdown. No strings, versions, or IDs ever reach the user.

Where does the ACP SDK's model list come from?

It originates from the Claude Agent SDK response to session/new, which includes a models.availableModels array. Fazm's bridge (acp-bridge/src/index.ts) intercepts this at line 1347, calls emitModelsIfChanged at line 1271, filters out the 'default' pseudo-model at line 1274, and emits a JSON event { type: 'models_available', models: [...] } at line 1279. On the Swift side, ACPBridge.swift lines 1202 to 1213 parses this into an array of (modelId, name, description) tuples and calls onModelsAvailable, which is wired to ShortcutSettings.updateModels. The day Anthropic adds 'claude-opus-4-8' to availableModels, it flows through this pipeline and shows up in the Fazm dropdown the next time a user opens the floating bar.

Why Scary, Fast, Smart instead of the model names?

Because a persona is stable across releases, and a model ID is not. In April 2026 alone, Anthropic's 'Smart' option moved from Opus 4.5 to 4.6 to 4.7 GA. A user who selected 'Smart' three months ago keeps getting the latest Opus, automatically. A user who had selected 'claude-opus-4-5' would be pinned to an older model until they manually updated. The persona abstracts away the versioning churn. 'Scary' maps to Haiku because Haiku is the fastest and the label hints at how fast it feels. 'Fast' maps to Sonnet because it is the balanced workhorse. 'Smart' maps to Opus because Opus runs slower but thinks harder.

What is the default model and fallback list?

Default: 'sonnet'. When UserDefaults has no saved value, ShortcutSettings.swift line 325 sets self.selectedModel to 'sonnet'. The fallback defaultModels array at lines 151 to 155 ships three ModelOption rows with the short aliases 'haiku', 'sonnet', 'opus' so the dropdown still works when the ACP SDK has not reported the dynamic list yet. Once session/new returns, updateModels replaces defaults with the actual model IDs like 'claude-sonnet-4-6' while preserving the persona labels.

Is there a migration path if a user previously selected Opus?

Yes, at ShortcutSettings.swift lines 310 to 316. The init checks UserDefaults for shortcut_didMigrateFromOpus. If false and the saved model contains 'opus', it writes 'sonnet' to UserDefaults and sets shortcut_didMigrateFromOpus = true. This was added during an Anthropic rate-limit incident where pinned-Opus users were hitting per-user caps; the migration rotates everyone onto Sonnet once, after which they can manually switch back to Smart if they want. The registry-based label system still points at whatever Opus variant is current.

What happens when the ACP SDK returns a model family Fazm does not know about, like Gemma 4 or DeepSeek V4?

At ShortcutSettings.swift lines 187 to 189, the else branch handles unknown families: it uses the display name from the model.name field if present, otherwise the raw modelId, and assigns order 99 so it sorts after Scary, Fast, Smart. That is why a self-hosted Anthropic-compatible proxy serving Gemma 4 would surface as 'gemma-4-31b-it' or whatever name the proxy reports, sorted below the three core personas. The three-row registry is intentionally narrow: it only absorbs releases from the three Anthropic families. Everything else is handled explicitly as an unknown.

Does switching a persona require starting a new session?

No. At acp-bridge/src/index.ts line 1475, handleQuery calls session/set_model before every query, passing the requested modelId. Switching from Smart to Fast mid-conversation just changes which modelId lands in that session/set_model call on the next prompt. The conversation keeps its memory. That is a second reason the persona abstraction works: a user can ask Smart to plan, ask Fast to execute, ask Scary to do a summary, and the underlying session/set_model handles the rotation without losing context.

Where can a user actually see the three personas on a Mac?

Two places. First, the floating control bar: AIResponseView.swift lines 1116 to 1159 defines ModelToggleButton, a SwiftUI Menu that renders a chevron-down pill with the selected shortLabel (Scary, Fast, or Smart). Clicking it expands the list of ShortcutSettings.availableModels. Second, the settings page: SettingsPage.swift line 2025 iterates over shortcutSettings.availableModels for a larger picker. Both read from the same @Published var availableModels published by the registry, so any April 2026 release flows through to both UIs simultaneously.

fazm.AI Computer Agent for macOS
© 2026 fazm. All rights reserved.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.