fix: model picker stays usable during provider loading#8900
Merged
kalvinnchau merged 6 commits intomainfrom Apr 29, 2026
Merged
fix: model picker stays usable during provider loading#8900kalvinnchau merged 6 commits intomainfrom
kalvinnchau merged 6 commits intomainfrom
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eac93b5dc3
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
kalvinnchau
reviewed
Apr 29, 2026
baxen
approved these changes
Apr 29, 2026
…startup Change the button display priority so triggerModelLabel and selectedAgentLabel take precedence over the loading state. Previously, providersLoading=true would unconditionally show "Loading" even when a meaningful label (e.g. "Claude") was already available, causing a jarring "Claude" → "Loading" → "sonnet[1m]" flash on startup. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Only disable the button when loading AND no selectedAgentLabel is available. Previously the button was unconditionally disabled during provider loading, preventing interaction even when a provider was already selected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove the redundant getProviderInventory() call that fired every time the picker popover opened, duplicating work already done by useAppStartup's polling - When models are loading but the current model name is already known, show it as a placeholder item with a spinner instead of a generic "Loading models" message, keeping the dropdown consistent with the button label Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract the refresh+poll logic from useAppStartup into a shared backgroundRefreshInventory() function in inventory.ts. When the user opens the model picker popover, trigger a background inventory refresh that updates the model list in-place without showing a loading state. This ensures newly available models/providers are discovered after credential or config changes without requiring an app restart. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Background inventory refresh fetched the current provider inventory when opened from the model picker, but only merged results into the store after a refresh actually started. This meant fresh inventory was discarded when no providers were configured, refresh was unsupported, providers were already refreshing, or the refresh response returned no started providers. Merge the fetched snapshot before those early returns, while preserving the startup path where initial entries have already been stored.
4e71b1d to
25da8d0
Compare
lifeizhou-ap
added a commit
that referenced
this pull request
Apr 30, 2026
* main: (24 commits) fix: copy and content improvements in goose2 (#8886) feat: make ollama host configurable in goose2 (#8912) polish sidebar navigation and project icons (#8896) fix: model picker stays usable during provider loading (#8900) feat: update provider row after saving credentials (#8914) feat: support google model inventory refresh (#8913) chore: Added goose 2 UI refactor review skill (#8903) blog: goose with peekaboo (#8884) blog: Built-in Local Inference blogpost. (#8808) perf: parallelize provider resolution and eagerly init SQLite pool (#8899) refactor: update goose2 credential management behind provider-scoped ACP/core API (#8887) fix: handle acp requests concurrently (#8781) build: set LLAMA_STATIC_CRT for Windows CUDA (#8901) perf: deduplicate _goose/providers/list RPC call at startup (#8873) chore: add a bit more instructions in the release pr (#8890) chore: disable spellcheck in model search (#8889) add skills to the chat composer (#8881) mergeable configs + cleanup (#8378) refactor: agent provider to use explicit type states (#8879) [goose2] MCP Apps: hydrate and replay app payloads in Goose2 (#8632) ...
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.
reload.providers.and.model.mov
UI Changes
Implementation
Reorder button label priority (
AgentModelPicker.tsx) — DisplaytriggerModelLabel ?? selectedAgentLabelfirst; only fall back to "Loading" when neither is available. Conditionally disable the button only whenloading && !selectedAgentLabel.Deduplicate startup RPC (
useAppStartup.ts,acp.ts,acpApi.ts) — MergeloadProvidersandloadProviderInventoryinto a singleloadProvidersAndInventorycall. ExtractbuildProviderListFromEntries()so bothlistProviders()and the startup path can derive the provider list from the same inventory response, eliminating a redundant_goose/providers/listRPC.Extract shared background refresh (
inventory.ts) — Move the refresh+poll loop (refresh configured providers, poll with delays until all finish) into a reusablebackgroundRefreshInventory()function. It merges results into the store without settingloading=true, so cached data stays visible during the refresh.Background refresh on picker open (
useAgentModelPickerState.ts) — Add ahandlePickerOpencallback that triggersbackgroundRefreshInventory()when the popover opens (guarded by a ref to prevent concurrent refreshes). This replaces the olduseEffectinAgentModelPickerthat calledgetProviderInventory()on every open and merged results synchronously.Thread
onPickerOpenthrough the component tree — WirehandlePickerOpenfrom the hook throughuseResolvedAgentModelPicker→useChatSessionController→ChatView/HomeScreen→ChatInput→ChatInputToolbar→AgentModelPicker'sonOpenprop, which fires ononOpenChange(true).