| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | 
                        - import React, { useCallback, useState } from 'react'
 - import { useTranslation } from 'react-i18next'
 - import { usePathname, useRouter } from 'next/navigation'
 - import produce from 'immer'
 - import { RiEqualizer2Line, RiExternalLinkLine } from '@remixicon/react'
 - import { MessageFast } from '@/app/components/base/icons/src/vender/features'
 - import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
 - import Button from '@/app/components/base/button'
 - import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
 - import type { OnFeaturesChange } from '@/app/components/base/features/types'
 - import useAnnotationConfig from '@/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config'
 - import ConfigParamModal from '@/app/components/base/features/new-feature-panel/annotation-reply/config-param-modal'
 - import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
 - import { ANNOTATION_DEFAULT } from '@/config'
 - 
 - type Props = {
 -   disabled?: boolean
 -   onChange?: OnFeaturesChange
 - }
 - 
 - const AnnotationReply = ({
 -   disabled,
 -   onChange,
 - }: Props) => {
 -   const { t } = useTranslation()
 -   const router = useRouter()
 -   const pathname = usePathname()
 -   const matched = pathname.match(/\/app\/([^/]+)/)
 -   const appId = (matched?.length && matched[1]) ? matched[1] : ''
 -   const featuresStore = useFeaturesStore()
 -   const annotationReply = useFeatures(s => s.features.annotationReply)
 - 
 -   const updateAnnotationReply = useCallback((newConfig: any) => {
 -     const {
 -       features,
 -       setFeatures,
 -     } = featuresStore!.getState()
 -     const newFeatures = produce(features, (draft) => {
 -       draft.annotationReply = newConfig
 -     })
 -     setFeatures(newFeatures)
 -     if (onChange)
 -       onChange(newFeatures)
 -   }, [featuresStore, onChange])
 - 
 -   const {
 -     handleEnableAnnotation,
 -     handleDisableAnnotation,
 -     isShowAnnotationConfigInit,
 -     setIsShowAnnotationConfigInit,
 -     isShowAnnotationFullModal,
 -     setIsShowAnnotationFullModal,
 -   } = useAnnotationConfig({
 -     appId,
 -     annotationConfig: annotationReply as any || {
 -       id: '',
 -       enabled: false,
 -       score_threshold: ANNOTATION_DEFAULT.score_threshold,
 -       embedding_model: {
 -         embedding_provider_name: '',
 -         embedding_model_name: '',
 -       },
 -     },
 -     setAnnotationConfig: updateAnnotationReply,
 -   })
 - 
 -   const handleSwitch = useCallback((enabled: boolean) => {
 -     if (enabled)
 -       setIsShowAnnotationConfigInit(true)
 -     else
 -       handleDisableAnnotation(annotationReply?.embedding_model as any)
 -   }, [annotationReply?.embedding_model, handleDisableAnnotation, setIsShowAnnotationConfigInit])
 - 
 -   const [isHovering, setIsHovering] = useState(false)
 - 
 -   return (
 -     <>
 -       <FeatureCard
 -         icon={
 -           <div className='shrink-0 p-1 rounded-lg border-[0.5px] border-divider-subtle shadow-xs bg-util-colors-indigo-indigo-600'>
 -             <MessageFast className='w-4 h-4 text-text-primary-on-surface' />
 -           </div>
 -         }
 -         title={t('appDebug.feature.annotation.title')}
 -         value={!!annotationReply?.enabled}
 -         onChange={state => handleSwitch(state)}
 -         onMouseEnter={() => setIsHovering(true)}
 -         onMouseLeave={() => setIsHovering(false)}
 -         disabled={disabled}
 -       >
 -         <>
 -           {!annotationReply?.enabled && (
 -             <div className='min-h-8 text-text-tertiary system-xs-regular line-clamp-2'>{t('appDebug.feature.annotation.description')}</div>
 -           )}
 -           {!!annotationReply?.enabled && (
 -             <>
 -               {!isHovering && (
 -                 <div className='pt-0.5 flex items-center gap-4'>
 -                   <div className=''>
 -                     <div className='mb-0.5 text-text-tertiary system-2xs-medium-uppercase'>{t('appDebug.feature.annotation.scoreThreshold.title')}</div>
 -                     <div className='text-text-secondary system-xs-regular'>{annotationReply.score_threshold || '-'}</div>
 -                   </div>
 -                   <div className='w-px h-[27px] bg-divider-subtle rotate-12'></div>
 -                   <div className=''>
 -                     <div className='mb-0.5 text-text-tertiary system-2xs-medium-uppercase'>{t('common.modelProvider.embeddingModel.key')}</div>
 -                     <div className='text-text-secondary system-xs-regular'>{annotationReply.embedding_model?.embedding_model_name}</div>
 -                   </div>
 -                 </div>
 -               )}
 -               {isHovering && (
 -                 <div className='flex items-center justify-between'>
 -                   <Button className='w-[178px]' onClick={() => setIsShowAnnotationConfigInit(true)} disabled={disabled}>
 -                     <RiEqualizer2Line className='mr-1 w-4 h-4' />
 -                     {t('common.operation.params')}
 -                   </Button>
 -                   <Button className='w-[178px]' onClick={() => {
 -                     router.push(`/app/${appId}/annotations`)
 -                   }}>
 -                     <RiExternalLinkLine className='mr-1 w-4 h-4' />
 -                     {t('appDebug.feature.annotation.cacheManagement')}
 -                   </Button>
 -                 </div>
 -               )}
 -             </>
 -           )}
 -         </>
 -       </FeatureCard>
 -       <ConfigParamModal
 -         appId={appId}
 -         isInit
 -         isShow={isShowAnnotationConfigInit}
 -         onHide={() => {
 -           setIsShowAnnotationConfigInit(false)
 -           // showChooseFeatureTrue()
 -         }}
 -         onSave={async (embeddingModel, score) => {
 -           await handleEnableAnnotation(embeddingModel, score)
 -           setIsShowAnnotationConfigInit(false)
 -         }}
 -         annotationConfig={annotationReply as any}
 -       />
 -       {isShowAnnotationFullModal && (
 -         <AnnotationFullModal
 -           show={isShowAnnotationFullModal}
 -           onHide={() => setIsShowAnnotationFullModal(false)}
 -         />
 -       )}
 -     </>
 -   )
 - }
 - 
 - export default AnnotationReply
 
 
  |