import type { FC } from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import ModelSelector from '../model-selector' import type { BackendModel, ProviderEnum, } from '../declarations' import Tooltip from '@/app/components/base/tooltip' import { HelpCircle, Settings01 } from '@/app/components/base/icons/src/vender/line/general' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import { useProviderContext } from '@/context/provider-context' import { updateDefaultModel } from '@/service/common' import { ModelType } from '@/app/components/header/account-setting/model-page/declarations' import { useToastContext } from '@/app/components/base/toast' import Button from '@/app/components/base/button' type SystemModelProps = { onUpdate: () => void } const SystemModel: FC = ({ onUpdate, }) => { const { t } = useTranslation() const { textGenerationDefaultModel, mutateTextGenerationDefaultModel, embeddingsDefaultModel, mutateEmbeddingsDefaultModel, speech2textDefaultModel, mutateSpeech2textDefaultModel, rerankDefaultModel, mutateRerankDefaultModel, } = useProviderContext() const { notify } = useToastContext() const [open, setOpen] = useState(false) const [selectedModel, setSelectedModel] = useState>({ [ModelType.textGeneration]: textGenerationDefaultModel && { providerName: textGenerationDefaultModel.model_provider.provider_name, modelName: textGenerationDefaultModel.model_name }, [ModelType.embeddings]: embeddingsDefaultModel && { providerName: embeddingsDefaultModel.model_provider.provider_name, modelName: embeddingsDefaultModel.model_name }, [ModelType.speech2text]: speech2textDefaultModel && { providerName: speech2textDefaultModel.model_provider.provider_name, modelName: speech2textDefaultModel.model_name }, [ModelType.reranking]: rerankDefaultModel && { providerName: rerankDefaultModel.model_provider.provider_name, modelName: rerankDefaultModel.model_name }, }) const mutateDefaultModel = (types: ModelType[]) => { types.forEach((type) => { if (type === ModelType.textGeneration) mutateTextGenerationDefaultModel() if (type === ModelType.embeddings) mutateEmbeddingsDefaultModel() if (type === ModelType.speech2text) mutateSpeech2textDefaultModel() if (type === ModelType.reranking) mutateRerankDefaultModel() }) } const handleChangeDefaultModel = async (type: ModelType, v: BackendModel) => { setSelectedModel({ ...selectedModel, [type]: { providerName: v.model_provider.provider_name, modelName: v.model_name, }, }) } const handleSave = async () => { const kesArray = Object.keys(selectedModel) as ModelType[] const res = await updateDefaultModel({ url: '/workspaces/current/default-model', body: { model_settings: kesArray.map((key) => { return { model_type: key, provider_name: selectedModel?.[key]?.providerName, model_name: selectedModel?.[key]?.modelName, } }), }, }) if (res.result === 'success') { notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) mutateDefaultModel(kesArray) } } return ( setOpen(v => !v)}>
{t('common.modelProvider.systemModelSettings')}
{t('common.modelProvider.systemReasoningModel.key')} {t('common.modelProvider.systemReasoningModel.tip')}
} >
handleChangeDefaultModel(ModelType.textGeneration, v)} />
{t('common.modelProvider.embeddingModel.key')} {t('common.modelProvider.embeddingModel.tip')}
} >
handleChangeDefaultModel(ModelType.embeddings, v)} />
{t('common.modelProvider.rerankModel.key')} {t('common.modelProvider.rerankModel.tip')}
} >
handleChangeDefaultModel(ModelType.reranking, v)} whenEmptyGoToSetting onUpdate={onUpdate} />
{t('common.modelProvider.speechToTextModel.key')} {t('common.modelProvider.speechToTextModel.tip')}
} >
handleChangeDefaultModel(ModelType.speech2text, v)} />
) } export default SystemModel