index.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import cn from 'classnames'
  6. import TopKItem from '@/app/components/base/param-item/top-k-item'
  7. import ScoreThresholdItem from '@/app/components/base/param-item/score-threshold-item'
  8. import { RETRIEVE_METHOD } from '@/types/app'
  9. import Switch from '@/app/components/base/switch'
  10. import Tooltip from '@/app/components/base/tooltip-plus'
  11. import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general'
  12. import type { RetrievalConfig } from '@/types/app'
  13. import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
  14. import { useModelListAndDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
  15. import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  16. type Props = {
  17. type: RETRIEVE_METHOD
  18. value: RetrievalConfig
  19. onChange: (value: RetrievalConfig) => void
  20. }
  21. const RetrievalParamConfig: FC<Props> = ({
  22. type,
  23. value,
  24. onChange,
  25. }) => {
  26. const { t } = useTranslation()
  27. const canToggleRerankModalEnable = type !== RETRIEVE_METHOD.hybrid
  28. const isEconomical = type === RETRIEVE_METHOD.invertedIndex
  29. const {
  30. defaultModel: rerankDefaultModel,
  31. modelList: rerankModelList,
  32. } = useModelListAndDefaultModel(ModelTypeEnum.rerank)
  33. const rerankModel = (() => {
  34. if (value.reranking_model) {
  35. return {
  36. provider_name: value.reranking_model.reranking_provider_name,
  37. model_name: value.reranking_model.reranking_model_name,
  38. }
  39. }
  40. else if (rerankDefaultModel) {
  41. return {
  42. provider_name: rerankDefaultModel.provider.provider,
  43. model_name: rerankDefaultModel.model,
  44. }
  45. }
  46. })()
  47. return (
  48. <div>
  49. {!isEconomical && (
  50. <div>
  51. <div className='flex h-8 items-center text-[13px] font-medium text-gray-900 space-x-2'>
  52. {canToggleRerankModalEnable && (
  53. <Switch
  54. size='md'
  55. defaultValue={value.reranking_enable}
  56. onChange={(v) => {
  57. onChange({
  58. ...value,
  59. reranking_enable: v,
  60. })
  61. }}
  62. />
  63. )}
  64. <div className='flex items-center'>
  65. <span className='mr-0.5'>{t('common.modelProvider.rerankModel.key')}</span>
  66. <Tooltip popupContent={<div className="w-[200px]">{t('common.modelProvider.rerankModel.tip')}</div>}>
  67. <HelpCircle className='w-[14px] h-[14px] text-gray-400' />
  68. </Tooltip>
  69. </div>
  70. </div>
  71. <ModelSelector
  72. triggerClassName={`${!value.reranking_enable && type !== RETRIEVE_METHOD.hybrid && '!opacity-60 !cursor-not-allowed'}`}
  73. defaultModel={rerankModel && { provider: rerankModel.provider_name, model: rerankModel.model_name }}
  74. modelList={rerankModelList}
  75. readonly={!value.reranking_enable && type !== RETRIEVE_METHOD.hybrid}
  76. onSelect={(v) => {
  77. onChange({
  78. ...value,
  79. reranking_model: {
  80. reranking_provider_name: v.provider,
  81. reranking_model_name: v.model,
  82. },
  83. })
  84. }}
  85. />
  86. </div>
  87. )}
  88. <div className={cn(!isEconomical && 'mt-4', 'flex space-between space-x-6')}>
  89. <TopKItem
  90. className='grow'
  91. value={value.top_k}
  92. onChange={(_key, v) => {
  93. onChange({
  94. ...value,
  95. top_k: v,
  96. })
  97. }}
  98. enable={true}
  99. />
  100. {(!isEconomical && !(value.search_method === RETRIEVE_METHOD.fullText && !value.reranking_enable)) && (
  101. <ScoreThresholdItem
  102. className='grow'
  103. value={value.score_threshold}
  104. onChange={(_key, v) => {
  105. onChange({
  106. ...value,
  107. score_threshold: v,
  108. })
  109. }}
  110. enable={value.score_threshold_enabled}
  111. hasSwitch={true}
  112. onSwitchChange={(_key, v) => {
  113. onChange({
  114. ...value,
  115. score_threshold_enabled: v,
  116. })
  117. }}
  118. />
  119. )}
  120. </div>
  121. </div>
  122. )
  123. }
  124. export default React.memo(RetrievalParamConfig)