modify-retrieval-modal.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useRef, useState } from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import { RiCloseLine } from '@remixicon/react'
  6. import Toast from '../../base/toast'
  7. import { ModelTypeEnum } from '../../header/account-setting/model-provider-page/declarations'
  8. import type { RetrievalConfig } from '@/types/app'
  9. import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config'
  10. import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config'
  11. import Button from '@/app/components/base/button'
  12. import { ensureRerankModelSelected, isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model'
  13. import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
  14. import { RerankingModeEnum } from '@/models/datasets'
  15. type Props = {
  16. indexMethod: string
  17. value: RetrievalConfig
  18. isShow: boolean
  19. onHide: () => void
  20. onSave: (value: RetrievalConfig) => void
  21. }
  22. const ModifyRetrievalModal: FC<Props> = ({
  23. indexMethod,
  24. value,
  25. isShow,
  26. onHide,
  27. onSave,
  28. }) => {
  29. const ref = useRef(null)
  30. const { t } = useTranslation()
  31. const [retrievalConfig, setRetrievalConfig] = useState(value)
  32. // useClickAway(() => {
  33. // if (ref)
  34. // onHide()
  35. // }, ref)
  36. const {
  37. modelList: rerankModelList,
  38. defaultModel: rerankDefaultModel,
  39. currentModel: isRerankDefaultModelValid,
  40. } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
  41. const handleSave = () => {
  42. if (
  43. !isReRankModelSelected({
  44. rerankDefaultModel,
  45. isRerankDefaultModelValid: !!isRerankDefaultModelValid,
  46. rerankModelList,
  47. retrievalConfig,
  48. indexMethod,
  49. })
  50. ) {
  51. Toast.notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') })
  52. return
  53. }
  54. onSave(ensureRerankModelSelected({
  55. rerankDefaultModel: rerankDefaultModel!,
  56. retrievalConfig: {
  57. ...retrievalConfig,
  58. reranking_enable: retrievalConfig.reranking_mode === RerankingModeEnum.RerankingModel,
  59. },
  60. indexMethod,
  61. }))
  62. }
  63. if (!isShow)
  64. return null
  65. return (
  66. <div
  67. className='w-full flex flex-col bg-white border-[0.5px] border-gray-200 rounded-xl shadow-xl'
  68. style={{
  69. height: 'calc(100vh - 72px)',
  70. }}
  71. ref={ref}
  72. >
  73. <div className='shrink-0 flex justify-between items-center pl-6 pr-5 h-14 border-b border-b-gray-100'>
  74. <div className='text-base font-semibold text-gray-900'>
  75. <div>{t('datasetSettings.form.retrievalSetting.title')}</div>
  76. <div className='leading-[18px] text-xs font-normal text-gray-500'>
  77. <a target='_blank' rel='noopener noreferrer' href='https://docs.dify.ai/guides/knowledge-base/create-knowledge-and-upload-documents#id-4-retrieval-settings' className='text-text-accent'>{t('datasetSettings.form.retrievalSetting.learnMore')}</a>
  78. {t('datasetSettings.form.retrievalSetting.description')}
  79. </div>
  80. </div>
  81. <div className='flex items-center'>
  82. <div
  83. onClick={onHide}
  84. className='flex justify-center items-center w-6 h-6 cursor-pointer'
  85. >
  86. <RiCloseLine className='w-4 h-4 text-gray-500' />
  87. </div>
  88. </div>
  89. </div>
  90. <div className='p-6 border-b' style={{
  91. borderBottom: 'rgba(0, 0, 0, 0.05)',
  92. }}>
  93. {indexMethod === 'high_quality'
  94. ? (
  95. <RetrievalMethodConfig
  96. value={retrievalConfig}
  97. onChange={setRetrievalConfig}
  98. />
  99. )
  100. : (
  101. <EconomicalRetrievalMethodConfig
  102. value={retrievalConfig}
  103. onChange={setRetrievalConfig}
  104. />
  105. )}
  106. </div>
  107. <div
  108. className='flex justify-end pt-6 px-6 border-t'
  109. style={{
  110. borderColor: 'rgba(0, 0, 0, 0.05)',
  111. }}
  112. >
  113. <Button className='mr-2 flex-shrink-0' onClick={onHide}>{t('common.operation.cancel')}</Button>
  114. <Button variant='primary' className='flex-shrink-0' onClick={handleSave} >{t('common.operation.save')}</Button>
  115. </div>
  116. </div>
  117. )
  118. }
  119. export default React.memo(ModifyRetrievalModal)