modify-retrieval-modal.tsx 3.9 KB

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