From 1e48c156fae1dafaac12409e3d941bcdd3398035 Mon Sep 17 00:00:00 2001 From: hsteude Date: Thu, 28 May 2026 22:05:31 +0200 Subject: [PATCH 1/2] fix: refresh stale directory provider state --- app-prefixable/src/context/providers.tsx | 34 +++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/app-prefixable/src/context/providers.tsx b/app-prefixable/src/context/providers.tsx index 80519724..9bac055a 100644 --- a/app-prefixable/src/context/providers.tsx +++ b/app-prefixable/src/context/providers.tsx @@ -131,7 +131,7 @@ interface ProviderContextValue { const ProviderContext = createContext() export function ProviderProvider(props: ParentProps) { - const { client, directory } = useSDK() + const { client, global: globalClient, directory } = useSDK() const cfg = useConfig() const storageKey = modelsStorageKey(directory) const variantKey = variantsStorageKey(directory) @@ -225,20 +225,36 @@ export function ProviderProvider(props: ParentProps) { } }) + function normalizeProviderData(data: ProviderListData) { + const all = data.all.map((provider) => ({ + ...provider, + models: Object.fromEntries( + Object.entries(provider.models).map(([k, m]) => [k, { ...m, providerID: provider.id }]) + ), + })) + return { ...data, all } + } + // Fetch providers const [providerData, { mutate: setProviderData, refetch: refetchProviders }] = createResource(async () => { try { const res = await client.provider.list() const data = res.data as ProviderListData | undefined if (!data) return undefined - // Inject providerID into each model since the SDK response doesn't include it - const all = data.all.map((provider) => ({ - ...provider, - models: Object.fromEntries( - Object.entries(provider.models).map(([k, m]) => [k, { ...m, providerID: provider.id }]) - ), - })) - return { ...data, all } + + if (directory) { + const globalRes = await globalClient.provider.list() + const globalData = globalRes.data as ProviderListData | undefined + const stale = (globalData?.connected ?? []).some((id) => !data.connected.includes(id)) + if (stale) { + await client.instance.dispose() + const refreshed = await client.provider.list() + const refreshedData = refreshed.data as ProviderListData | undefined + if (refreshedData) return normalizeProviderData(refreshedData) + } + } + + return normalizeProviderData(data) } catch (e) { console.error("Failed to fetch providers:", e) return undefined From c450d77e18c845075f85bc81b4e7c94a6a194d61 Mon Sep 17 00:00:00 2001 From: hsteude Date: Thu, 28 May 2026 22:24:16 +0200 Subject: [PATCH 2/2] fix: keep provider list on stale refresh failure --- app-prefixable/src/context/providers.tsx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app-prefixable/src/context/providers.tsx b/app-prefixable/src/context/providers.tsx index 9bac055a..29e70d76 100644 --- a/app-prefixable/src/context/providers.tsx +++ b/app-prefixable/src/context/providers.tsx @@ -243,14 +243,18 @@ export function ProviderProvider(props: ParentProps) { if (!data) return undefined if (directory) { - const globalRes = await globalClient.provider.list() - const globalData = globalRes.data as ProviderListData | undefined - const stale = (globalData?.connected ?? []).some((id) => !data.connected.includes(id)) - if (stale) { - await client.instance.dispose() - const refreshed = await client.provider.list() - const refreshedData = refreshed.data as ProviderListData | undefined - if (refreshedData) return normalizeProviderData(refreshedData) + try { + const globalRes = await globalClient.provider.list() + const globalData = globalRes.data as ProviderListData | undefined + const stale = (globalData?.connected ?? []).some((id) => !data.connected.includes(id)) + if (stale) { + await client.instance.dispose() + const refreshed = await client.provider.list() + const refreshedData = refreshed.data as ProviderListData | undefined + if (refreshedData) return normalizeProviderData(refreshedData) + } + } catch (e) { + console.warn("Failed to refresh stale directory provider state:", e) } }