| import { LlmModelType } from '@/constants/knowledge'; | |
| import { | |
| IFactory, | |
| IMyLlmValue, | |
| IThirdOAIModelCollection, | |
| } from '@/interfaces/database/llm'; | |
| import { | |
| IAddLlmRequestBody, | |
| IDeleteLlmRequestBody, | |
| } from '@/interfaces/request/llm'; | |
| import { sortLLmFactoryListBySpecifiedOrder } from '@/utils/commonUtil'; | |
| import { useCallback, useEffect, useMemo } from 'react'; | |
| import { useDispatch, useSelector } from 'umi'; | |
| export const useFetchLlmList = ( | |
| modelType?: LlmModelType, | |
| isOnMountFetching: boolean = true, | |
| ) => { | |
| const dispatch = useDispatch(); | |
| const fetchLlmList = useCallback(() => { | |
| dispatch({ | |
| type: 'settingModel/llm_list', | |
| payload: { model_type: modelType }, | |
| }); | |
| }, [dispatch, modelType]); | |
| useEffect(() => { | |
| if (isOnMountFetching) { | |
| fetchLlmList(); | |
| } | |
| }, [fetchLlmList, isOnMountFetching]); | |
| return fetchLlmList; | |
| }; | |
| export const useSelectLlmInfo = () => { | |
| const llmInfo: IThirdOAIModelCollection = useSelector( | |
| (state: any) => state.settingModel.llmInfo, | |
| ); | |
| return llmInfo; | |
| }; | |
| export const useSelectLlmOptions = () => { | |
| const llmInfo: IThirdOAIModelCollection = useSelectLlmInfo(); | |
| const embeddingModelOptions = useMemo(() => { | |
| return Object.entries(llmInfo).map(([key, value]) => { | |
| return { | |
| label: key, | |
| options: value.map((x) => ({ | |
| label: x.llm_name, | |
| value: x.llm_name, | |
| disabled: !x.available, | |
| })), | |
| }; | |
| }); | |
| }, [llmInfo]); | |
| return embeddingModelOptions; | |
| }; | |
| export const useSelectLlmOptionsByModelType = () => { | |
| const llmInfo: IThirdOAIModelCollection = useSelectLlmInfo(); | |
| const groupOptionsByModelType = (modelType: LlmModelType) => { | |
| return Object.entries(llmInfo) | |
| .filter(([, value]) => | |
| modelType ? value.some((x) => x.model_type.includes(modelType)) : true, | |
| ) | |
| .map(([key, value]) => { | |
| return { | |
| label: key, | |
| options: value | |
| .filter((x) => | |
| modelType ? x.model_type.includes(modelType) : true, | |
| ) | |
| .map((x) => ({ | |
| label: x.llm_name, | |
| value: x.llm_name, | |
| disabled: !x.available, | |
| })), | |
| }; | |
| }); | |
| }; | |
| return { | |
| [LlmModelType.Chat]: groupOptionsByModelType(LlmModelType.Chat), | |
| [LlmModelType.Embedding]: groupOptionsByModelType(LlmModelType.Embedding), | |
| [LlmModelType.Image2text]: groupOptionsByModelType(LlmModelType.Image2text), | |
| [LlmModelType.Speech2text]: groupOptionsByModelType( | |
| LlmModelType.Speech2text, | |
| ), | |
| [LlmModelType.Rerank]: groupOptionsByModelType(LlmModelType.Rerank), | |
| }; | |
| }; | |
| export const useSelectLlmFactoryList = () => { | |
| const factoryList: IFactory[] = useSelector( | |
| (state: any) => state.settingModel.factoryList, | |
| ); | |
| return factoryList; | |
| }; | |
| export const useSelectMyLlmList = () => { | |
| const myLlmList: Record<string, IMyLlmValue> = useSelector( | |
| (state: any) => state.settingModel.myLlmList, | |
| ); | |
| return myLlmList; | |
| }; | |
| export const useFetchLlmFactoryListOnMount = () => { | |
| const dispatch = useDispatch(); | |
| const factoryList = useSelectLlmFactoryList(); | |
| const myLlmList = useSelectMyLlmList(); | |
| const list = useMemo(() => { | |
| const currentList = factoryList.filter((x) => | |
| Object.keys(myLlmList).every((y) => y !== x.name), | |
| ); | |
| return sortLLmFactoryListBySpecifiedOrder(currentList); | |
| }, [factoryList, myLlmList]); | |
| const fetchLlmFactoryList = useCallback(() => { | |
| dispatch({ | |
| type: 'settingModel/factories_list', | |
| }); | |
| }, [dispatch]); | |
| useEffect(() => { | |
| fetchLlmFactoryList(); | |
| }, [fetchLlmFactoryList]); | |
| return list; | |
| }; | |
| export type LlmItem = { name: string; logo: string } & IMyLlmValue; | |
| export const useFetchMyLlmListOnMount = () => { | |
| const dispatch = useDispatch(); | |
| const llmList = useSelectMyLlmList(); | |
| const factoryList = useSelectLlmFactoryList(); | |
| const list: Array<LlmItem> = useMemo(() => { | |
| return Object.entries(llmList).map(([key, value]) => ({ | |
| name: key, | |
| logo: factoryList.find((x) => x.name === key)?.logo ?? '', | |
| ...value, | |
| })); | |
| }, [llmList, factoryList]); | |
| const fetchMyLlmList = useCallback(() => { | |
| dispatch({ | |
| type: 'settingModel/my_llm', | |
| }); | |
| }, [dispatch]); | |
| useEffect(() => { | |
| fetchMyLlmList(); | |
| }, [fetchMyLlmList]); | |
| return list; | |
| }; | |
| export interface IApiKeySavingParams { | |
| llm_factory: string; | |
| api_key: string; | |
| llm_name?: string; | |
| model_type?: string; | |
| base_url?: string; | |
| } | |
| export const useSaveApiKey = () => { | |
| const dispatch = useDispatch(); | |
| const saveApiKey = useCallback( | |
| (savingParams: IApiKeySavingParams) => { | |
| return dispatch<any>({ | |
| type: 'settingModel/set_api_key', | |
| payload: savingParams, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return saveApiKey; | |
| }; | |
| export interface ISystemModelSettingSavingParams { | |
| tenant_id: string; | |
| name?: string; | |
| asr_id: string; | |
| embd_id: string; | |
| img2txt_id: string; | |
| llm_id: string; | |
| } | |
| export const useSaveTenantInfo = () => { | |
| const dispatch = useDispatch(); | |
| const saveTenantInfo = useCallback( | |
| (savingParams: ISystemModelSettingSavingParams) => { | |
| return dispatch<any>({ | |
| type: 'settingModel/set_tenant_info', | |
| payload: savingParams, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return saveTenantInfo; | |
| }; | |
| export const useAddLlm = () => { | |
| const dispatch = useDispatch(); | |
| const addLlm = useCallback( | |
| (requestBody: IAddLlmRequestBody) => { | |
| return dispatch<any>({ | |
| type: 'settingModel/add_llm', | |
| payload: requestBody, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return addLlm; | |
| }; | |
| export const useDeleteLlm = () => { | |
| const dispatch = useDispatch(); | |
| const deleteLlm = useCallback( | |
| (requestBody: IDeleteLlmRequestBody) => { | |
| return dispatch<any>({ | |
| type: 'settingModel/delete_llm', | |
| payload: requestBody, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return deleteLlm; | |
| }; | |