@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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: ''
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user