Model picker
Overview
The model picker is the popover that opens from the header's model trigger. It allows you to search, filter by provider, and switch active models effortlessly across both phone and desktop screens.
The same model picker is also used in subagent authorization cards and agent persona editors. Those locations use the same compact, single-line trigger styling as chat while retaining a mobile-sized touch target, and they render no extra descriptive text — the dropdown reads exactly like the chat header's picker.
Usage
Tap the model trigger in the chat header (showing the current model and provider).
The model picker opens:
On phones, it expands to a full-width sheet anchored to the viewport.
On wider screens, it floats comfortably below the header.
Type in the search input to filter models by name or slug.
Tap a provider chip (
All,Anthropic,OpenRouter,OpenAI, etc.) to scope the list to a specific provider.Tap any row to select the model for the current conversation.
Tap the ↻ refresh button to fetch live model catalogs directly from connected providers. This bypasses the server's 1-hour cache (via a
_bustcache-buster) so it re-hits the upstream rather than returning the previously fetched list.Pressing
Escapeor tapping outside closes the popover.
Behavior
Bookmarks & Recents — pinned and recently used models stay easily accessible at the top of the picker.
Unavailable / Custom models — if a model is currently offline or custom-configured, it renders as a distinct selection so you can see what is currently set and switch when ready.
Fast search — filters instantly across all connected provider catalogs.
Instantly opens — tapping the trigger shows the sheet immediately with whatever models are already loaded (project slugs + any live catalog already fetched). The server-backed Recent section refreshes in the background and lands in one re-render once the request resolves, so opening never waits on a network or DB round-trip.
Empty-state actions — Refresh models remains the primary action when no models match a search or a provider has no models (where catalog refresh is supported). A non-empty search also offers a separate Clear search action: it clears only the text, keeps the selected provider, returns focus to search, and makes no network request. Whitespace-only text is not treated as a search.
Refresh without losing your place — both the header and empty-state refresh actions fetch fresh catalogs, even with no search matches. Refresh keeps the sheet open, retains the query and provider filter, and does not clear the existing catalog while loading. Pointer activation keeps an already-focused search input focused; completion does not steal focus or reopen a dismissed keyboard. Duplicate refreshes are blocked while loading; provider failures and rejected requests show a retryable inline error. Refresh feedback stays inside the picker: it never changes the bottom composer status, which would resize and re-pin the transcript behind the sheet.
Native mobile gestures — swipe the model list vertically or the provider chips horizontally. Slight finger movement on short-list rows no longer cancels selection. Keyboard opening, dismissal, and rotation resize the sheet to the visible viewport.
Related
Model bookmarks — pinned and recent models.
AI client — connected AI providers and endpoints.
Thinking Level — configuring reasoning effort for thinking models.
Max output tokens — token limits configurable in the picker.