123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- 'use client'
- import { createContext, useContext } from 'use-context-selector'
- import useSWR from 'swr'
- import { useEffect, useMemo, useState } from 'react'
- import {
- fetchModelList,
- fetchModelProviders,
- fetchSupportRetrievalMethods,
- operationUtm,
- } from '@/service/common'
- import {
- ModelFeatureEnum,
- 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'
- const ProviderContext = createContext<{
- modelProviders: ModelProvider[]
- textGenerationModelList: Model[]
- agentThoughtModelList: Model[]
- supportRetrievalMethods: RETRIEVE_METHOD[]
- hasSettedApiKey: boolean
- plan: {
- type: Plan
- usage: UsagePlanInfo
- total: UsagePlanInfo
- }
- isFetchedPlan: boolean
- enableBilling: boolean
- enableReplaceWebAppLogo: boolean
- }>({
- modelProviders: [],
- textGenerationModelList: [],
- agentThoughtModelList: [],
- supportRetrievalMethods: [],
- hasSettedApiKey: true,
- plan: {
- type: Plan.sandbox,
- usage: {
- vectorSpace: 32,
- buildApps: 12,
- teamMembers: 1,
- annotatedResponse: 1,
- },
- total: {
- vectorSpace: 200,
- buildApps: 50,
- teamMembers: 1,
- annotatedResponse: 10,
- },
- },
- isFetchedPlan: false,
- enableBilling: false,
- enableReplaceWebAppLogo: false,
- })
- export const useProviderContext = () => useContext(ProviderContext)
- 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 agentThoughtModelList = useMemo(() => {
- const result: Model[] = []
- if (textGenerationModelList?.data) {
- textGenerationModelList?.data.forEach((item) => {
- const agentThoughtModels = item.models.filter(model => model.features?.includes(ModelFeatureEnum.agentThought))
- if (agentThoughtModels.length) {
- result.push({
- ...item,
- models: agentThoughtModels,
- })
- }
- })
- return result
- }
- return []
- }, [textGenerationModelList])
- const [plan, setPlan] = useState(defaultPlan)
- const [isFetchedPlan, setIsFetchedPlan] = useState(false)
- const [enableBilling, setEnableBilling] = useState(true)
- const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false)
- const handleOperateUtm = () => {
- let utm
- try {
- utm = JSON.parse(localStorage?.getItem('utm') || '{}')
- }
- catch (e) {
- utm = {
- utm_source: '',
- utm_medium: '',
- utm_campaign: '',
- utm_content: '',
- utm_term: '',
- }
- }
- if (utm.utm_source || utm.utm_medium || utm.utm_campaign || utm.utm_content || utm.utm_term)
- operationUtm({ url: '/operation/utm', body: utm })
- }
- useEffect(() => {
- (async () => {
- const data = await fetchCurrentPlanInfo()
- const enabled = data.billing.enabled
- setEnableBilling(enabled)
- setEnableReplaceWebAppLogo(data.can_replace_logo)
- if (enabled) {
- setPlan(parseCurrentPlan(data))
- handleOperateUtm()
- setIsFetchedPlan(true)
- }
- })()
- }, [])
- return (
- <ProviderContext.Provider value={{
- modelProviders: providersData?.data || [],
- textGenerationModelList: textGenerationModelList?.data || [],
- agentThoughtModelList,
- hasSettedApiKey: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active),
- supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [],
- plan,
- isFetchedPlan,
- enableBilling,
- enableReplaceWebAppLogo,
- }}>
- {children}
- </ProviderContext.Provider>
- )
- }
- export default ProviderContext
|