| '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 |
|
|