Browse Source

Fix/speech to text button (#947)

zxhlyh 1 year ago
parent
commit
b185a70c21

+ 0 - 1
web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/page.tsx

@@ -16,7 +16,6 @@ const Overview = async ({
   const { t } = await useTranslation(locale, 'app-overview')
   return (
     <div className="h-full px-16 py-6 overflow-scroll">
-      {/* <WelcomeBanner /> */}
       <ApikeyInfoPanel />
       <div className='flex flex-row items-center justify-between mb-4 text-xl text-gray-900'>
         {t('overview.title')}

File diff suppressed because it is too large
+ 0 - 200
web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/welcome-banner.tsx


+ 4 - 4
web/app/components/app/configuration/config/index.tsx

@@ -38,7 +38,7 @@ const Config: FC = () => {
     setSpeechToTextConfig,
   } = useContext(ConfigContext)
   const isChatApp = mode === AppType.chat
-  const { currentProvider } = useProviderContext()
+  const { speech2textDefaultModel } = useProviderContext()
 
   const promptTemplate = modelConfig.configs.prompt_template
   const promptVariables = modelConfig.configs.prompt_variables
@@ -90,7 +90,7 @@ const Config: FC = () => {
     },
   })
 
-  const hasChatConfig = isChatApp && (featureConfig.openingStatement || featureConfig.suggestedQuestionsAfterAnswer || (featureConfig.speechToText && currentProvider?.provider_name === 'openai'))
+  const hasChatConfig = isChatApp && (featureConfig.openingStatement || featureConfig.suggestedQuestionsAfterAnswer || (featureConfig.speechToText && !!speech2textDefaultModel))
   const hasToolbox = false
 
   const [showAutomatic, { setTrue: showAutomaticTrue, setFalse: showAutomaticFalse }] = useBoolean(false)
@@ -120,7 +120,7 @@ const Config: FC = () => {
             isChatApp={isChatApp}
             config={featureConfig}
             onChange={handleFeatureChange}
-            showSpeechToTextItem={currentProvider?.provider_name === 'openai'}
+            showSpeechToTextItem={!!speech2textDefaultModel}
           />
         )}
         {showAutomatic && (
@@ -160,7 +160,7 @@ const Config: FC = () => {
                 }
               }
               isShowSuggestedQuestionsAfterAnswer={featureConfig.suggestedQuestionsAfterAnswer}
-              isShowSpeechText={featureConfig.speechToText && currentProvider?.provider_name === 'openai'}
+              isShowSpeechText={featureConfig.speechToText && !!speech2textDefaultModel}
             />
           )
         }

+ 2 - 2
web/app/components/app/configuration/debug/index.tsx

@@ -52,7 +52,7 @@ const Debug: FC<IDebug> = ({
     modelConfig,
     completionParams,
   } = useContext(ConfigContext)
-  const { currentProvider } = useProviderContext()
+  const { speech2textDefaultModel } = useProviderContext()
   const [chatList, setChatList, getChatList] = useGetState<IChatItem[]>([])
   const chatListDomRef = useRef<HTMLDivElement>(null)
   useEffect(() => {
@@ -390,7 +390,7 @@ const Debug: FC<IDebug> = ({
                   }}
                   isShowSuggestion={doShowSuggestion}
                   suggestionList={suggestQuestions}
-                  isShowSpeechToText={speechToTextConfig.enabled && currentProvider?.provider_name === 'openai'}
+                  isShowSpeechToText={speechToTextConfig.enabled && !!speech2textDefaultModel}
                 />
               </div>
             </div>

+ 4 - 10
web/app/components/datasets/create/index.tsx

@@ -9,9 +9,10 @@ import StepTwo from './step-two'
 import StepThree from './step-three'
 import { DataSourceType } from '@/models/datasets'
 import type { DataSet, FileItem, createDocumentResponse } from '@/models/datasets'
-import { fetchDataSource, fetchTenantInfo } from '@/service/common'
+import { fetchDataSource } from '@/service/common'
 import { fetchDataDetail } from '@/service/datasets'
 import type { DataSourceNotionPage } from '@/models/common'
+import { useProviderContext } from '@/context/provider-context'
 
 import AccountSetting from '@/app/components/header/account-setting'
 
@@ -23,7 +24,6 @@ type DatasetUpdateFormProps = {
 
 const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
   const { t } = useTranslation()
-  const [hasSetAPIKEY, setHasSetAPIKEY] = useState(true)
   const [isShowSetAPIKey, { setTrue: showSetAPIKey, setFalse: hideSetAPIkey }] = useBoolean()
   const [hasConnection, setHasConnection] = useState(true)
   const [isShowDataSourceSetting, { setTrue: showDataSourceSetting, setFalse: hideDataSourceSetting }] = useBoolean()
@@ -33,6 +33,7 @@ const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
   const [fileList, setFiles] = useState<FileItem[]>([])
   const [result, setResult] = useState<createDocumentResponse | undefined>()
   const [hasError, setHasError] = useState(false)
+  const { embeddingsDefaultModel } = useProviderContext()
 
   const [notionPages, setNotionPages] = useState<Page[]>([])
   const updateNotionPages = (value: Page[]) => {
@@ -77,11 +78,6 @@ const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
     setStep(step + delta)
   }, [step, setStep])
 
-  const checkAPIKey = async () => {
-    const data = await fetchTenantInfo({ url: '/info' })
-    const hasSetKey = data.providers.some(({ is_valid }) => is_valid)
-    setHasSetAPIKEY(hasSetKey)
-  }
   const checkNotionConnection = async () => {
     const { data } = await fetchDataSource({ url: '/data-source/integrates' })
     const hasConnection = data.filter(item => item.provider === 'notion') || []
@@ -89,7 +85,6 @@ const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
   }
 
   useEffect(() => {
-    checkAPIKey()
     checkNotionConnection()
   }, [])
 
@@ -132,7 +127,7 @@ const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
           onStepChange={nextStep}
         />}
         {(step === 2 && (!datasetId || (datasetId && !!detail))) && <StepTwo
-          hasSetAPIKEY={hasSetAPIKEY}
+          hasSetAPIKEY={!!embeddingsDefaultModel}
           onSetting={showSetAPIKey}
           indexingType={detail?.indexing_technique || ''}
           datasetId={datasetId}
@@ -151,7 +146,6 @@ const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
         />}
       </div>
       {isShowSetAPIKey && <AccountSetting activeTab="provider" onCancel={async () => {
-        await checkAPIKey()
         hideSetAPIkey()
       }} />}
       {isShowDataSourceSetting && <AccountSetting activeTab="data-source" onCancel={hideDataSourceSetting}/>}

+ 3 - 14
web/app/components/datasets/documents/detail/settings/index.tsx

@@ -6,7 +6,6 @@ import { useContext } from 'use-context-selector'
 import { useRouter } from 'next/navigation'
 import DatasetDetailContext from '@/context/dataset-detail'
 import type { FullDocumentDetail } from '@/models/datasets'
-import { fetchTenantInfo } from '@/service/common'
 import type { MetadataType } from '@/service/datasets'
 import { fetchDocumentDetail } from '@/service/datasets'
 
@@ -14,6 +13,7 @@ import Loading from '@/app/components/base/loading'
 import StepTwo from '@/app/components/datasets/create/step-two'
 import AccountSetting from '@/app/components/header/account-setting'
 import AppUnavailable from '@/app/components/base/app-unavailable'
+import { useProviderContext } from '@/context/provider-context'
 
 type DocumentSettingsProps = {
   datasetId: string
@@ -23,25 +23,15 @@ type DocumentSettingsProps = {
 const DocumentSettings = ({ datasetId, documentId }: DocumentSettingsProps) => {
   const { t } = useTranslation()
   const router = useRouter()
-  const [hasSetAPIKEY, setHasSetAPIKEY] = useState(true)
   const [isShowSetAPIKey, { setTrue: showSetAPIKey, setFalse: hideSetAPIkey }] = useBoolean()
   const [hasError, setHasError] = useState(false)
   const { indexingTechnique, dataset } = useContext(DatasetDetailContext)
+  const { embeddingsDefaultModel } = useProviderContext()
 
   const saveHandler = () => router.push(`/datasets/${datasetId}/documents/${documentId}`)
 
   const cancelHandler = () => router.back()
 
-  const checkAPIKey = async () => {
-    const data = await fetchTenantInfo({ url: '/info' })
-    const hasSetKey = data.providers.some(({ is_valid }) => is_valid)
-    setHasSetAPIKEY(hasSetKey)
-  }
-
-  useEffect(() => {
-    checkAPIKey()
-  }, [])
-
   const [documentDetail, setDocumentDetail] = useState<FullDocumentDetail | null>(null)
   const currentPage = useMemo(() => {
     return {
@@ -77,7 +67,7 @@ const DocumentSettings = ({ datasetId, documentId }: DocumentSettingsProps) => {
         {!documentDetail && <Loading type='app' />}
         {dataset && documentDetail && (
           <StepTwo
-            hasSetAPIKEY={hasSetAPIKEY}
+            hasSetAPIKEY={!!embeddingsDefaultModel}
             onSetting={showSetAPIKey}
             datasetId={datasetId}
             dataSourceType={documentDetail.data_source_type}
@@ -92,7 +82,6 @@ const DocumentSettings = ({ datasetId, documentId }: DocumentSettingsProps) => {
         )}
       </div>
       {isShowSetAPIKey && <AccountSetting activeTab="provider" onCancel={async () => {
-        await checkAPIKey()
         hideSetAPIkey()
       }} />}
     </div>

+ 7 - 3
web/app/components/header/account-setting/model-page/index.tsx

@@ -61,11 +61,15 @@ type DeleteModel = {
 
 const ModelPage = () => {
   const { t } = useTranslation()
-  const { updateModelList } = useProviderContext()
+  const {
+    updateModelList,
+    embeddingsDefaultModel,
+    mutateEmbeddingsDefaultModel,
+    speech2textDefaultModel,
+    mutateSpeech2textDefaultModel,
+  } = useProviderContext()
   const { data: providers, mutate: mutateProviders } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
   const { data: textGenerationDefaultModel, mutate: mutateTextGenerationDefaultModel } = useSWR('/workspaces/current/default-model?model_type=text-generation', fetchDefaultModal)
-  const { data: embeddingsDefaultModel, mutate: mutateEmbeddingsDefaultModel } = useSWR('/workspaces/current/default-model?model_type=embeddings', fetchDefaultModal)
-  const { data: speech2textDefaultModel, mutate: mutateSpeech2textDefaultModel } = useSWR('/workspaces/current/default-model?model_type=speech2text', fetchDefaultModal)
   const [showMoreModel, setShowMoreModel] = useState(false)
   const [showModal, setShowModal] = useState(false)
   const { notify } = useToastContext()

+ 15 - 12
web/context/provider-context.tsx

@@ -2,29 +2,29 @@
 
 import { createContext, useContext } from 'use-context-selector'
 import useSWR from 'swr'
-import { fetchModelList, fetchTenantInfo } from '@/service/common'
+import { fetchDefaultModal, fetchModelList } from '@/service/common'
 import { ModelFeature, ModelType } from '@/app/components/header/account-setting/model-page/declarations'
 import type { BackendModel } from '@/app/components/header/account-setting/model-page/declarations'
 const ProviderContext = createContext<{
-  currentProvider: {
-    provider: string
-    provider_name: string
-    token_is_set: boolean
-    is_valid: boolean
-    token_is_valid: boolean
-  } | null | undefined
   textGenerationModelList: BackendModel[]
   embeddingsModelList: BackendModel[]
   speech2textModelList: BackendModel[]
   agentThoughtModelList: BackendModel[]
   updateModelList: (type: ModelType) => void
+  embeddingsDefaultModel?: BackendModel
+  mutateEmbeddingsDefaultModel: () => void
+  speech2textDefaultModel?: BackendModel
+  mutateSpeech2textDefaultModel: () => void
 }>({
-      currentProvider: null,
       textGenerationModelList: [],
       embeddingsModelList: [],
       speech2textModelList: [],
       agentThoughtModelList: [],
       updateModelList: () => {},
+      speech2textDefaultModel: undefined,
+      mutateSpeech2textDefaultModel: () => {},
+      embeddingsDefaultModel: undefined,
+      mutateEmbeddingsDefaultModel: () => {},
     })
 
 export const useProviderContext = () => useContext(ProviderContext)
@@ -35,8 +35,8 @@ type ProviderContextProviderProps = {
 export const ProviderContextProvider = ({
   children,
 }: ProviderContextProviderProps) => {
-  const { data: userInfo } = useSWR({ url: '/info' }, fetchTenantInfo)
-  const currentProvider = userInfo?.providers?.find(({ token_is_set, is_valid, provider_name }) => token_is_set && is_valid && (provider_name === 'openai' || provider_name === 'azure_openai'))
+  const { data: embeddingsDefaultModel, mutate: mutateEmbeddingsDefaultModel } = useSWR('/workspaces/current/default-model?model_type=embeddings', fetchDefaultModal)
+  const { data: speech2textDefaultModel, mutate: mutateSpeech2textDefaultModel } = useSWR('/workspaces/current/default-model?model_type=speech2text', fetchDefaultModal)
   const fetchModelListUrlPrefix = '/workspaces/current/models/model-type/'
   const { data: textGenerationModelList, mutate: mutateTextGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelType.textGeneration}`, fetchModelList)
   const { data: embeddingsModelList, mutate: mutateEmbeddingsModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelType.embeddings}`, fetchModelList)
@@ -54,12 +54,15 @@ export const ProviderContextProvider = ({
 
   return (
     <ProviderContext.Provider value={{
-      currentProvider,
       textGenerationModelList: textGenerationModelList || [],
       embeddingsModelList: embeddingsModelList || [],
       speech2textModelList: speech2textModelList || [],
       agentThoughtModelList: agentThoughtModelList || [],
       updateModelList,
+      embeddingsDefaultModel,
+      mutateEmbeddingsDefaultModel,
+      speech2textDefaultModel,
+      mutateSpeech2textDefaultModel,
     }}>
       {children}
     </ProviderContext.Provider>