Spaces:
Paused
Paused
import { LlmModelType } from '@/constants/knowledge'; | |
import { ResponseGetType } from '@/interfaces/database/base'; | |
import { | |
IFactory, | |
IMyLlmValue, | |
IThirdOAIModelCollection as IThirdAiModelCollection, | |
IThirdOAIModelCollection, | |
} from '@/interfaces/database/llm'; | |
import { | |
IAddLlmRequestBody, | |
IDeleteLlmRequestBody, | |
} from '@/interfaces/request/llm'; | |
import userService from '@/services/user-service'; | |
import { sortLLmFactoryListBySpecifiedOrder } from '@/utils/common-util'; | |
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; | |
import { message } from 'antd'; | |
import { useMemo } from 'react'; | |
import { useTranslation } from 'react-i18next'; | |
export const useFetchLlmList = ( | |
modelType?: LlmModelType, | |
): IThirdAiModelCollection => { | |
const { data } = useQuery({ | |
queryKey: ['llmList'], | |
initialData: {}, | |
queryFn: async () => { | |
const { data } = await userService.llm_list({ model_type: modelType }); | |
return data?.data ?? {}; | |
}, | |
}); | |
return data; | |
}; | |
export const useSelectLlmOptions = () => { | |
const llmInfo: IThirdOAIModelCollection = useFetchLlmList(); | |
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 = useFetchLlmList(); | |
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 useFetchLlmFactoryList = (): ResponseGetType<IFactory[]> => { | |
const { data, isFetching: loading } = useQuery({ | |
queryKey: ['factoryList'], | |
initialData: [], | |
gcTime: 0, | |
queryFn: async () => { | |
const { data } = await userService.factories_list(); | |
return data?.data ?? []; | |
}, | |
}); | |
return { data, loading }; | |
}; | |
export type LlmItem = { name: string; logo: string } & IMyLlmValue; | |
export const useFetchMyLlmList = (): ResponseGetType< | |
Record<string, IMyLlmValue> | |
> => { | |
const { data, isFetching: loading } = useQuery({ | |
queryKey: ['myLlmList'], | |
initialData: {}, | |
gcTime: 0, | |
queryFn: async () => { | |
const { data } = await userService.my_llm(); | |
return data?.data ?? {}; | |
}, | |
}); | |
return { data, loading }; | |
}; | |
export const useSelectLlmList = () => { | |
const { data: myLlmList, loading: myLlmListLoading } = useFetchMyLlmList(); | |
const { data: factoryList, loading: factoryListLoading } = | |
useFetchLlmFactoryList(); | |
const nextMyLlmList: Array<LlmItem> = useMemo(() => { | |
return Object.entries(myLlmList).map(([key, value]) => ({ | |
name: key, | |
logo: factoryList.find((x) => x.name === key)?.logo ?? '', | |
...value, | |
})); | |
}, [myLlmList, factoryList]); | |
const nextFactoryList = useMemo(() => { | |
const currentList = factoryList.filter((x) => | |
Object.keys(myLlmList).every((y) => y !== x.name), | |
); | |
return sortLLmFactoryListBySpecifiedOrder(currentList); | |
}, [factoryList, myLlmList]); | |
return { | |
myLlmList: nextMyLlmList, | |
factoryList: nextFactoryList, | |
loading: myLlmListLoading || factoryListLoading, | |
}; | |
}; | |
export interface IApiKeySavingParams { | |
llm_factory: string; | |
api_key: string; | |
llm_name?: string; | |
model_type?: string; | |
base_url?: string; | |
} | |
export const useSaveApiKey = () => { | |
const queryClient = useQueryClient(); | |
const { t } = useTranslation(); | |
const { | |
data, | |
isPending: loading, | |
mutateAsync, | |
} = useMutation({ | |
mutationKey: ['saveApiKey'], | |
mutationFn: async (params: IApiKeySavingParams) => { | |
const { data } = await userService.set_api_key(params); | |
if (data.retcode === 0) { | |
message.success(t('message.modified')); | |
queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); | |
queryClient.invalidateQueries({ queryKey: ['factoryList'] }); | |
} | |
return data.retcode; | |
}, | |
}); | |
return { data, loading, saveApiKey: mutateAsync }; | |
}; | |
export interface ISystemModelSettingSavingParams { | |
tenant_id: string; | |
name?: string; | |
asr_id: string; | |
embd_id: string; | |
img2txt_id: string; | |
llm_id: string; | |
} | |
export const useSaveTenantInfo = () => { | |
const { t } = useTranslation(); | |
const { | |
data, | |
isPending: loading, | |
mutateAsync, | |
} = useMutation({ | |
mutationKey: ['saveTenantInfo'], | |
mutationFn: async (params: ISystemModelSettingSavingParams) => { | |
const { data } = await userService.set_tenant_info(params); | |
if (data.retcode === 0) { | |
message.success(t('message.modified')); | |
} | |
return data.retcode; | |
}, | |
}); | |
return { data, loading, saveTenantInfo: mutateAsync }; | |
}; | |
export const useAddLlm = () => { | |
const queryClient = useQueryClient(); | |
const { t } = useTranslation(); | |
const { | |
data, | |
isPending: loading, | |
mutateAsync, | |
} = useMutation({ | |
mutationKey: ['addLlm'], | |
mutationFn: async (params: IAddLlmRequestBody) => { | |
const { data } = await userService.add_llm(params); | |
if (data.retcode === 0) { | |
queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); | |
queryClient.invalidateQueries({ queryKey: ['factoryList'] }); | |
message.success(t('message.modified')); | |
} | |
return data.retcode; | |
}, | |
}); | |
return { data, loading, addLlm: mutateAsync }; | |
}; | |
export const useDeleteLlm = () => { | |
const queryClient = useQueryClient(); | |
const { t } = useTranslation(); | |
const { | |
data, | |
isPending: loading, | |
mutateAsync, | |
} = useMutation({ | |
mutationKey: ['deleteLlm'], | |
mutationFn: async (params: IDeleteLlmRequestBody) => { | |
const { data } = await userService.delete_llm(params); | |
if (data.retcode === 0) { | |
queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); | |
queryClient.invalidateQueries({ queryKey: ['factoryList'] }); | |
message.success(t('message.deleted')); | |
} | |
return data.retcode; | |
}, | |
}); | |
return { data, loading, deleteLlm: mutateAsync }; | |
}; | |