Refactor model picker architecture#326052
Open
lramos15 wants to merge 10 commits into
Open
Conversation
Contributor
Screenshot ChangesBase: Changed (72) |
Contributor
There was a problem hiding this comment.
Pull request overview
Refactors model selection around a shared, input-scoped sessions coordinator and decomposes the workbench model picker into focused modules.
Changes:
- Centralizes model resolution, persistence, provider updates, and send eligibility.
- Unifies desktop and mobile Agent Host picker behavior.
- Splits picker UI, hover, icons, utilities, styles, and tests.
Show a summary per file
| File | Description |
|---|---|
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelProviderIcons.test.ts |
Adds provider icon tests. |
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerItems.test.ts |
Updates item-builder tests. |
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerHover.test.ts |
Adds hover tests. |
src/vs/workbench/contrib/chat/browser/widget/media/chat.css |
Removes relocated picker styles. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelProviderIcons.ts |
Adds picker icon resolution. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerWidget.ts |
Extracts the picker widget. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerUtils.ts |
Adds shared picker utilities. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerHover.ts |
Extracts hover rendering. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerActionItem.ts |
Updates action-item packaging. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/media/modelPicker.css |
Co-locates picker styling. |
src/vs/workbench/contrib/chat/browser/widget/input/chatPhoneInputPresenter.ts |
Updates picker imports. |
src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationStore.ts |
Updates configuration imports. |
src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts |
Uses the packaged action item. |
src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.ts |
Uses extracted hover rendering. |
src/vs/sessions/SESSIONS.md |
Documents scoped selection architecture. |
src/vs/sessions/MOBILE.md |
Documents mobile picker behavior. |
src/vs/sessions/contrib/providers/copilotChatSessions/COPILOT_CHAT_SESSIONS_PROVIDER.md |
Documents provider integration. |
src/vs/sessions/contrib/providers/agentHost/test/browser/mobileChatPhoneInputTarget.test.ts |
Tests target validation. |
src/vs/sessions/contrib/providers/agentHost/test/browser/localAgentHostSessionsProvider.test.ts |
Tests provider model filtering. |
src/vs/sessions/contrib/providers/agentHost/test/browser/agentHostModelPicker.test.ts |
Removes legacy helper tests. |
src/vs/sessions/contrib/providers/agentHost/test/browser/agentHost/agentHostPermissionPickerDelegate.test.ts |
Tests mode validation. |
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputTarget.ts |
Adds phone action target guards. |
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputPresenter.ts |
Uses provider-backed mobile data. |
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatInputConfigPicker.ts |
Consumes scoped model state. |
src/vs/sessions/contrib/providers/agentHost/browser/agentHostPermissionPickerDelegate.ts |
Adds mode-value validation. |
src/vs/sessions/contrib/providers/agentHost/browser/agentHostModePicker.ts |
Reuses shared mode icons. |
src/vs/sessions/contrib/providers/agentHost/browser/agentHostModelPicker.ts |
Removes legacy model helpers. |
src/vs/sessions/contrib/providers/agentHost/browser/agentHostModeIcon.ts |
Centralizes mode icons. |
src/vs/sessions/contrib/providers/agentHost/AGENT_HOST_SESSIONS_PROVIDER.md |
Updates Agent Host documentation. |
src/vs/sessions/contrib/chat/test/browser/modelPickerSelection.test.ts |
Tests selection policy. |
src/vs/sessions/contrib/chat/test/browser/modelPickerModel.test.ts |
Tests scoped coordinator behavior. |
src/vs/sessions/contrib/chat/test/browser/modelPicker.test.ts |
Updates selectability tests. |
src/vs/sessions/contrib/chat/browser/newChatWidget.ts |
Delegates send gating. |
src/vs/sessions/contrib/chat/browser/newChatInSessionWidget.ts |
Delegates in-session send gating. |
src/vs/sessions/contrib/chat/browser/newChatInput.ts |
Owns the scoped coordinator. |
src/vs/sessions/contrib/chat/browser/modelPickerSelection.ts |
Implements selection transitions. |
src/vs/sessions/contrib/chat/browser/modelPickerModel.ts |
Coordinates reactive model state. |
src/vs/sessions/contrib/chat/browser/modelPicker.ts |
Reduces picker to presentation. |
src/vs/platform/agentHost/common/agentModelPricing.ts |
Updates documentation references. |
Review details
- Files reviewed: 41/41 changed files
- Comments generated: 8
- Review effort level: Medium
Contributor
📬 CODENOTIFYThe following users are being notified based on files changed in this PR: @sandy081Matched files:
@lszomoruMatched files:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Make model selection consistent across the Agents window and split the shared model picker UI into focused, testable modules.
This remains a model-picker change. It touches the Send button only so it reads the same model availability state as the picker. It does not change model execution, request transport, chat responses, or general session lifecycle.
Before
Desktop and phone surfaces each maintained parts of model selection themselves.
flowchart LR Desktop["Desktop model picker"] --> DesktopLogic["Desktop selection state"] Phone["Phone Mode and Model picker"] --> PhoneLogic["Phone selection state"] Send["Send button"] --> SendLogic["Separate availability check"] DesktopLogic --> Provider["Sessions provider"] PhoneLogic --> ProviderThat duplicated model filtering, fallback rules, storage, provider listeners, and send availability. A fix in one surface could leave another surface stale.
After
Each chat input owns one model-selection state value. Desktop, phone, and Send all consume it.
flowchart LR Provider["Sessions provider<br/>models snapshot + options + setModel"] --> State["One scoped model-selection state<br/>per chat input"] State --> Desktop["Desktop model picker"] State --> Phone["Phone Mode and Model picker"] State --> Send["Send enabled"] Desktop --> State Phone --> State State --> ProviderThe selection policy underneath that state handles configured defaults, restored models, remembered choices, removed-model fallback, and reused new-chat inputs.
Models snapshot
ISessionsProvider.getModelsSnapshot(...)returns:models: the models currently available for the sessionisResolved: whether a missing restored model is conclusively gone, rather than still loadingThis is a synchronous provider result, not a new registry, service, or database. Keeping the list and readiness together prevents valid restored selections from being replaced while providers are still loading.
Phone picker
The phone presenter now receives one explicit request:
delegates: state from the standard workbench Mode and Model pickerssession: state from a specific Sessions chat inputThe scoped Sessions path rechecks provider, session, and chat identity before applying an action, so a picker opened for one chat cannot modify another chat after navigation.
Shared picker UI
The previous large workbench picker file is organized under
widget/input/modelPicker/:modelPickerWidget.ts: trigger and picker coordinationmodelPickerItems.ts: deterministic list constructionmodelPickerConfiguration.ts: thinking effort and context-size optionsmodelPickerHover.ts: model details and pricing hovermodelPickerUtils.ts, icons, and CSS: focused presentation helpersThis is primarily code movement and responsibility separation; it does not introduce another picker implementation.
Key changes
SessionModelSelectionModelperNewChatInputWidget.ISessionsProvider.Out of scope
ChatInputPartstate modelValidation
npm run typecheck-clientnpm run valid-layers-check