| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 | import {  useCallback,  useEffect,  useMemo,  useState,} from 'react'import useSWR, { useSWRConfig } from 'swr'import { useContext } from 'use-context-selector'import type {  CustomConfigrationModelFixedFields,  DefaultModel,  DefaultModelResponse,  Model,} from './declarations'import {  ConfigurateMethodEnum,  ModelTypeEnum,} from './declarations'import I18n from '@/context/i18n'import {  fetchDefaultModal,  fetchModelList,  fetchModelProviderCredentials,  fetchModelProviders,  getPayUrl,  submitFreeQuota,} from '@/service/common'import { useProviderContext } from '@/context/provider-context'type UseDefaultModelAndModelList = (  defaultModel: DefaultModelResponse | undefined,  modelList: Model[],) => [DefaultModel | undefined, (model: DefaultModel) => void]export const useSystemDefaultModelAndModelList: UseDefaultModelAndModelList = (  defaultModel,  modelList,) => {  const currentDefaultModel = useMemo(() => {    const currentProvider = modelList.find(provider => provider.provider === defaultModel?.provider.provider)    const currentModel = currentProvider?.models.find(model => model.model === defaultModel?.model)    const currentDefaultModel = currentProvider && currentModel && {      model: currentModel.model,      provider: currentProvider.provider,    }    return currentDefaultModel  }, [defaultModel, modelList])  const [defaultModelState, setDefaultModelState] = useState<DefaultModel | undefined>(currentDefaultModel)  const handleDefaultModelChange = useCallback((model: DefaultModel) => {    setDefaultModelState(model)  }, [])  useEffect(() => {    setDefaultModelState(currentDefaultModel)  }, [currentDefaultModel])  return [defaultModelState, handleDefaultModelChange]}export const useLanguage = () => {  const { locale } = useContext(I18n)  return locale.replace('-', '_')}export const useProviderCrenditialsFormSchemasValue = (  provider: string,  configurateMethod: ConfigurateMethodEnum,  configured?: boolean,  currentCustomConfigrationModelFixedFields?: CustomConfigrationModelFixedFields,) => {  const { data: predefinedFormSchemasValue } = useSWR(    (configurateMethod === ConfigurateMethodEnum.predefinedModel && configured)      ? `/workspaces/current/model-providers/${provider}/credentials`      : null,    fetchModelProviderCredentials,  )  const { data: customFormSchemasValue } = useSWR(    (configurateMethod === ConfigurateMethodEnum.customizableModel && currentCustomConfigrationModelFixedFields)      ? `/workspaces/current/model-providers/${provider}/models/credentials?model=${currentCustomConfigrationModelFixedFields?.__model_name}&model_type=${currentCustomConfigrationModelFixedFields?.__model_type}`      : null,    fetchModelProviderCredentials,  )  const value = useMemo(() => {    return configurateMethod === ConfigurateMethodEnum.predefinedModel      ? predefinedFormSchemasValue?.credentials      : customFormSchemasValue?.credentials        ? {          ...customFormSchemasValue?.credentials,          ...currentCustomConfigrationModelFixedFields,        }        : undefined  }, [    configurateMethod,    currentCustomConfigrationModelFixedFields,    customFormSchemasValue?.credentials,    predefinedFormSchemasValue?.credentials,  ])  return value}export type ModelTypeIndex = 1 | 2 | 3 | 4 | 5export const MODEL_TYPE_MAPS = {  1: ModelTypeEnum.textGeneration,  2: ModelTypeEnum.textEmbedding,  3: ModelTypeEnum.rerank,  4: ModelTypeEnum.speech2text,  5: ModelTypeEnum.tts,}export const useModelList = (type: ModelTypeIndex) => {  const { data, mutate, isLoading } = useSWR(`/workspaces/current/models/model-types/${MODEL_TYPE_MAPS[type]}`, fetchModelList)  return {    data: data?.data || [],    mutate,    isLoading,  }}export const useDefaultModel = (type: ModelTypeIndex) => {  const { data, mutate, isLoading } = useSWR(`/workspaces/current/default-model?model_type=${MODEL_TYPE_MAPS[type]}`, fetchDefaultModal)  return {    data: data?.data,    mutate,    isLoading,  }}export const useCurrentProviderAndModel = (modelList: Model[], defaultModel?: DefaultModel) => {  const currentProvider = modelList.find(provider => provider.provider === defaultModel?.provider)  const currentModel = currentProvider?.models.find(model => model.model === defaultModel?.model)  return {    currentProvider,    currentModel,  }}export const useTextGenerationCurrentProviderAndModelAndModelList = (defaultModel?: DefaultModel) => {  const { textGenerationModelList } = useProviderContext()  const {    currentProvider,    currentModel,  } = useCurrentProviderAndModel(textGenerationModelList, defaultModel)  return {    currentProvider,    currentModel,    textGenerationModelList,  }}export const useModelListAndDefaultModel = (type: ModelTypeIndex) => {  const { data: modelList } = useModelList(type)  const { data: defaultModel } = useDefaultModel(type)  return {    modelList,    defaultModel,  }}export const useModelListAndDefaultModelAndCurrentProviderAndModel = (type: ModelTypeIndex) => {  const { modelList, defaultModel } = useModelListAndDefaultModel(type)  const { currentProvider, currentModel } = useCurrentProviderAndModel(    modelList,    { provider: defaultModel?.provider.provider || '', model: defaultModel?.model || '' },  )  return {    modelList,    defaultModel,    currentProvider,    currentModel,  }}export const useUpdateModelList = () => {  const { mutate } = useSWRConfig()  const updateModelList = useCallback((type: ModelTypeIndex | ModelTypeEnum) => {    const modelType = typeof type === 'number' ? MODEL_TYPE_MAPS[type] : type    mutate(`/workspaces/current/models/model-types/${modelType}`)  }, [mutate])  return updateModelList}export const useAnthropicBuyQuota = () => {  const [loading, setLoading] = useState(false)  const handleGetPayUrl = async () => {    if (loading)      return    setLoading(true)    try {      const res = await getPayUrl('/workspaces/current/model-providers/anthropic/checkout-url')      window.location.href = res.url    }    finally {      setLoading(false)    }  }  return handleGetPayUrl}export const useFreeQuota = (onSuccess: () => void) => {  const [loading, setLoading] = useState(false)  const handleClick = async (type: string) => {    if (loading)      return    try {      setLoading(true)      const res = await submitFreeQuota(`/workspaces/current/model-providers/${type}/free-quota-submit`)      if (res.type === 'redirect' && res.redirect_url)        window.location.href = res.redirect_url      else if (res.type === 'submit' && res.result === 'success')        onSuccess()    }    finally {      setLoading(false)    }  }  return handleClick}export const useModelProviders = () => {  const { data: providersData, mutate, isLoading } = useSWR('/workspaces/current/model-providers', fetchModelProviders)  return {    data: providersData?.data || [],    mutate,    isLoading,  }}export const useUpdateModelProviders = () => {  const { mutate } = useSWRConfig()  const updateModelProviders = useCallback(() => {    mutate('/workspaces/current/model-providers')  }, [mutate])  return updateModelProviders}
 |