provider-context.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. 'use client'
  2. import { createContext, useContext } from 'use-context-selector'
  3. import useSWR from 'swr'
  4. import { useEffect, useMemo, useState } from 'react'
  5. import {
  6. fetchModelList,
  7. fetchModelProviders,
  8. fetchSupportRetrievalMethods,
  9. } from '@/service/common'
  10. import {
  11. ModelFeatureEnum,
  12. ModelStatusEnum,
  13. ModelTypeEnum,
  14. } from '@/app/components/header/account-setting/model-provider-page/declarations'
  15. import type { Model, ModelProvider } from '@/app/components/header/account-setting/model-provider-page/declarations'
  16. import type { RETRIEVE_METHOD } from '@/types/app'
  17. import { Plan, type UsagePlanInfo } from '@/app/components/billing/type'
  18. import { fetchCurrentPlanInfo } from '@/service/billing'
  19. import { parseCurrentPlan } from '@/app/components/billing/utils'
  20. import { defaultPlan } from '@/app/components/billing/config'
  21. const ProviderContext = createContext<{
  22. modelProviders: ModelProvider[]
  23. textGenerationModelList: Model[]
  24. agentThoughtModelList: Model[]
  25. supportRetrievalMethods: RETRIEVE_METHOD[]
  26. hasSettedApiKey: boolean
  27. plan: {
  28. type: Plan
  29. usage: UsagePlanInfo
  30. total: UsagePlanInfo
  31. }
  32. isFetchedPlan: boolean
  33. enableBilling: boolean
  34. enableReplaceWebAppLogo: boolean
  35. }>({
  36. modelProviders: [],
  37. textGenerationModelList: [],
  38. agentThoughtModelList: [],
  39. supportRetrievalMethods: [],
  40. hasSettedApiKey: true,
  41. plan: {
  42. type: Plan.sandbox,
  43. usage: {
  44. vectorSpace: 32,
  45. buildApps: 12,
  46. teamMembers: 1,
  47. annotatedResponse: 1,
  48. },
  49. total: {
  50. vectorSpace: 200,
  51. buildApps: 50,
  52. teamMembers: 1,
  53. annotatedResponse: 10,
  54. },
  55. },
  56. isFetchedPlan: false,
  57. enableBilling: false,
  58. enableReplaceWebAppLogo: false,
  59. })
  60. export const useProviderContext = () => useContext(ProviderContext)
  61. type ProviderContextProviderProps = {
  62. children: React.ReactNode
  63. }
  64. export const ProviderContextProvider = ({
  65. children,
  66. }: ProviderContextProviderProps) => {
  67. const { data: providersData } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
  68. const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/'
  69. const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList)
  70. const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods)
  71. const agentThoughtModelList = useMemo(() => {
  72. const result: Model[] = []
  73. if (textGenerationModelList?.data) {
  74. textGenerationModelList?.data.forEach((item) => {
  75. const agentThoughtModels = item.models.filter(model => model.features?.includes(ModelFeatureEnum.agentThought))
  76. if (agentThoughtModels.length) {
  77. result.push({
  78. ...item,
  79. models: agentThoughtModels,
  80. })
  81. }
  82. })
  83. return result
  84. }
  85. return []
  86. }, [textGenerationModelList])
  87. const [plan, setPlan] = useState(defaultPlan)
  88. const [isFetchedPlan, setIsFetchedPlan] = useState(false)
  89. const [enableBilling, setEnableBilling] = useState(true)
  90. const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false)
  91. useEffect(() => {
  92. (async () => {
  93. const data = await fetchCurrentPlanInfo()
  94. const enabled = data.billing.enabled
  95. setEnableBilling(enabled)
  96. setEnableReplaceWebAppLogo(data.can_replace_logo)
  97. if (enabled) {
  98. setPlan(parseCurrentPlan(data))
  99. // setPlan(parseCurrentPlan({
  100. // ...data,
  101. // annotation_quota_limit: {
  102. // ...data.annotation_quota_limit,
  103. // limit: 10,
  104. // },
  105. // }))
  106. setIsFetchedPlan(true)
  107. }
  108. })()
  109. }, [])
  110. return (
  111. <ProviderContext.Provider value={{
  112. modelProviders: providersData?.data || [],
  113. textGenerationModelList: textGenerationModelList?.data || [],
  114. agentThoughtModelList,
  115. hasSettedApiKey: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active),
  116. supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [],
  117. plan,
  118. isFetchedPlan,
  119. enableBilling,
  120. enableReplaceWebAppLogo,
  121. }}>
  122. {children}
  123. </ProviderContext.Provider>
  124. )
  125. }
  126. export default ProviderContext