import type { FC } from 'react' import type { FullDocumentDetail } from '@/models/datasets' import type { RETRIEVE_METHOD } from '@/types/app' import { buttonVariants } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { RiArrowRightLine, RiLoader2Fill, RiTerminalBoxLine } from '@remixicon/react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import VectorSpaceAdmissionAlert from '@/app/components/datasets/common/vector-space-admission-alert' import { useProviderContext } from '@/context/provider-context' import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' import Link from '@/next/link' import { useProcessRule } from '@/service/knowledge/use-dataset' import { useInvalidDocumentList } from '@/service/knowledge/use-document' import IndexingProgressItem from './indexing-progress-item' import RuleDetail from './rule-detail' import UpgradeBanner from './upgrade-banner' import { useIndexingStatusPolling } from './use-indexing-status-polling' import { createDocumentLookup } from './utils' type EmbeddingProcessProps = { datasetId: string batchId: string documents?: FullDocumentDetail[] indexingType?: string retrievalMethod?: RETRIEVE_METHOD } // Status header component const StatusHeader: FC<{ isEmbedding: boolean; isCompleted: boolean }> = ({ isEmbedding, isCompleted, }) => { const { t } = useTranslation() return (
{isEmbedding && ( <> {t(($) => $['embedding.processing'], { ns: 'datasetDocuments' })} )} {isCompleted && t(($) => $['embedding.completed'], { ns: 'datasetDocuments' })}
) } // Action buttons component const ActionButtons: FC<{ apiReferenceUrl: string documentsHref: string onNavigateToDocuments: () => void }> = ({ apiReferenceUrl, documentsHref, onNavigateToDocuments }) => { const { t } = useTranslation() return (
Access the API {t(($) => $['stepThree.navTo'], { ns: 'datasetCreation' })}
) } const EmbeddingProcess: FC = ({ datasetId, batchId, documents = [], indexingType, retrievalMethod, }) => { const { enableBilling, plan } = useProviderContext() const invalidDocumentList = useInvalidDocumentList() const apiReferenceUrl = useDatasetApiAccessUrl() // Polling hook for indexing status const { statusList, isEmbedding, isEmbeddingCompleted } = useIndexingStatusPolling({ datasetId, batchId, }) // Get process rule for the first document const firstDocumentId = documents[0]?.id const { data: ruleDetail } = useProcessRule(firstDocumentId) // Document lookup utilities - memoized for performance const documentLookup = useMemo(() => createDocumentLookup(documents), [documents]) const documentsHref = `/datasets/${datasetId}/documents` const showUpgradeBanner = enableBilling && plan.type !== 'team' const showVectorSpaceUpgrade = enableBilling && (plan.type === 'sandbox' || plan.type === 'professional') const vectorSpaceAdmissionError = statusList.find( (detail) => detail.error_code === 'vector_space_estimate_exceeded', ) return ( <>
{vectorSpaceAdmissionError?.estimated_vector_space_mb != null && vectorSpaceAdmissionError.vector_space_limit_mb != null && ( )} {showUpgradeBanner && }
{statusList.map((detail) => ( ))}
) } export default EmbeddingProcess