Skip to content

Commit eac93b5

Browse files
matt2eclaude
andcommitted
fix: unify model picker loading to reduce flicker and redundant fetches
- 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>
1 parent 22ef7e0 commit eac93b5

1 file changed

Lines changed: 19 additions & 35 deletions

File tree

ui/goose2/src/features/chat/ui/AgentModelPicker.tsx

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import {
77
} from "@tabler/icons-react";
88
import { useTranslation } from "react-i18next";
99
import type { AcpProvider } from "@/shared/api/acp";
10-
import { getProviderInventory } from "@/features/providers/api/inventory";
11-
import { useProviderInventoryStore } from "@/features/providers/stores/providerInventoryStore";
1210
import { cn } from "@/shared/lib/cn";
1311
import { Button } from "@/shared/ui/button";
1412
import { Popover, PopoverContent, PopoverTrigger } from "@/shared/ui/popover";
@@ -325,10 +323,6 @@ export function AgentModelPicker({
325323
const { t } = useTranslation("chat");
326324
const [open, setOpen] = useState(false);
327325
const [modelView, setModelView] = useState<ModelView>("recommended");
328-
const mergeInventoryEntries = useProviderInventoryStore(
329-
(s) => s.mergeEntries,
330-
);
331-
332326
const selectedAgentLabel =
333327
agents.find((agent) => agent.id === selectedAgentId)?.label ??
334328
formatProviderLabel(selectedAgentId);
@@ -358,32 +352,6 @@ export function AgentModelPicker({
358352
}
359353
}, [open]);
360354

361-
useEffect(() => {
362-
if (!open) {
363-
return;
364-
}
365-
366-
let cancelled = false;
367-
368-
const syncInventory = async () => {
369-
try {
370-
const entries = await getProviderInventory();
371-
if (cancelled) {
372-
return;
373-
}
374-
mergeInventoryEntries(entries);
375-
} catch (error) {
376-
console.error("Failed to sync provider inventory from picker:", error);
377-
}
378-
};
379-
380-
void syncInventory();
381-
382-
return () => {
383-
cancelled = true;
384-
};
385-
}, [open, mergeInventoryEntries]);
386-
387355
// When in "all" view, expand the popover to full width for the search experience.
388356
const isAllView = modelView === "all";
389357

@@ -512,9 +480,25 @@ export function AgentModelPicker({
512480
className="flex min-h-0 min-w-0 overflow-hidden p-1"
513481
>
514482
{modelsLoading ? (
515-
<div className="flex min-h-0 flex-1 items-center gap-2 px-2 py-2 text-sm text-muted-foreground">
516-
<Spinner className="size-4" />
517-
<span>{t("toolbar.loadingModels")}</span>
483+
<div className="flex min-h-0 min-w-0 flex-1 flex-col">
484+
<div className="shrink-0 px-2 py-1.5 text-sm font-semibold">
485+
{t("toolbar.model")}
486+
</div>
487+
{currentModelName || currentModelId ? (
488+
<div className="space-y-0.5 p-1">
489+
<PickerItem selected disabled>
490+
<div className="min-w-0 flex-1 truncate">
491+
{currentModelName ?? currentModelId}
492+
</div>
493+
<Spinner className="size-3.5 shrink-0" />
494+
</PickerItem>
495+
</div>
496+
) : (
497+
<div className="flex min-h-0 flex-1 items-center gap-2 px-2 py-2 text-sm text-muted-foreground">
498+
<Spinner className="size-4" />
499+
<span>{t("toolbar.loadingModels")}</span>
500+
</div>
501+
)}
518502
</div>
519503
) : availableModels.length > 0 ? (
520504
modelView === "recommended" ? (

0 commit comments

Comments
 (0)