diff --git a/web/app/components/datasets/documents/detail/completed/child-segment-detail.tsx b/web/app/components/datasets/documents/detail/completed/child-segment-detail.tsx index ad4ba64264..34728170d7 100644 --- a/web/app/components/datasets/documents/detail/completed/child-segment-detail.tsx +++ b/web/app/components/datasets/documents/detail/completed/child-segment-detail.tsx @@ -9,7 +9,7 @@ import ChunkContent from './common/chunk-content' import Dot from './common/dot' import { SegmentIndexTag } from './common/segment-index-tag' import { useSegmentListContext } from './index' -import type { ChildChunkDetail } from '@/models/datasets' +import type { ChildChunkDetail, ChuckingMode } from '@/models/datasets' import { useEventEmitterContextContext } from '@/context/event-emitter' import { formatNumber } from '@/utils/format' import classNames from '@/utils/classnames' @@ -21,7 +21,7 @@ type IChildSegmentDetailProps = { childChunkInfo?: Partial & { id: string } onUpdate: (segmentId: string, childChunkId: string, content: string) => void onCancel: () => void - docForm: string + docForm: ChuckingMode } /** diff --git a/web/app/components/datasets/documents/detail/completed/common/chunk-content.tsx b/web/app/components/datasets/documents/detail/completed/common/chunk-content.tsx index ba4979f9dd..f250cb3ded 100644 --- a/web/app/components/datasets/documents/detail/completed/common/chunk-content.tsx +++ b/web/app/components/datasets/documents/detail/completed/common/chunk-content.tsx @@ -1,5 +1,6 @@ import React, { type FC } from 'react' import { useTranslation } from 'react-i18next' +import { ChuckingMode } from '@/models/datasets' import AutoHeightTextarea from '@/app/components/base/auto-height-textarea/common' type IChunkContentProps = { @@ -8,7 +9,7 @@ type IChunkContentProps = { onQuestionChange: (question: string) => void onAnswerChange?: (answer: string) => void isEditMode?: boolean - docForm: string + docForm: ChuckingMode } const ChunkContent: FC = ({ @@ -21,22 +22,22 @@ const ChunkContent: FC = ({ }) => { const { t } = useTranslation() - if (docForm === 'qa_model') { + if (docForm === ChuckingMode.qa) { return ( <> -
QUESTION
+
QUESTION
onQuestionChange(e.target.value)} disabled={!isEditMode} /> -
ANSWER
+
ANSWER
onAnswerChange?.(e.target.value)} diff --git a/web/app/components/datasets/documents/detail/completed/index.tsx b/web/app/components/datasets/documents/detail/completed/index.tsx index ee92bc7247..f263366256 100644 --- a/web/app/components/datasets/documents/detail/completed/index.tsx +++ b/web/app/components/datasets/documents/detail/completed/index.tsx @@ -25,7 +25,7 @@ import { ToastContext } from '@/app/components/base/toast' import type { Item } from '@/app/components/base/select' import { SimpleSelect } from '@/app/components/base/select' import { updateSegment } from '@/service/datasets' -import type { ChildChunkDetail, SegmentDetailModel, SegmentUpdater } from '@/models/datasets' +import { type ChildChunkDetail, ChuckingMode, type SegmentDetailModel, type SegmentUpdater } from '@/models/datasets' import NewSegment from '@/app/components/datasets/documents/detail/new-segment' import { useEventEmitterContextContext } from '@/context/event-emitter' import Checkbox from '@/app/components/base/checkbox' @@ -252,7 +252,7 @@ const Completed: FC = ({ needRegenerate = false, ) => { const params: SegmentUpdater = { content: '' } - if (docForm === 'qa_model') { + if (docForm === ChuckingMode.qa) { if (!question.trim()) return notify({ type: 'error', message: t('datasetDocuments.segment.questionEmpty') }) if (!answer.trim()) diff --git a/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx b/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx index 0028315898..d9d23b421a 100644 --- a/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx +++ b/web/app/components/datasets/documents/detail/completed/new-child-segment.tsx @@ -14,7 +14,7 @@ import Dot from './common/dot' import { useSegmentListContext } from './index' import { useStore as useAppStore } from '@/app/components/app/store' import { ToastContext } from '@/app/components/base/toast' -import type { ChildChunkDetail, SegmentUpdater } from '@/models/datasets' +import { type ChildChunkDetail, ChuckingMode, type SegmentUpdater } from '@/models/datasets' import classNames from '@/utils/classnames' import { formatNumber } from '@/utils/format' import Divider from '@/app/components/base/divider' @@ -144,7 +144,7 @@ const NewChildSegmentModal: FC = ({
setContent(content)} isEditMode={true} diff --git a/web/app/components/datasets/documents/detail/completed/segment-card.tsx b/web/app/components/datasets/documents/detail/completed/segment-card.tsx index eff9b327ec..deea30c21e 100644 --- a/web/app/components/datasets/documents/detail/completed/segment-card.tsx +++ b/web/app/components/datasets/documents/detail/completed/segment-card.tsx @@ -98,13 +98,22 @@ const SegmentCard: FC = ({ if (answer) { return ( <> -
+
Q
-
{content}
+
+ {content} +
-
+
A
-
{answer}
+
+ {answer} +
) diff --git a/web/app/components/datasets/documents/detail/completed/segment-detail.tsx b/web/app/components/datasets/documents/detail/completed/segment-detail.tsx index 30991492b4..bc679222de 100644 --- a/web/app/components/datasets/documents/detail/completed/segment-detail.tsx +++ b/web/app/components/datasets/documents/detail/completed/segment-detail.tsx @@ -12,7 +12,7 @@ import RegenerationModal from './common/regeneration-modal' import { SegmentIndexTag } from './common/segment-index-tag' import Dot from './common/dot' import { useSegmentListContext } from './index' -import type { SegmentDetailModel } from '@/models/datasets' +import { ChuckingMode, type SegmentDetailModel } from '@/models/datasets' import { useEventEmitterContextContext } from '@/context/event-emitter' import { formatNumber } from '@/utils/format' import classNames from '@/utils/classnames' @@ -23,7 +23,7 @@ type ISegmentDetailProps = { onUpdate: (segmentId: string, q: string, a: string, k: string[], needRegenerate?: boolean) => void onCancel: () => void isEditMode?: boolean - docForm: string + docForm: ChuckingMode } /** @@ -85,12 +85,17 @@ const SegmentDetail: FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [isEditMode]) + const isQAModel = useMemo(() => { + return docForm === ChuckingMode.qa + }, [docForm]) + const wordCountText = useMemo(() => { - const total = formatNumber(isEditMode ? question.length : segInfo!.word_count as number) - const count = isEditMode ? question.length : segInfo!.word_count as number + const contentLength = isQAModel ? (question.length + answer.length) : question.length + const total = formatNumber(isEditMode ? contentLength : segInfo!.word_count as number) + const count = isEditMode ? contentLength : segInfo!.word_count as number return `${total} ${t('datasetDocuments.segment.characters', { count })}` // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isEditMode, question.length, segInfo?.word_count]) + }, [isEditMode, question.length, answer.length, segInfo?.word_count, isQAModel]) const labelPrefix = useMemo(() => { return isParentChildMode ? t('datasetDocuments.segment.parentChunk') : t('datasetDocuments.segment.chunk') diff --git a/web/app/components/datasets/documents/detail/new-segment.tsx b/web/app/components/datasets/documents/detail/new-segment.tsx index 0ceaafc93f..b2ffcf5f2b 100644 --- a/web/app/components/datasets/documents/detail/new-segment.tsx +++ b/web/app/components/datasets/documents/detail/new-segment.tsx @@ -15,7 +15,7 @@ import Dot from './completed/common/dot' import { useDocumentContext } from './index' import { useStore as useAppStore } from '@/app/components/app/store' import { ToastContext } from '@/app/components/base/toast' -import type { SegmentUpdater } from '@/models/datasets' +import { ChuckingMode, type SegmentUpdater } from '@/models/datasets' import { addSegment } from '@/service/datasets' import classNames from '@/utils/classnames' import { formatNumber } from '@/utils/format' @@ -23,7 +23,7 @@ import Divider from '@/app/components/base/divider' type NewSegmentModalProps = { onCancel: () => void - docForm: string + docForm: ChuckingMode onSave: () => void viewNewlyAddedChunk: () => void } @@ -59,6 +59,10 @@ const NewSegmentModal: FC = ({ + const isQAModel = useMemo(() => { + return docForm === ChuckingMode.qa + }, [docForm]) + const handleCancel = (actionType: 'esc' | 'add' = 'esc') => { if (actionType === 'esc' || !addAnother) onCancel() @@ -69,18 +73,30 @@ const NewSegmentModal: FC = ({ const handleSave = async () => { const params: SegmentUpdater = { content: '' } - if (docForm === 'qa_model') { - if (!question.trim()) - return notify({ type: 'error', message: t('datasetDocuments.segment.questionEmpty') }) - if (!answer.trim()) - return notify({ type: 'error', message: t('datasetDocuments.segment.answerEmpty') }) + if (isQAModel) { + if (!question.trim()) { + return notify({ + type: 'error', + message: t('datasetDocuments.segment.questionEmpty'), + }) + } + if (!answer.trim()) { + return notify({ + type: 'error', + message: t('datasetDocuments.segment.answerEmpty'), + }) + } params.content = question params.answer = answer } else { - if (!question.trim()) - return notify({ type: 'error', message: t('datasetDocuments.segment.contentEmpty') }) + if (!question.trim()) { + return notify({ + type: 'error', + message: t('datasetDocuments.segment.contentEmpty'), + }) + } params.content = question } @@ -109,19 +125,17 @@ const NewSegmentModal: FC = ({ } const wordCountText = useMemo(() => { - const count = question.length + const count = isQAModel ? (question.length + answer.length) : question.length return `${formatNumber(count)} ${t('datasetDocuments.segment.characters', { count })}` // eslint-disable-next-line react-hooks/exhaustive-deps - }, [question.length]) + }, [question.length, answer.length, isQAModel]) return (
{ - docForm === 'qa_model' - ? t('datasetDocuments.segment.newQaSegment') - : t('datasetDocuments.segment.addChunk') + t('datasetDocuments.segment.addChunk') }