| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- 'use client'
- import { useCallback, useMemo, useState } from 'react'
- import DataSourceOptions from './data-source-options'
- import type { CrawlResultItem, CustomFile as File, FileItem } from '@/models/datasets'
- import { DataSourceType } from '@/models/datasets'
- import LocalFile from '@/app/components/rag-pipeline/components/panel/test-run/data-source/local-file'
- import produce from 'immer'
- import { useProviderContextSelector } from '@/context/provider-context'
- import { DataSourceProvider, type NotionPage } from '@/models/common'
- import Notion from '@/app/components/rag-pipeline/components/panel/test-run/data-source/notion'
- import VectorSpaceFull from '@/app/components/billing/vector-space-full'
- import FireCrawl from '@/app/components/rag-pipeline/components/panel/test-run/data-source/website/firecrawl'
- import JinaReader from '@/app/components/rag-pipeline/components/panel/test-run/data-source/website/jina-reader'
- import WaterCrawl from '@/app/components/rag-pipeline/components/panel/test-run/data-source/website/water-crawl'
- import Actions from './data-source/actions'
- import DocumentProcessing from '@/app/components/rag-pipeline/components/panel/test-run/document-processing'
- import { useTranslation } from 'react-i18next'
- import type { Datasource } from '@/app/components/rag-pipeline/components/panel/test-run/types'
- import LeftHeader from './left-header'
- import { usePublishedPipelineInfo } from '@/service/use-pipeline'
- import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
- import Loading from '@/app/components/base/loading'
- import type { Node } from '@/app/components/workflow/types'
- import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types'
- import FilePreview from './preview/file-preview'
- import NotionPagePreview from './preview/notion-page-preview'
- import WebsitePreview from './preview/web-preview'
-
- const TestRunPanel = () => {
- const { t } = useTranslation()
- const [currentStep, setCurrentStep] = useState(1)
- const [datasource, setDatasource] = useState<Datasource>()
- const [fileList, setFiles] = useState<FileItem[]>([])
- const [notionPages, setNotionPages] = useState<NotionPage[]>([])
- const [websitePages, setWebsitePages] = useState<CrawlResultItem[]>([])
- const [websiteCrawlJobId, setWebsiteCrawlJobId] = useState('')
- const [currentFile, setCurrentFile] = useState<File | undefined>()
- const [currentNotionPage, setCurrentNotionPage] = useState<NotionPage | undefined>()
- const [currentWebsite, setCurrentWebsite] = useState<CrawlResultItem | undefined>()
-
- const plan = useProviderContextSelector(state => state.plan)
- const enableBilling = useProviderContextSelector(state => state.enableBilling)
- const pipelineId = useDatasetDetailContextWithSelector(s => s.dataset?.pipeline_id)
-
- const { data: pipelineInfo, isFetching: isFetchingPipelineInfo } = usePublishedPipelineInfo(pipelineId || '')
-
- const allFileLoaded = (fileList.length > 0 && fileList.every(file => file.file.id))
- const isVectorSpaceFull = plan.usage.vectorSpace >= plan.total.vectorSpace
- const isShowVectorSpaceFull = allFileLoaded && isVectorSpaceFull && enableBilling
- const notSupportBatchUpload = enableBilling && plan.type === 'sandbox'
- const nextDisabled = useMemo(() => {
- if (!fileList.length)
- return true
- if (fileList.some(file => !file.file.id))
- return true
- return isShowVectorSpaceFull
- }, [fileList, isShowVectorSpaceFull])
-
- const nextBtnDisabled = useMemo(() => {
- if (!datasource) return true
- if (datasource.type === DataSourceType.FILE)
- return nextDisabled
- if (datasource.type === DataSourceType.NOTION)
- return isShowVectorSpaceFull || !notionPages.length
- if (datasource.type === DataSourceProvider.fireCrawl
- || datasource.type === DataSourceProvider.jinaReader
- || datasource.type === DataSourceProvider.waterCrawl)
- return isShowVectorSpaceFull || !websitePages.length
- return false
- }, [datasource, nextDisabled, isShowVectorSpaceFull, notionPages.length, websitePages.length])
-
- const updateFile = (fileItem: FileItem, progress: number, list: FileItem[]) => {
- const newList = produce(list, (draft) => {
- const targetIndex = draft.findIndex(file => file.fileID === fileItem.fileID)
- draft[targetIndex] = {
- ...draft[targetIndex],
- progress,
- }
- })
- setFiles(newList)
- }
-
- const updateFileList = useCallback((preparedFiles: FileItem[]) => {
- setFiles(preparedFiles)
- }, [])
-
- const updateNotionPages = useCallback((value: NotionPage[]) => {
- setNotionPages(value)
- }, [])
-
- const updateCurrentFile = useCallback((file: File) => {
- setCurrentFile(file)
- }, [])
-
- const hideFilePreview = useCallback(() => {
- setCurrentFile(undefined)
- }, [])
-
- const updateCurrentPage = useCallback((page: NotionPage) => {
- setCurrentNotionPage(page)
- }, [])
-
- const hideNotionPagePreview = useCallback(() => {
- setCurrentNotionPage(undefined)
- }, [])
-
- const updateCurrentWebsite = useCallback((website: CrawlResultItem) => {
- setCurrentWebsite(website)
- }, [])
-
- const hideWebsitePreview = useCallback(() => {
- setCurrentWebsite(undefined)
- }, [])
-
- const handleNextStep = useCallback(() => {
- setCurrentStep(preStep => preStep + 1)
- }, [])
-
- const handleBackStep = useCallback(() => {
- setCurrentStep(preStep => preStep - 1)
- }, [])
-
- const handleProcess = useCallback((data: Record<string, any>) => {
- if (!datasource)
- return
- const datasourceInfo: Record<string, any> = {}
- let datasource_type = ''
- if (datasource.type === DataSourceType.FILE) {
- datasource_type = 'local_file'
- datasourceInfo.fileId = fileList.map(file => file.fileID)
- }
- if (datasource.type === DataSourceType.NOTION) {
- datasource_type = 'online_document'
- datasourceInfo.workspaceId = notionPages[0].workspace_id
- datasourceInfo.page = notionPages.map((page) => {
- const { workspace_id, ...rest } = page
- return rest
- })
- }
- if (datasource.type === DataSourceProvider.fireCrawl
- || datasource.type === DataSourceProvider.jinaReader
- || datasource.type === DataSourceProvider.waterCrawl) {
- datasource_type = 'website_crawl'
- datasourceInfo.jobId = websiteCrawlJobId
- datasourceInfo.result = websitePages
- }
- // todo: Run Pipeline
- console.log('datasource_type', datasource_type)
- }, [datasource, fileList, notionPages, websiteCrawlJobId, websitePages])
-
- if (isFetchingPipelineInfo) {
- return (
- <Loading type='app' />
- )
- }
-
- return (
- <div
- className='relative flex h-[calc(100vh-56px)] min-w-[1512px] rounded-t-2xl border-t border-effects-highlight bg-background-default-subtle'
- >
- <div className='flex flex-1 flex-col px-14'>
- <LeftHeader
- title={t('datasetPipeline.addDocuments.title')}
- currentStep={currentStep}
- />
- <div className='grow overflow-y-auto'>
- {
- currentStep === 1 && (
- <div className='flex flex-col gap-y-5 pt-4'>
- <DataSourceOptions
- datasourceNodeId={datasource?.nodeId || ''}
- onSelect={setDatasource}
- pipelineNodes={(pipelineInfo?.graph.nodes || []) as Node<DataSourceNodeType>[]}
- />
- {datasource?.type === DataSourceType.FILE && (
- <LocalFile
- files={fileList}
- updateFile={updateFile}
- updateFileList={updateFileList}
- onPreview={updateCurrentFile}
- notSupportBatchUpload={notSupportBatchUpload}
- />
- )}
- {datasource?.type === DataSourceType.NOTION && (
- <Notion
- nodeId={datasource?.nodeId || ''}
- notionPages={notionPages}
- updateNotionPages={updateNotionPages}
- canPreview
- onPreview={updateCurrentPage}
- />
- )}
- {datasource?.type === DataSourceProvider.fireCrawl && (
- <FireCrawl
- nodeId={datasource?.nodeId || ''}
- variables={datasource?.variables}
- checkedCrawlResult={websitePages}
- onCheckedCrawlResultChange={setWebsitePages}
- onJobIdChange={setWebsiteCrawlJobId}
- onPreview={updateCurrentWebsite}
- />
- )}
- {datasource?.type === DataSourceProvider.jinaReader && (
- <JinaReader
- nodeId={datasource?.nodeId || ''}
- variables={datasource?.variables}
- checkedCrawlResult={websitePages}
- onCheckedCrawlResultChange={setWebsitePages}
- onJobIdChange={setWebsiteCrawlJobId}
- onPreview={updateCurrentWebsite}
- />
- )}
- {datasource?.type === DataSourceProvider.waterCrawl && (
- <WaterCrawl
- nodeId={datasource?.nodeId || ''}
- variables={datasource?.variables}
- checkedCrawlResult={websitePages}
- onCheckedCrawlResultChange={setWebsitePages}
- onJobIdChange={setWebsiteCrawlJobId}
- onPreview={updateCurrentWebsite}
- />
- )}
- {isShowVectorSpaceFull && (
- <VectorSpaceFull />
- )}
- <Actions disabled={nextBtnDisabled} handleNextStep={handleNextStep} />
- </div>
- )
- }
- {
- currentStep === 2 && (
- <DocumentProcessing
- dataSourceNodeId={datasource?.nodeId || ''}
- onProcess={handleProcess}
- onBack={handleBackStep}
- />
- )
- }
- </div>
- </div>
- {/* Preview */}
- <div className='flex h-full flex-1 shrink-0 flex-col pl-2 pt-2'>
- {
- currentStep === 1 && (
- <>
- {currentFile && <FilePreview file={currentFile} hidePreview={hideFilePreview} />}
- {currentNotionPage && <NotionPagePreview currentPage={currentNotionPage} hidePreview={hideNotionPagePreview} />}
- {currentWebsite && <WebsitePreview payload={currentWebsite} hidePreview={hideWebsitePreview} />}
- </>
- )
- }
- </div>
- </div>
- )
- }
-
- export default TestRunPanel
|