You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Combine model and reasoning selection, with separate speed controls
#25142
Drafted by Claude Opus 5.5 in Claude Code (via T3 Code) on behalf of @jbearak, who reviewed and posted it. The prototype branch was also written by Claude Opus 5.5 and reviewed by GPT-6.1 Sol.
CONTRIBUTING.md asks for agreement on direction and scope first, so I'm asking here before opening a PR. To check that the idea works with T3's real provider data, I built a prototype on a branch in my fork: jbearak/t3code feat/model-reasoning-matrix. There's no upstream PR. I'm happy to change it, split it, or drop it depending on what you want.
What changes
The composer's model and reasoning buttons become one button that opens one picker. The Favorites and provider rail, search, and keyboard navigation stay. A click in the picker chooses something and closes it, as today. A middle- or right-click on a level or speed chooses it and keeps the picker open, so you can set both in one visit.
This is web and desktop only. The grid needs more width than a phone has, so mobile keeps its current pickers. Settings, project defaults, and scheduled tasks also keep today's controls.
Rows and dots. Each model is a row, and its reasoning levels are dots in shared columns: Low, Medium, High, Extra High, Fleet. None and Minimal columns appear only when a listed model offers them. Clicking a dot, or dragging along a row like a slider and releasing on one, selects that model at that level and closes the picker.
Remembered levels. In other rows, a ring marks the level you last chose for that model, or its default if you've never chosen one. Clicking the model's name uses that level and closes the picker, as it does today. People often use different models at different levels, such as Opus at Medium and Sol at Extra High, so switching shouldn't reset either preference or carry one model's level over to the other.
Speed. After a divider to the right of the reasoning columns, Std, Fast, and Ultra columns show the speed each model would run at if you switched to it, which is the speed you last used with that model. Models without speed controls leave them blank. Clicking a speed in another row switches to that model, at its remembered level and that speed; in the current model's row it changes only the speed. Claude's Fast mode and Codex's service tiers both map onto these columns.
The button shows the model, the reasoning level, and the app's existing speed icons: a bolt for Fast, a double bolt for Ultrafast, none for Standard. The speed columns use the same icons. The tooltip and accessible label name the speed.
Why
Fewer clicks. Counting only the clicks needed to change each value, with the target model already listed:
Change
Today
Proposed
Model and reasoning effort
4: open and choose model, open and choose effort
2: open picker, click a dot
Model and speed
4: open and choose model, open and choose speed
2: open picker, click the speed in that model's row
Model, effort, and speed
6
3: open picker, right-click a dot, click a speed
No surprise speed. You can see what speed tier you're switching to when you swap models. Today you find out from the button afterwards.
Clearer concepts. Reasoning effort and service tier both affect response time, but they control different things. Today, speed sits inside the reasoning menu behind a brain icon. Separating them gives each a clear label and its own indicator.
Keeping the brain for effort. Under the new Beta design from #24865, the effort button shows a gauge. I kept the brain in the combined button for both designs, and I wanted to explain why rather than change it quietly. Here effort and speed sit side by side, so a gauge next to "Low" can read as low speed, when low effort actually responds faster, and the bolt beside it already stands for speed. #13309 swapped the gauge for the brain for the same reason. I may well be missing the thinking behind the gauge, and I'm happy to switch to it, or to another icon, if you'd prefer.
Details in the prototype
Speed memory per model. Each model remembers its own speed, the same way it remembers its level, so Opus at Fast and Opus 4.6 at Standard each keep theirs when you switch between them. A model whose speed you've never set shows its default, and switching to it applies that default, so the speed you see is the one that runs.
Max behind a legacy setting. Following Theo's advice to avoid Max, the Max column is hidden unless Settings → General → Legacy features → Max reasoning is on. A thread already on Max keeps the column, so the button always matches what runs. The effort-step shortcuts skip Max in the same way. See open question 2.
Ultrathink is a keyword. Like Max, Ultrathink is a legacy way to ask for more reasoning, and it's a prompt keyword rather than a level, so it isn't on the grid. Typing "ultrathink" in a prompt still works and still shows in the button.
Keyboard. Each model's row is one tab stop. Tab from search moves into the highlighted row (or the current model's, if it's in view), Left and Right move across levels and speeds, and Enter chooses. When a prompt locks the reasoning level, Tab lands on the speed instead. Enter on a row still selects the model at its remembered level, and the existing shortcuts for opening the picker, switching providers, and jumping to a model are unchanged.
Favorites. The star stays on every row. In this picker, an unstarred row shows its star on hover or keyboard focus, and always on touch screens.
Everything else stays reachable. Options that don't fit the grid, such as Claude's context window, OpenCode's agent, Haiku 4.5's thinking toggle, or any level or tier T3 can't name, stay in a small options menu beside the model button. If a model's reasoning levels can't all be placed on the grid, they stay in that menu too, rather than losing any.
Open questions
Ultracode. Ultracode is currently a reasoning level, so the prototype puts it in the top column with Codex's ultra. I labeled that column "Fleet" instead of "Ultra", because "Ultra" clashed with the Ultrafast speed, and fleet is what those modes do. PR #20987 and Ideas #14631 would make it a separate switch at any level. If that lands, Ultracode would move to a switch beside speed.
Hiding Max. Is a Legacy setting the right home for Max, or would you rather show it whenever a model offers it? A new setting needs your approval either way.
Model variants. Grouping effort variants that ship as separate model IDs, like Antigravity's Gemini Low/Medium/High, would fit this grid. I'd leave that to Ideas #17247 as a follow-up.
Prior and related work
PR #9256 tried a unified composer button with an effort slider. Its author closed it without merging.
PR #24865 and #24883 added the new design behind a Beta toggle. The branch is rebased on them and works with the toggle on or off.
How I checked the prototype
Unit tests cover the provider mapping (Claude's Ultracode, Pi's Off level, Codex's tiers), column rules, showing Max, and keeping a model's other options when choosing.
Browser tests cover choosing a level, choosing a model by name, the keyboard, dragging, choosing a speed, and choosing without closing.
The branch passes the repo's check:changed (format, lint, knip, typecheck, nearby tests).
The screenshots above come from the real component rendered in the repo's browser test harness with sample provider data. I haven't yet tried it against a live provider catalog.
Would maintainers support this direction? In particular, I'd appreciate guidance on the open questions. If it's welcome, I'll update the branch to match before opening a PR.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Note
Drafted by Claude Opus 5.5 in Claude Code (via T3 Code) on behalf of @jbearak, who reviewed and posted it. The prototype branch was also written by Claude Opus 5.5 and reviewed by GPT-6.1 Sol.
I'd been thinking about the model picker for a while, and Theo's reply in today's UI thread prompted me to try contributing. The layout of model rows with reasoning-level dots comes from Maria's model-picker concept.
CONTRIBUTING.md asks for agreement on direction and scope first, so I'm asking here before opening a PR. To check that the idea works with T3's real provider data, I built a prototype on a branch in my fork: jbearak/t3code
feat/model-reasoning-matrix. There's no upstream PR. I'm happy to change it, split it, or drop it depending on what you want.What changes
The composer's model and reasoning buttons become one button that opens one picker. The Favorites and provider rail, search, and keyboard navigation stay. A click in the picker chooses something and closes it, as today. A middle- or right-click on a level or speed chooses it and keeps the picker open, so you can set both in one visit.
This is web and desktop only. The grid needs more width than a phone has, so mobile keeps its current pickers. Settings, project defaults, and scheduled tasks also keep today's controls.
Why
Fewer clicks. Counting only the clicks needed to change each value, with the target model already listed:
No surprise speed. You can see what speed tier you're switching to when you swap models. Today you find out from the button afterwards.
Clearer concepts. Reasoning effort and service tier both affect response time, but they control different things. Today, speed sits inside the reasoning menu behind a brain icon. Separating them gives each a clear label and its own indicator.
Keeping the brain for effort. Under the new Beta design from #24865, the effort button shows a gauge. I kept the brain in the combined button for both designs, and I wanted to explain why rather than change it quietly. Here effort and speed sit side by side, so a gauge next to "Low" can read as low speed, when low effort actually responds faster, and the bolt beside it already stands for speed. #13309 swapped the gauge for the brain for the same reason. I may well be missing the thinking behind the gauge, and I'm happy to switch to it, or to another icon, if you'd prefer.
Details in the prototype
Open questions
ultra. I labeled that column "Fleet" instead of "Ultra", because "Ultra" clashed with the Ultrafast speed, and fleet is what those modes do. PR #20987 and Ideas #14631 would make it a separate switch at any level. If that lands, Ultracode would move to a switch beside speed.Prior and related work
How I checked the prototype
check:changed(format, lint, knip, typecheck, nearby tests).Would maintainers support this direction? In particular, I'd appreciate guidance on the open questions. If it's welcome, I'll update the branch to match before opening a PR.
All reactions