123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- '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)
- // Adding a dangling comma to avoid the generic parsing issue in tsx, see:
- // https://github.com/microsoft/TypeScript/issues/15713
- // eslint-disable-next-line @typescript-eslint/comma-dangle
- 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
|