import { ServiceProvider } from "@/app/constant"; import { ModalConfigValidator, ModelConfig } from "../store"; import { useAccessStore } from "../store"; import Locale from "../locales"; import { InputRange } from "./input-range"; import { ListItem, Select } from "./ui-lib"; import { useAllModels } from "../utils/hooks"; import styles from "./model-config.module.scss"; import { getModelProvider } from "../utils/model"; import { useEffect } from "react"; export function ModelConfigList(props: { modelConfig: ModelConfig; updateConfig: (updater: (config: ModelConfig) => void) => void; }) { const allModels = useAllModels(); const accessStore = useAccessStore(); // 确保初始化时providerName和模型匹配 useEffect(() => { // 确保allModels已加载 if (!allModels || allModels.length === 0) return; // 检查当前选中的模型是否确实属于当前选中的服务商 const modelBelongsToProvider = allModels.some( (m) => m.available && m.name === props.modelConfig.model && m.provider?.providerName === props.modelConfig.providerName, ); // 如果不匹配,则强制更新为当前服务商的第一个可用模型 if (!modelBelongsToProvider) { console.log( `模型不匹配修复: 当前模型 ${props.modelConfig.model} 不属于 ${props.modelConfig.providerName}`, ); // 找到当前服务商的第一个可用模型 const firstModelForProvider = allModels.find( (m) => m.available && m.provider?.providerName === props.modelConfig.providerName, ); if (firstModelForProvider) { console.log(`模型不匹配修复: 更新为 ${firstModelForProvider.name}`); props.updateConfig((config) => { config.model = ModalConfigValidator.model(firstModelForProvider.name); }); } else if (props.modelConfig.providerName === ServiceProvider.OpenAI) { // 如果是OpenAI但没找到模型,强制设置为一个OpenAI常见模型 const openAIModel = "gpt-4o-mini"; console.log( `模型不匹配修复: 未找到OpenAI模型,默认设置为 ${openAIModel}`, ); props.updateConfig((config) => { config.model = ModalConfigValidator.model(openAIModel); }); } } }, [props.modelConfig.providerName, props.modelConfig.model, allModels]); // 过滤未配置API密钥的服务提供商 const validProviders = Object.entries(ServiceProvider).filter(([_, v]) => { switch (v) { case ServiceProvider.OpenAI: return true; // 始终保留OpenAI选项,即使没有配置API密钥 case ServiceProvider.Azure: return accessStore.isValidAzure(); case ServiceProvider.Google: return accessStore.isValidGoogle(); case ServiceProvider.Anthropic: return accessStore.isValidAnthropic(); case ServiceProvider.Baidu: return accessStore.isValidBaidu(); case ServiceProvider.ByteDance: return accessStore.isValidByteDance(); case ServiceProvider.Alibaba: return accessStore.isValidAlibaba(); case ServiceProvider.Tencent: return accessStore.isValidTencent(); case ServiceProvider.Moonshot: return accessStore.isValidMoonshot(); case ServiceProvider.Iflytek: return accessStore.isValidIflytek(); case ServiceProvider.DeepSeek: return accessStore.isValidDeepSeek(); case ServiceProvider.XAI: return accessStore.isValidXAI(); case ServiceProvider.ChatGLM: return accessStore.isValidChatGLM(); case ServiceProvider.SiliconFlow: return accessStore.isValidSiliconFlow(); case ServiceProvider.Stability: return true; // 假设不需要验证或其他处理 default: return false; } }); // 确保有可用的模型供当前服务商使用 const filteredModels = allModels.filter( (v) => v.available && v.provider?.providerName === props.modelConfig.providerName, ); // 如果没有找到当前服务商的模型,显示所有模型(防止下拉列表为空) const modelsToShow = filteredModels.length > 0 ? filteredModels : allModels.filter((v) => v.available); const value = `${props.modelConfig.model}@${props.modelConfig?.providerName}`; const compressModelValue = `${props.modelConfig.compressModel}@${props.modelConfig?.compressProviderName}`; return ( <> { props.updateConfig( (config) => (config.temperature = ModalConfigValidator.temperature( e.currentTarget.valueAsNumber, )), ); }} > { props.updateConfig( (config) => (config.top_p = ModalConfigValidator.top_p( e.currentTarget.valueAsNumber, )), ); }} > props.updateConfig( (config) => (config.max_tokens = ModalConfigValidator.max_tokens( e.currentTarget.valueAsNumber, )), ) } > {props.modelConfig?.providerName == ServiceProvider.Google ? null : ( <> { props.updateConfig( (config) => (config.presence_penalty = ModalConfigValidator.presence_penalty( e.currentTarget.valueAsNumber, )), ); }} > { props.updateConfig( (config) => (config.frequency_penalty = ModalConfigValidator.frequency_penalty( e.currentTarget.valueAsNumber, )), ); }} > props.updateConfig( (config) => (config.enableInjectSystemPrompts = e.currentTarget.checked), ) } > props.updateConfig( (config) => (config.template = e.currentTarget.value), ) } > )} props.updateConfig( (config) => (config.historyMessageCount = e.target.valueAsNumber), ) } > props.updateConfig( (config) => (config.compressMessageLengthThreshold = e.currentTarget.valueAsNumber), ) } > props.updateConfig( (config) => (config.sendMemory = e.currentTarget.checked), ) } > ); }