feat: default model (#3662)

* move model config

* feat: default model
This commit is contained in:
Archer
2025-01-24 18:44:43 +08:00
committed by archer
parent 2015bbe9a9
commit 51fac7431f
167 changed files with 2999 additions and 2899 deletions

View File

@@ -36,7 +36,8 @@ import {
getSystemModelDetail,
getSystemModelList,
getTestModel,
putSystemModel
putSystemModel,
putUpdateDefaultModels
} from '@/web/core/ai/config';
import MyBox from '@fastgpt/web/components/common/MyBox';
import { SystemModelItemType } from '@fastgpt/service/core/ai/type';
@@ -54,20 +55,14 @@ import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import { putUpdateWithJson } from '@/web/core/ai/config';
import CopyBox from '@fastgpt/web/components/common/String/CopyBox';
import MyIcon from '@fastgpt/web/components/common/Icon';
import AIModelSelector from '@/components/Select/AIModelSelector';
const MyModal = dynamic(() => import('@fastgpt/web/components/common/MyModal'));
const ModelTable = ({ Tab }: { Tab: React.ReactNode }) => {
const { t } = useTranslation();
const { userInfo } = useUserStore();
const {
llmModelList,
embeddingModelList,
ttsModelList,
sttModelList,
reRankModelList,
feConfigs
} = useSystemStore();
const { defaultModels, feConfigs } = useSystemStore();
const isRoot = userInfo?.username === 'root';
@@ -273,14 +268,7 @@ const ModelTable = ({ Tab }: { Tab: React.ReactNode }) => {
}
);
const onCreateModel = (type: ModelTypeEnum) => {
const defaultModel = (() => {
if (type === ModelTypeEnum.llm) return llmModelList[0];
if (type === ModelTypeEnum.embedding) return embeddingModelList[0];
if (type === ModelTypeEnum.tts) return ttsModelList[0];
if (type === ModelTypeEnum.stt) return sttModelList[0];
if (type === ModelTypeEnum.rerank) return reRankModelList[0];
return llmModelList[0];
})();
const defaultModel = defaultModels[type];
setEditModelData({
...defaultModel,
@@ -302,6 +290,11 @@ const ModelTable = ({ Tab }: { Tab: React.ReactNode }) => {
onOpen: onOpenJsonConfig,
onClose: onCloseJsonConfig
} = useDisclosure();
const {
onOpen: onOpenDefaultModel,
onClose: onCloseDefaultModel,
isOpen: isOpenDefaultModel
} = useDisclosure();
const isLoading = loadingModels || loadingData || updatingModel || testingModel;
@@ -313,6 +306,9 @@ const ModelTable = ({ Tab }: { Tab: React.ReactNode }) => {
<Flex alignItems={'center'}>
{Tab}
<Box flex={1} />
<Button variant={'whiteBase'} mr={2} onClick={onOpenDefaultModel}>
{t('account:model.default_model')}
</Button>
<Button variant={'whiteBase'} mr={2} onClick={onOpenJsonConfig}>
{t('account:model.json_config')}
</Button>
@@ -505,6 +501,9 @@ const ModelTable = ({ Tab }: { Tab: React.ReactNode }) => {
{isOpenJsonConfig && (
<JsonConfigModal onClose={onCloseJsonConfig} onSuccess={refreshModels} />
)}
{isOpenDefaultModel && (
<DefaultModelModal onClose={onCloseDefaultModel} onSuccess={refreshModels} />
)}
</>
);
};
@@ -1084,4 +1083,164 @@ const JsonConfigModal = ({
);
};
const labelStyles = {
fontSize: 'sm',
color: 'myGray.900',
mb: 0.5
};
const DefaultModelModal = ({
onSuccess,
onClose
}: {
onSuccess: () => void;
onClose: () => void;
}) => {
const { t } = useTranslation();
const {
defaultModels,
llmModelList,
embeddingModelList,
ttsModelList,
sttModelList,
reRankModelList
} = useSystemStore();
// Create a copy of defaultModels for local state management
const [defaultData, setDefaultData] = useState(defaultModels);
const { runAsync, loading } = useRequest2(putUpdateDefaultModels, {
onSuccess: () => {
onSuccess();
onClose();
},
successToast: t('common:common.Update Success')
});
return (
<MyModal
isOpen
onClose={onClose}
title={t('account:default_model_config')}
iconSrc="modal/edit"
>
<ModalBody>
<Box>
<Box {...labelStyles}>{t('common:model.type.chat')}</Box>
<Box flex={1}>
<AIModelSelector
bg="myGray.50"
value={defaultData.llm?.model}
list={llmModelList.map((item) => ({
value: item.model,
label: item.name
}))}
onchange={(e) => {
setDefaultData((state) => ({
...state,
llm: llmModelList.find((item) => item.model === e)
}));
}}
/>
</Box>
</Box>
<Box mt={4}>
<Box {...labelStyles}>{t('common:model.type.embedding')}</Box>
<Box flex={1}>
<AIModelSelector
bg="myGray.50"
value={defaultData.embedding?.model}
list={embeddingModelList.map((item) => ({
value: item.model,
label: item.name
}))}
onchange={(e) => {
setDefaultData((state) => ({
...state,
embedding: embeddingModelList.find((item) => item.model === e)
}));
}}
/>
</Box>
</Box>
<Box mt={4}>
<Box {...labelStyles}>{t('common:model.type.tts')}</Box>
<Box flex={1}>
<AIModelSelector
bg="myGray.50"
value={defaultData.tts?.model}
list={ttsModelList.map((item) => ({
value: item.model,
label: item.name
}))}
onchange={(e) => {
setDefaultData((state) => ({
...state,
tts: ttsModelList.find((item) => item.model === e)
}));
}}
/>
</Box>
</Box>
<Box mt={4}>
<Box {...labelStyles}>{t('common:model.type.stt')}</Box>
<Box flex={1}>
<AIModelSelector
bg="myGray.50"
value={defaultData.stt?.model}
list={sttModelList.map((item) => ({
value: item.model,
label: item.name
}))}
onchange={(e) => {
setDefaultData((state) => ({
...state,
stt: sttModelList.find((item) => item.model === e)
}));
}}
/>
</Box>
</Box>
<Box mt={4}>
<Box {...labelStyles}>{t('common:model.type.reRank')}</Box>
<Box flex={1}>
<AIModelSelector
bg="myGray.50"
value={defaultData.rerank?.model}
list={reRankModelList.map((item) => ({
value: item.model,
label: item.name
}))}
onchange={(e) => {
setDefaultData((state) => ({
...state,
rerank: reRankModelList.find((item) => item.model === e)
}));
}}
/>
</Box>
</Box>
</ModalBody>
<ModalFooter>
<Button variant={'whiteBase'} mr={4} onClick={onClose}>
{t('common:common.Cancel')}
</Button>
<Button
isLoading={loading}
onClick={() =>
runAsync({
[ModelTypeEnum.llm]: defaultData.llm?.model,
[ModelTypeEnum.embedding]: defaultData.embedding?.model,
[ModelTypeEnum.tts]: defaultData.tts?.model,
[ModelTypeEnum.stt]: defaultData.stt?.model,
[ModelTypeEnum.rerank]: defaultData.rerank?.model
})
}
>
{t('common:common.Confirm')}
</Button>
</ModalFooter>
</MyModal>
);
};
export default ModelTable;

View File

@@ -233,7 +233,7 @@ const Share = ({ appId }: { appId: string; type: PublishChannelEnum }) => {
onEdit={() => {
toast({
status: 'success',
title: t('common:common.Update Successful')
title: t('common:common.Update Success')
});
refetchShareChatList();
setEditLinkData(undefined);

View File

@@ -19,7 +19,7 @@ const SelectDatasetParam = ({ inputs = [], nodeId }: RenderInputProps) => {
const nodeList = useContextSelector(WorkflowContext, (v) => v.nodeList);
const { t } = useTranslation();
const { llmModelList } = useSystemStore();
const { defaultModels } = useSystemStore();
const [data, setData] = useState<DatasetParamsProps>({
searchMode: DatasetSearchModeEnum.embedding,
@@ -27,7 +27,7 @@ const SelectDatasetParam = ({ inputs = [], nodeId }: RenderInputProps) => {
similarity: 0.5,
usingReRank: false,
datasetSearchUsingExtensionQuery: true,
datasetSearchExtensionModel: llmModelList[0]?.model,
datasetSearchExtensionModel: defaultModels.llm?.model,
datasetSearchExtensionBg: ''
});
@@ -45,7 +45,7 @@ const SelectDatasetParam = ({ inputs = [], nodeId }: RenderInputProps) => {
});
return maxTokens;
}, [nodeList, llmModelList]);
}, [nodeList]);
const { isOpen, onOpen, onClose } = useDisclosure();

View File

@@ -67,7 +67,7 @@ const InputDataModal = ({
const theme = useTheme();
const { toast } = useToast();
const [currentTab, setCurrentTab] = useState(TabEnum.content);
const { embeddingModelList } = useSystemStore();
const { embeddingModelList, defaultModels } = useSystemStore();
const { isPc } = useSystem();
const { register, handleSubmit, reset, control } = useForm<InputDataType>();
const {
@@ -159,10 +159,10 @@ const InputDataModal = ({
const maxToken = useMemo(() => {
const vectorModel =
embeddingModelList.find((item) => item.model === collection.dataset.vectorModel) ||
embeddingModelList[0];
defaultModels.embedding;
return vectorModel?.maxToken || 3000;
}, [collection.dataset.vectorModel, embeddingModelList]);
}, [collection.dataset.vectorModel, defaultModels.embedding, embeddingModelList]);
// import new data
const { mutate: sureImportData, isLoading: isImporting } = useRequest({

View File

@@ -48,7 +48,7 @@ type FormType = {
const Test = ({ datasetId }: { datasetId: string }) => {
const { t } = useTranslation();
const { toast } = useToast();
const { llmModelList } = useSystemStore();
const { defaultModels } = useSystemStore();
const datasetDetail = useContextSelector(DatasetPageContext, (v) => v.datasetDetail);
const { pushDatasetTestItem } = useSearchTestStore();
const [inputType, setInputType] = useState<'text' | 'file'>('text');
@@ -70,7 +70,7 @@ const Test = ({ datasetId }: { datasetId: string }) => {
limit: 5000,
similarity: 0,
datasetSearchUsingExtensionQuery: true,
datasetSearchExtensionModel: llmModelList[0].model,
datasetSearchExtensionModel: defaultModels.llm?.model,
datasetSearchExtensionBg: ''
}
}

View File

@@ -41,7 +41,7 @@ const CreateModal = ({
const { t } = useTranslation();
const { toast } = useToast();
const router = useRouter();
const { embeddingModelList, datasetModelList } = useSystemStore();
const { defaultModels, embeddingModelList, datasetModelList } = useSystemStore();
const { isPc } = useSystem();
const datasetTypeMap = useMemo(() => {
@@ -78,8 +78,8 @@ const CreateModal = ({
avatar: datasetTypeMap[type].icon,
name: '',
intro: '',
vectorModel: filterNotHiddenVectorModelList[0].model,
agentModel: datasetModelList[0].model
vectorModel: defaultModels.embedding?.model,
agentModel: defaultModels.llm?.model
}
});
const { register, setValue, handleSubmit, watch } = form;