Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import React, { useCallback } from 'react'
  2. import { IndexingType } from '@/app/components/datasets/create/step-two'
  3. import { ProcessMode, type ProcessRuleResponse } from '@/models/datasets'
  4. import { RETRIEVE_METHOD } from '@/types/app'
  5. import { useTranslation } from 'react-i18next'
  6. import { FieldInfo } from '@/app/components/datasets/documents/detail/metadata'
  7. import Image from 'next/image'
  8. import { indexMethodIcon, retrievalIcon } from '@/app/components/datasets/create/icons'
  9. type RuleDetailProps = {
  10. sourceData?: ProcessRuleResponse
  11. indexingType?: IndexingType
  12. retrievalMethod?: RETRIEVE_METHOD
  13. }
  14. const RuleDetail = ({
  15. sourceData,
  16. indexingType,
  17. retrievalMethod,
  18. }: RuleDetailProps) => {
  19. const { t } = useTranslation()
  20. const segmentationRuleMap = {
  21. mode: t('datasetDocuments.embedding.mode'),
  22. segmentLength: t('datasetDocuments.embedding.segmentLength'),
  23. textCleaning: t('datasetDocuments.embedding.textCleaning'),
  24. }
  25. const getRuleName = useCallback((key: string) => {
  26. if (key === 'remove_extra_spaces')
  27. return t('datasetCreation.stepTwo.removeExtraSpaces')
  28. if (key === 'remove_urls_emails')
  29. return t('datasetCreation.stepTwo.removeUrlEmails')
  30. if (key === 'remove_stopwords')
  31. return t('datasetCreation.stepTwo.removeStopwords')
  32. }, [t])
  33. const isNumber = useCallback((value: unknown) => {
  34. return typeof value === 'number'
  35. }, [])
  36. const getValue = useCallback((field: string) => {
  37. let value: string | number | undefined = '-'
  38. const maxTokens = isNumber(sourceData?.rules?.segmentation?.max_tokens)
  39. ? sourceData.rules.segmentation.max_tokens
  40. : value
  41. const childMaxTokens = isNumber(sourceData?.rules?.subchunk_segmentation?.max_tokens)
  42. ? sourceData.rules.subchunk_segmentation.max_tokens
  43. : value
  44. switch (field) {
  45. case 'mode':
  46. value = !sourceData?.mode
  47. ? value
  48. // eslint-disable-next-line sonarjs/no-nested-conditional
  49. : sourceData.mode === ProcessMode.general
  50. ? (t('datasetDocuments.embedding.custom') as string)
  51. // eslint-disable-next-line sonarjs/no-nested-conditional
  52. : `${t('datasetDocuments.embedding.hierarchical')} · ${sourceData?.rules?.parent_mode === 'paragraph'
  53. ? t('dataset.parentMode.paragraph')
  54. : t('dataset.parentMode.fullDoc')}`
  55. break
  56. case 'segmentLength':
  57. value = !sourceData?.mode
  58. ? value
  59. // eslint-disable-next-line sonarjs/no-nested-conditional
  60. : sourceData.mode === ProcessMode.general
  61. ? maxTokens
  62. : `${t('datasetDocuments.embedding.parentMaxTokens')} ${maxTokens}; ${t('datasetDocuments.embedding.childMaxTokens')} ${childMaxTokens}`
  63. break
  64. default:
  65. value = !sourceData?.mode
  66. ? value
  67. : sourceData?.rules?.pre_processing_rules?.filter(rule =>
  68. rule.enabled).map(rule => getRuleName(rule.id)).join(',')
  69. break
  70. }
  71. return value
  72. }, [getRuleName, isNumber, sourceData, t])
  73. return (
  74. <div className='flex flex-col gap-1'>
  75. {Object.keys(segmentationRuleMap).map((field) => {
  76. return <FieldInfo
  77. key={field}
  78. label={segmentationRuleMap[field as keyof typeof segmentationRuleMap]}
  79. displayedValue={String(getValue(field))}
  80. />
  81. })}
  82. <FieldInfo
  83. label={t('datasetCreation.stepTwo.indexMode')}
  84. displayedValue={t(`datasetCreation.stepTwo.${indexingType === IndexingType.ECONOMICAL ? 'economical' : 'qualified'}`) as string}
  85. valueIcon={
  86. <Image
  87. className='size-4'
  88. src={
  89. indexingType === IndexingType.ECONOMICAL
  90. ? indexMethodIcon.economical
  91. : indexMethodIcon.high_quality
  92. }
  93. alt=''
  94. />
  95. }
  96. />
  97. <FieldInfo
  98. label={t('datasetSettings.form.retrievalSetting.title')}
  99. displayedValue={t(`dataset.retrieval.${indexingType === IndexingType.ECONOMICAL ? 'invertedIndex' : retrievalMethod}.title`) as string}
  100. valueIcon={
  101. <Image
  102. className='size-4'
  103. src={
  104. retrievalMethod === RETRIEVE_METHOD.fullText
  105. ? retrievalIcon.fullText
  106. // eslint-disable-next-line sonarjs/no-nested-conditional
  107. : retrievalMethod === RETRIEVE_METHOD.hybrid
  108. ? retrievalIcon.hybrid
  109. : retrievalIcon.vector
  110. }
  111. alt=''
  112. />
  113. }
  114. />
  115. </div>
  116. )
  117. }
  118. export default React.memo(RuleDetail)