balibabu
feat: support GPT-4o #771 and hide the add button when the folder is a knowledge base (#775)
1a0fce6
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, | |
), | |
}; | |
}; | |
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; | |
}; | |