|
'use client' |
|
|
|
import { createContext, useContext, useContextSelector } from 'use-context-selector' |
|
import useSWR from 'swr' |
|
import { useEffect, useState } from 'react' |
|
import { |
|
fetchModelList, |
|
fetchModelProviders, |
|
fetchSupportRetrievalMethods, |
|
} from '@/service/common' |
|
import { |
|
ModelStatusEnum, |
|
ModelTypeEnum, |
|
} from '@/app/components/header/account-setting/model-provider-page/declarations' |
|
import type { Model, ModelProvider } from '@/app/components/header/account-setting/model-provider-page/declarations' |
|
import type { RETRIEVE_METHOD } from '@/types/app' |
|
import { Plan, type UsagePlanInfo } from '@/app/components/billing/type' |
|
import { fetchCurrentPlanInfo } from '@/service/billing' |
|
import { parseCurrentPlan } from '@/app/components/billing/utils' |
|
import { defaultPlan } from '@/app/components/billing/config' |
|
|
|
type ProviderContextState = { |
|
modelProviders: ModelProvider[] |
|
textGenerationModelList: Model[] |
|
supportRetrievalMethods: RETRIEVE_METHOD[] |
|
isAPIKeySet: boolean |
|
plan: { |
|
type: Plan |
|
usage: UsagePlanInfo |
|
total: UsagePlanInfo |
|
} |
|
isFetchedPlan: boolean |
|
enableBilling: boolean |
|
onPlanInfoChanged: () => void |
|
enableReplaceWebAppLogo: boolean |
|
modelLoadBalancingEnabled: boolean |
|
datasetOperatorEnabled: boolean |
|
} |
|
const ProviderContext = createContext<ProviderContextState>({ |
|
modelProviders: [], |
|
textGenerationModelList: [], |
|
supportRetrievalMethods: [], |
|
isAPIKeySet: true, |
|
plan: { |
|
type: Plan.sandbox, |
|
usage: { |
|
vectorSpace: 32, |
|
buildApps: 12, |
|
teamMembers: 1, |
|
annotatedResponse: 1, |
|
documentsUploadQuota: 50, |
|
}, |
|
total: { |
|
vectorSpace: 200, |
|
buildApps: 50, |
|
teamMembers: 1, |
|
annotatedResponse: 10, |
|
documentsUploadQuota: 500, |
|
}, |
|
}, |
|
isFetchedPlan: false, |
|
enableBilling: false, |
|
onPlanInfoChanged: () => { }, |
|
enableReplaceWebAppLogo: false, |
|
modelLoadBalancingEnabled: false, |
|
datasetOperatorEnabled: false, |
|
}) |
|
|
|
export const useProviderContext = () => useContext(ProviderContext) |
|
|
|
|
|
|
|
|
|
export const useProviderContextSelector = <T,>(selector: (state: ProviderContextState) => T): T => |
|
useContextSelector(ProviderContext, selector) |
|
|
|
type ProviderContextProviderProps = { |
|
children: React.ReactNode |
|
} |
|
export const ProviderContextProvider = ({ |
|
children, |
|
}: ProviderContextProviderProps) => { |
|
const { data: providersData } = useSWR('/workspaces/current/model-providers', fetchModelProviders) |
|
const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/' |
|
const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList) |
|
const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods) |
|
|
|
const [plan, setPlan] = useState(defaultPlan) |
|
const [isFetchedPlan, setIsFetchedPlan] = useState(false) |
|
const [enableBilling, setEnableBilling] = useState(true) |
|
const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false) |
|
const [modelLoadBalancingEnabled, setModelLoadBalancingEnabled] = useState(false) |
|
const [datasetOperatorEnabled, setDatasetOperatorEnabled] = useState(false) |
|
|
|
const fetchPlan = async () => { |
|
const data = await fetchCurrentPlanInfo() |
|
const enabled = data.billing.enabled |
|
setEnableBilling(enabled) |
|
setEnableReplaceWebAppLogo(data.can_replace_logo) |
|
if (enabled) { |
|
setPlan(parseCurrentPlan(data)) |
|
setIsFetchedPlan(true) |
|
} |
|
if (data.model_load_balancing_enabled) |
|
setModelLoadBalancingEnabled(true) |
|
if (data.dataset_operator_enabled) |
|
setDatasetOperatorEnabled(true) |
|
} |
|
useEffect(() => { |
|
fetchPlan() |
|
}, []) |
|
|
|
return ( |
|
<ProviderContext.Provider value={{ |
|
modelProviders: providersData?.data || [], |
|
textGenerationModelList: textGenerationModelList?.data || [], |
|
isAPIKeySet: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active), |
|
supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [], |
|
plan, |
|
isFetchedPlan, |
|
enableBilling, |
|
onPlanInfoChanged: fetchPlan, |
|
enableReplaceWebAppLogo, |
|
modelLoadBalancingEnabled, |
|
datasetOperatorEnabled, |
|
}}> |
|
{children} |
|
</ProviderContext.Provider> |
|
) |
|
} |
|
|
|
export default ProviderContext |
|
|