diff --git a/app/client/api.ts b/app/client/api.ts index c642ef14b..b82dfc240 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -361,10 +361,45 @@ export function getHeaders(ignoreHeaders: boolean = false) { } export function getClientApi(provider: ServiceProvider | string): ClientApi { - switch (provider) { + console.log( + "[getClientApi] Received Provider (raw):", + provider, + "| Type:", + typeof provider, + ); + + // Standardize the provider name to match Enum case (TitleCase) + let standardizedProvider: ServiceProvider | string; + if (typeof provider === "string") { + // Convert known lowercase versions to their Enum equivalent + switch (provider.toLowerCase()) { + case "bedrock": + standardizedProvider = ServiceProvider.Bedrock; + break; + case "openai": + standardizedProvider = ServiceProvider.OpenAI; + break; + case "google": + standardizedProvider = ServiceProvider.Google; + break; + // Add other potential lowercase strings if needed + default: + standardizedProvider = provider; // Keep unknown strings as is + } + } else { + standardizedProvider = provider; // Already an Enum value + } + + console.log("[getClientApi] Standardized Provider:", standardizedProvider); + + switch (standardizedProvider) { case ServiceProvider.Google: + console.log( + "[getClientApi] Returning ClientApi(ModelProvider.GeminiPro)", + ); return new ClientApi(ModelProvider.GeminiPro); case ServiceProvider.Anthropic: + console.log("[getClientApi] Returning ClientApi(ModelProvider.Claude)"); return new ClientApi(ModelProvider.Claude); case ServiceProvider.Baidu: return new ClientApi(ModelProvider.Ernie); @@ -387,9 +422,15 @@ export function getClientApi(provider: ServiceProvider | string): ClientApi { case ServiceProvider.SiliconFlow: return new ClientApi(ModelProvider.SiliconFlow); case ServiceProvider.Bedrock: - case "AWS Bedrock": + console.log( + "[getClientApi] Returning ClientApi(ModelProvider.Bedrock) for", + standardizedProvider, + ); return new ClientApi(ModelProvider.Bedrock); default: + console.log( + `[getClientApi] Provider '${provider}' (Standardized: '${standardizedProvider}') not matched, returning default GPT.`, + ); return new ClientApi(ModelProvider.GPT); } } diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 6691403e6..8a9f42869 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -693,22 +693,70 @@ export function ChatActions(props: { onClose={() => setShowModelSelector(false)} onSelection={(s) => { if (s.length === 0) return; - const [model, providerName] = getModelProvider(s[0]); - chatStore.updateTargetSession(session, (session) => { - session.mask.modelConfig.model = model as ModelType; - session.mask.modelConfig.providerName = - providerName as ServiceProvider; - session.mask.syncGlobalConfig = false; - }); - if (providerName == "ByteDance") { - const selectedModel = models.find( - (m) => - m.name == model && - m?.provider?.providerName == providerName, - ); - showToast(selectedModel?.displayName ?? ""); + const selectedValue = s[0]; + console.log( + "[ChatActions] Model selected raw value:", + selectedValue, + ); + // providerId here will be lowercase, e.g., "bedrock" + const [model, providerId] = getModelProvider(selectedValue); + console.log( + "[ChatActions] Parsed model:", + model, + "Provider ID:", + providerId, + ); + + // Convert lowercase providerId to TitleCase ServiceProvider enum value + let targetProvider: ServiceProvider | undefined; + if (providerId) { + const upperProvider = + providerId.charAt(0).toUpperCase() + providerId.slice(1); + if ( + Object.values(ServiceProvider).includes( + upperProvider as ServiceProvider, + ) + ) { + targetProvider = upperProvider as ServiceProvider; + } else { + console.error( + `[ChatActions] Unknown provider ID: ${providerId}`, + ); + // Handle error or fallback if needed + } } else { - showToast(model); + // Handle case where providerId is missing, maybe default to OpenAI? + targetProvider = ServiceProvider.OpenAI; + console.warn( + `[ChatActions] Provider ID missing in ${selectedValue}, defaulting to OpenAI.`, + ); + } + + console.log( + "[ChatActions] Target ServiceProvider Enum:", + targetProvider, + ); + + if (targetProvider) { + // Only update if we found a valid provider + chatStore.updateTargetSession(session, (session) => { + session.mask.modelConfig.model = model as ModelType; + session.mask.modelConfig.providerName = targetProvider; // Use the Enum value + session.mask.syncGlobalConfig = false; + console.log( + "[ChatActions] Updated session modelConfig:", + session.mask.modelConfig, + ); + }); + // Display toast based on provider + const toastMessage = + targetProvider === ServiceProvider.ByteDance + ? models.find( + (m) => + m.name === model && m?.provider?.id === providerId, + )?.displayName ?? model + : model; + showToast(toastMessage); } }} /> diff --git a/app/store/chat.ts b/app/store/chat.ts index 87c1a8beb..eb780546b 100644 --- a/app/store/chat.ts +++ b/app/store/chat.ts @@ -456,7 +456,26 @@ export const useChatStore = createPersistStore( ]); }); - const api: ClientApi = getClientApi(modelConfig.providerName); + // --- 详细日志 (修正版) --- + const providerNameFromConfig = modelConfig.providerName; + console.log( + "[onUserInput] Preparing API call. Provider from config:", + providerNameFromConfig, + "| Type:", + typeof providerNameFromConfig, + "| Is Enum value (Bedrock)?:", + providerNameFromConfig === ServiceProvider.Bedrock, // 与枚举比较 + "| Is 'Bedrock' string?:", + providerNameFromConfig === "Bedrock", // 与字符串比较 + "| Model:", + modelConfig.model, + ); + // --- 日志结束 --- + + // 使用从配置中获取的 providerName,并提供默认值 + const api: ClientApi = getClientApi( + providerNameFromConfig ?? ServiceProvider.OpenAI, + ); // make request api.llm.chat({ messages: sendMessages,