index.tsx 4.3 KB

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