From a257de52166e9cb02cd8b831fe0e7ab261e48993 Mon Sep 17 00:00:00 2001 From: ergs0204 Date: Fri, 17 Jul 2026 22:29:33 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(web):=20preserve=20proxy=20r?= =?UTF-8?q?oute=20during=20model=20discovery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AiProvidersOpenAIModelsPage.tsx | 45 +++------ .../aiProviders/openAIModelDiscovery.test.ts | 96 +++++++++++++++++++ .../aiProviders/openAIModelDiscovery.ts | 44 +++++++++ apps/web/src/i18n/locales/en.json | 1 + apps/web/src/i18n/locales/ru.json | 1 + apps/web/src/i18n/locales/zh-CN.json | 1 + apps/web/src/i18n/locales/zh-TW.json | 1 + 7 files changed, 157 insertions(+), 32 deletions(-) create mode 100644 apps/web/src/features/aiProviders/openAIModelDiscovery.test.ts create mode 100644 apps/web/src/features/aiProviders/openAIModelDiscovery.ts diff --git a/apps/web/src/features/aiProviders/AiProvidersOpenAIModelsPage.tsx b/apps/web/src/features/aiProviders/AiProvidersOpenAIModelsPage.tsx index d7a8d3bf1..9bb7528eb 100644 --- a/apps/web/src/features/aiProviders/AiProvidersOpenAIModelsPage.tsx +++ b/apps/web/src/features/aiProviders/AiProvidersOpenAIModelsPage.tsx @@ -7,12 +7,10 @@ import { Input } from '@/components/ui/Input'; import { SelectionCheckbox } from '@/components/ui/SelectionCheckbox'; import { SecondaryScreenShell } from '@/components/common/SecondaryScreenShell'; import { useEdgeSwipeBack } from '@/hooks/useEdgeSwipeBack'; -import { modelsApi } from '@/services/api'; import type { ModelInfo } from '@/utils/models'; -import { normalizeAuthIndex } from '@/utils/authIndex'; -import { buildHeaderObject, hasHeader } from '@/utils/headers'; import { buildOpenAIModelsEndpoint } from '@/components/providers/utils'; import type { OpenAIEditOutletContext } from './AiProvidersOpenAIEditLayout'; +import { discoverOpenAIModels } from './openAIModelDiscovery'; import styles from './AiProvidersPage.module.scss'; import layoutStyles from './AiProvidersEditLayout.module.scss'; @@ -74,42 +72,25 @@ export function AiProvidersOpenAIModelsPage() { ); const fetchOpenaiModelDiscovery = useCallback( - async ({ allowFallback = true }: { allowFallback?: boolean } = {}) => { + async () => { const trimmedBaseUrl = form.baseUrl.trim(); if (!trimmedBaseUrl) return; setFetching(true); setError(''); try { - const headerObject = buildHeaderObject(form.headers); - const firstEntry = form.apiKeyEntries.find( - (entry) => entry.apiKey?.trim() || normalizeAuthIndex(entry.authIndex) - ); - const firstKey = firstEntry?.apiKey?.trim(); - const authIndex = normalizeAuthIndex(firstEntry?.authIndex) ?? undefined; - const hasAuthHeader = hasHeader(headerObject, 'authorization'); - const list = await modelsApi.fetchModelsViaApiCall( - trimmedBaseUrl, - hasAuthHeader ? undefined : firstKey, - headerObject, - authIndex - ); + const list = await discoverOpenAIModels({ + baseUrl: trimmedBaseUrl, + headers: form.headers, + apiKeyEntries: form.apiKeyEntries, + proxyRequiresSavedEntryMessage: t( + 'ai_providers.openai_models_proxy_requires_saved_entry' + ), + }); setModels(list); } catch (err: unknown) { - if (allowFallback) { - try { - const list = await modelsApi.fetchModelsViaApiCall(trimmedBaseUrl); - setModels(list); - return; - } catch (fallbackErr: unknown) { - const message = getErrorMessage(fallbackErr) || getErrorMessage(err); - setModels([]); - setError(`${t('ai_providers.openai_models_fetch_error')}: ${message}`); - } - } else { - setModels([]); - setError(`${t('ai_providers.openai_models_fetch_error')}: ${getErrorMessage(err)}`); - } + setModels([]); + setError(`${t('ai_providers.openai_models_fetch_error')}: ${getErrorMessage(err)}`); } finally { setFetching(false); } @@ -243,7 +224,7 @@ export function AiProvidersOpenAIModelsPage() {