provider-context.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. onPlanInfoChanged: () => void
  35. enableReplaceWebAppLogo: boolean
  36. }>({
  37. modelProviders: [],
  38. textGenerationModelList: [],
  39. agentThoughtModelList: [],
  40. supportRetrievalMethods: [],
  41. hasSettedApiKey: true,
  42. plan: {
  43. type: Plan.sandbox,
  44. usage: {
  45. vectorSpace: 32,
  46. buildApps: 12,
  47. teamMembers: 1,
  48. annotatedResponse: 1,
  49. },
  50. total: {
  51. vectorSpace: 200,
  52. buildApps: 50,
  53. teamMembers: 1,
  54. annotatedResponse: 10,
  55. },
  56. },
  57. isFetchedPlan: false,
  58. enableBilling: false,
  59. onPlanInfoChanged: () => { },
  60. enableReplaceWebAppLogo: false,
  61. })
  62. export const useProviderContext = () => useContext(ProviderContext)
  63. type ProviderContextProviderProps = {
  64. children: React.ReactNode
  65. }
  66. export const ProviderContextProvider = ({
  67. children,
  68. }: ProviderContextProviderProps) => {
  69. const { data: providersData } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
  70. const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/'
  71. const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList)
  72. const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods)
  73. const agentThoughtModelList = useMemo(() => {
  74. const result: Model[] = []
  75. if (textGenerationModelList?.data) {
  76. textGenerationModelList?.data.forEach((item) => {
  77. const agentThoughtModels = item.models.filter(model => model.features?.includes(ModelFeatureEnum.agentThought))
  78. if (agentThoughtModels.length) {
  79. result.push({
  80. ...item,
  81. models: agentThoughtModels,
  82. })
  83. }
  84. })
  85. return result
  86. }
  87. return []
  88. }, [textGenerationModelList])
  89. const [plan, setPlan] = useState(defaultPlan)
  90. const [isFetchedPlan, setIsFetchedPlan] = useState(false)
  91. const [enableBilling, setEnableBilling] = useState(true)
  92. const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false)
  93. const fetchPlan = async () => {
  94. const data = await fetchCurrentPlanInfo()
  95. const enabled = data.billing.enabled
  96. setEnableBilling(enabled)
  97. setEnableReplaceWebAppLogo(data.can_replace_logo)
  98. if (enabled) {
  99. setPlan(parseCurrentPlan(data))
  100. setIsFetchedPlan(true)
  101. }
  102. }
  103. useEffect(() => {
  104. fetchPlan()
  105. }, [])
  106. return (
  107. <ProviderContext.Provider value={{
  108. modelProviders: providersData?.data || [],
  109. textGenerationModelList: textGenerationModelList?.data || [],
  110. agentThoughtModelList,
  111. hasSettedApiKey: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active),
  112. supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [],
  113. plan,
  114. isFetchedPlan,
  115. enableBilling,
  116. onPlanInfoChanged: fetchPlan,
  117. enableReplaceWebAppLogo,
  118. }}>
  119. {children}
  120. </ProviderContext.Provider>
  121. )
  122. }
  123. export default ProviderContext