Further Unify Model Picker Architecture - #326351
Merged
Merged
Conversation
Contributor
📬 CODENOTIFYThe following users are being notified based on files changed in this PR: @sandy081Matched files:
@lszomoruMatched files:
|
Contributor
There was a problem hiding this comment.
Pull request overview
Unifies model restoration and selection policy across the workbench and Agents window.
Changes:
- Adds shared model resolution, precedence, pending, and fallback logic.
- Updates provider snapshots to expose explicit resolution states.
- Reorganizes picker utilities and expands regression coverage.
Show a summary per file
| File | Description |
|---|---|
src/vs/workbench/contrib/chat/test/common/modelSelection.test.ts |
Tests shared selection policy. |
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerUtils.test.ts |
Removes superseded utility tests. |
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerPresentation.test.ts |
Tests picker presentation helpers. |
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerItems.test.ts |
Updates utility import. |
src/vs/workbench/contrib/chat/test/browser/widget/input/chatInputModelUtils.test.ts |
Updates and reorganizes input utility tests. |
src/vs/workbench/contrib/chat/common/modelSelection.ts |
Adds shared model-selection policy. |
src/vs/workbench/contrib/chat/common/languageModels.ts |
Adds vendor absence resolution helper. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerWidget.ts |
Uses presentation-owned helpers. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerPresentation.ts |
Adds picker availability and cache-hint logic. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerItems.ts |
Updates presentation imports. |
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerHover.ts |
Updates presentation imports. |
src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts |
Adopts shared resolution and pending restoration. |
src/vs/workbench/contrib/chat/browser/widget/input/chatInputModelUtils.ts |
Retains input-specific model utilities. |
src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.ts |
Uses shared metadata helper. |
src/vs/workbench/contrib/chat/browser/agentSessions/sessionTypeAvailability.ts |
Simplifies targeted-model detection. |
src/vs/sessions/SESSIONS.md |
Documents unified selection architecture. |
src/vs/sessions/services/sessions/test/browser/sessionsManagementService.test.ts |
Updates provider snapshot mock. |
src/vs/sessions/services/sessions/common/sessionsProvider.ts |
Replaces isResolved with explicit resolution. |
src/vs/sessions/contrib/providers/remoteAgentHost/REMOTE_AGENT_HOST_SESSIONS_PROVIDER.md |
Documents resolution states. |
src/vs/sessions/contrib/providers/localChatSessions/test/browser/localChatSessionsProvider.test.ts |
Tests delayed Copilot resolution. |
src/vs/sessions/contrib/providers/localChatSessions/LOCAL_CHAT_SESSIONS_PROVIDER.md |
Updates provider documentation. |
src/vs/sessions/contrib/providers/localChatSessions/browser/localChatSessionsProvider.ts |
Computes catalog-aware resolution. |
src/vs/sessions/contrib/providers/copilotChatSessions/test/browser/copilotChatSessionsProvider.test.ts |
Updates snapshot expectations. |
src/vs/sessions/contrib/providers/copilotChatSessions/COPILOT_CHAT_SESSIONS_PROVIDER.md |
Documents snapshot resolution. |
src/vs/sessions/contrib/providers/copilotChatSessions/browser/copilotChatSessionsProvider.ts |
Produces explicit model resolution. |
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputPresenter.ts |
Updates selection helper import. |
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatInputConfigPicker.ts |
Updates selection model import. |
src/vs/sessions/contrib/providers/agentHost/browser/baseAgentHostSessionsProvider.ts |
Resolves restored agent-host models. |
src/vs/sessions/contrib/providers/agentHost/AGENT_HOST_SESSIONS_PROVIDER.md |
Documents agent-host resolution. |
src/vs/sessions/contrib/chat/test/browser/sessionWorkspacePicker.test.ts |
Updates provider mock. |
src/vs/sessions/contrib/chat/test/browser/sessionModelSelectionModel.test.ts |
Adds pending and explicit-selection coverage. |
src/vs/sessions/contrib/chat/test/browser/modelPickerSelection.test.ts |
Removes duplicate policy tests. |
src/vs/sessions/contrib/chat/test/browser/modelPicker.test.ts |
Updates selection model import. |
src/vs/sessions/contrib/chat/browser/sessionModelSelectionModel.ts |
Adapts Agents sessions to shared policy. |
src/vs/sessions/contrib/chat/browser/newChatInput.ts |
Gates sending while restoration is pending. |
src/vs/sessions/contrib/chat/browser/modelPickerSelection.ts |
Removes duplicate Agents policy. |
src/vs/sessions/contrib/chat/browser/modelPicker.ts |
Uses renamed selection model. |
Review details
- Files reviewed: 37/37 changed files
- Comments generated: 4
- Review effort level: Medium
aeschli
previously approved these changes
Jul 17, 2026
pwang347
approved these changes
Jul 17, 2026
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
This further unifies model selection and restoration across the editor/workbench and Agents window.
vs/workbench/contrib/chat/common/modelSelection.ts.ChatInputPartandSessionModelSelectionModel.isResolvedsignal withdesiredModelResolution:notRequested,pending,available, orunavailable.modelTargetmetadata so provider-scoped model pools use the same remembered-selection key as their Workbench counterpart.chatSelectedModel.ts, using profile-scoped user storage keyed by chat location and optional model target, with lazy migration from legacy Workbench and Sessions keys.Fixes #326260
Previous Architecture
The workbench and Agents window used independent restoration policies. They shared picker presentation, but each surface separately interpreted model readiness, precedence, fallback, and persistence.
flowchart LR Registry[Language model registry and cache] Providers[ISessionsProvider snapshots] Workbench[Editor and Workbench<br/>ChatInputPart] WorkbenchPolicy[chatModelSelectionLogic<br/>workbench restore and fallback policy] Agents[Agents window<br/>ModelPickerModel] AgentsPolicy[modelPickerSelection<br/>Agents restore and fallback policy] Registry --> WorkbenchPolicy --> Workbench Providers --> AgentsPolicy --> Agents WorkbenchPolicy -. duplicated semantics .- AgentsPolicyThis allowed the two surfaces to diverge. In particular, the Agents window could treat a partial model list as complete, select the first BYOK model, and persist it before Copilot models arrived.
New Architecture
Both surfaces now use the same pure catalog-resolution, matching, initial-selection, and fallback building blocks. The Sessions adapter also delegates catalog-driven lifecycle transitions to that shared policy. Both adapters use one canonical remembered-selection storage contract while retaining the application and lifecycle concerns that genuinely differ.
flowchart TD SharedPolicy[common/modelSelection.ts<br/>resolution, matching, precedence, transition effects] SharedStorage[common/chatSelectedModel.ts<br/>canonical remembered-selection storage] Registry[Language model registry and cache] Providers[ISessionsProvider.getModelsSnapshot<br/>desiredModelResolution and modelTarget] WorkbenchAdapter[ChatInputPart<br/>workbench lifecycle adapter] AgentsAdapter[SessionModelSelectionModel<br/>Sessions provider adapter] PickerUI[modelPicker folder<br/>widget, items, hover, presentation] Registry --> WorkbenchAdapter Providers --> AgentsAdapter WorkbenchAdapter --> SharedPolicy AgentsAdapter --> SharedPolicy WorkbenchAdapter --> SharedStorage AgentsAdapter --> SharedStorage WorkbenchAdapter --> PickerUI AgentsAdapter --> PickerUIThe shared policy owns:
The shared storage helper owns canonical
(location, modelTarget)keys, profile-scoped user storage, and migration from the previous application-scoped Workbench keys. The Sessions adapter additionally migrates its previous provider/session-type key into that canonical store.ChatInputPartandSessionModelSelectionModelremain separate adapters because their model inputs, application paths, and session lifecycles differ. Workbench controls its wait-listener lifecycle and input-model synchronization. Sessions controls provider snapshots and writes, and remembers only provider-accepted explicit choices. Providers expose the concretemodelTargetfor their model pool so both surfaces address the same remembered selection.Behavior
When BYOK models arrive before a remembered Copilot model:
sequenceDiagram participant Catalog as Model catalog participant Policy as Shared selection policy participant Picker as Model picker participant Storage as Remembered selection Catalog->>Policy: BYOK available, Copilot still pending Policy->>Picker: Keep remembered selection pending Policy->>Storage: Do not overwrite preference Catalog->>Policy: Copilot model becomes available Policy->>Picker: Apply remembered Copilot model Policy->>Storage: Preserve remembered preferenceWhen there is no remembered choice, an early BYOK model may be applied provisionally so the session remains usable. A later provider default or Auto model replaces that provisional fallback. In the Sessions adapter, neither automatic choice is written as a user preference.
If the user explicitly chooses a model while discovery is pending, that explicit choice wins and cancels pending restoration. In Sessions, the provider is updated first and the canonical remembered preference is written only after the provider accepts the change.
Validation
npm run typecheck-clientnpm run transpile-clientnpm run valid-layers-check