From 758ddc532ba341df90e1959fcd6525a39a5e91f0 Mon Sep 17 00:00:00 2001 From: Scott Werner Date: Tue, 27 Oct 2026 14:01:35 -0400 Subject: [PATCH] Fetch provider names only for failed runs, through a shared helper Every run page asked for the provider catalog, though only a failed or dead run's banner uses it. useProviders takes an enabled flag, and the id-to-display-name map settings-models built by hand is now providerNamesById, shared with the run page. Co-Authored-By: Claude Opus 5.5 --- apps/fabro-web/app/lib/model-offerings.ts | 9 ++++++++- apps/fabro-web/app/lib/queries.ts | 5 +++-- apps/fabro-web/app/routes/run-detail.tsx | 6 ++++-- apps/fabro-web/app/routes/settings-models.tsx | 7 ++----- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/fabro-web/app/lib/model-offerings.ts b/apps/fabro-web/app/lib/model-offerings.ts index e2bc94d2d..ad2c056f0 100644 --- a/apps/fabro-web/app/lib/model-offerings.ts +++ b/apps/fabro-web/app/lib/model-offerings.ts @@ -1,4 +1,4 @@ -import type { Model } from "@qltysh/fabro-api-client"; +import type { Model, Provider } from "@qltysh/fabro-api-client"; type ModelOfferingIdentity = Pick; @@ -6,6 +6,13 @@ export function modelOfferingKey(model: ModelOfferingIdentity): string { return `${model.provider}\u0000${model.id}`; } +/** Provider ids to the names the catalog displays, falling back to the id. */ +export function providerNamesById( + providers: readonly Pick[], +): Map { + return new Map(providers.map((p) => [p.id, p.display_name || p.id])); +} + export function modelOfferingTestArgs( model: ModelOfferingIdentity, ): [id: string, provider: string] { diff --git a/apps/fabro-web/app/lib/queries.ts b/apps/fabro-web/app/lib/queries.ts index fc51316c4..1ca6ec4f3 100644 --- a/apps/fabro-web/app/lib/queries.ts +++ b/apps/fabro-web/app/lib/queries.ts @@ -534,9 +534,10 @@ export function useServerSettings() { ); } -export function useProviders() { +/** The provider catalog; `enabled: false` skips the request. */ +export function useProviders({ enabled = true }: { enabled?: boolean } = {}) { return useSWR( - queryKeys.providers.list(), + enabled ? queryKeys.providers.list() : null, () => apiData(() => modelsApi.listProviders()), immutableOptions, ); diff --git a/apps/fabro-web/app/routes/run-detail.tsx b/apps/fabro-web/app/routes/run-detail.tsx index e910be1ee..dcf2bec17 100644 --- a/apps/fabro-web/app/routes/run-detail.tsx +++ b/apps/fabro-web/app/routes/run-detail.tsx @@ -36,6 +36,7 @@ import { import { useRunEvents } from "../lib/run-events"; import { useRunToasts } from "../hooks/use-run-toasts"; import { useProviders, useRun, useRunQuestions, useRunState } from "../lib/queries"; +import { providerNamesById } from "../lib/model-offerings"; import { canApprove, deleteErrorMessage, @@ -151,9 +152,10 @@ export default function RunDetail({ params }: { params: { id: string } }) { useRunEvents(params.id); useRunToasts(params.id); - const providersQuery = useProviders(); + // Provider names only matter to a failed run's banner. + const providersQuery = useProviders({ enabled: statusKind === "failed" || statusKind === "dead" }); const providerNames = useMemo( - () => new Map((providersQuery.data?.data ?? []).map((p) => [p.id, p.display_name || p.id])), + () => providerNamesById(providersQuery.data?.data ?? []), [providersQuery.data], ); const failure = buildRunFailureView(runStateQuery.data, { diff --git a/apps/fabro-web/app/routes/settings-models.tsx b/apps/fabro-web/app/routes/settings-models.tsx index f6e3905df..fde1fe380 100644 --- a/apps/fabro-web/app/routes/settings-models.tsx +++ b/apps/fabro-web/app/routes/settings-models.tsx @@ -31,6 +31,7 @@ import { formatContextWindow, formatTokensPerSecond } from "../lib/format"; import { modelOfferingKey, modelOfferingTestArgs, + providerNamesById, } from "../lib/model-offerings"; import { useDebouncedValue } from "../hooks/effects"; @@ -244,11 +245,7 @@ function ModelsSection({ providers }: { providers: Provider[] }) { const { data, isLoading } = useModels(providerFilter, debouncedSearch); - const providerNameById = useMemo(() => { - const map = new Map(); - for (const p of providers) map.set(p.id, p.display_name || p.id); - return map; - }, [providers]); + const providerNameById = useMemo(() => providerNamesById(providers), [providers]); const rows = useMemo(() => { const all = (data?.data ?? []).filter((m) => m.configured);