mirror of
https://github.com/langgenius/dify.git
synced 2026-04-28 20:17:29 +08:00
remove annatation
This commit is contained in:
parent
328a3e2e6b
commit
17a67e7922
@ -15,10 +15,7 @@ import SuggestedQuestionsAfterAnswerIcon from '@/app/components/app/configuratio
|
|||||||
import { Microphone01, Speaker } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
|
import { Microphone01, Speaker } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
|
||||||
import { Citations } from '@/app/components/base/icons/src/vender/solid/editor'
|
import { Citations } from '@/app/components/base/icons/src/vender/solid/editor'
|
||||||
import { FileSearch02 } from '@/app/components/base/icons/src/vender/solid/files'
|
import { FileSearch02 } from '@/app/components/base/icons/src/vender/solid/files'
|
||||||
import {
|
import { MessageHeartCircle } from '@/app/components/base/icons/src/vender/solid/communication'
|
||||||
MessageFast,
|
|
||||||
MessageHeartCircle,
|
|
||||||
} from '@/app/components/base/icons/src/vender/solid/communication'
|
|
||||||
import { FeatureEnum } from '@/app/components/base/features/types'
|
import { FeatureEnum } from '@/app/components/base/features/types'
|
||||||
import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
||||||
|
|
||||||
@ -137,14 +134,6 @@ const FeatureModal: FC<FeatureModalProps> = ({
|
|||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
type={FeatureEnum.moderation}
|
type={FeatureEnum.moderation}
|
||||||
/>
|
/>
|
||||||
<FeatureItem
|
|
||||||
icon={<MessageFast className='w-4 h-4 text-[#444CE7]' />}
|
|
||||||
title={t('appDebug.feature.annotation.title')}
|
|
||||||
description={t('appDebug.feature.annotation.description')}
|
|
||||||
value={!!features.annotation.enabled}
|
|
||||||
onChange={handleChange}
|
|
||||||
type={FeatureEnum.annotation}
|
|
||||||
/>
|
|
||||||
</>
|
</>
|
||||||
</FeatureGroup>
|
</FeatureGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,135 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import type { FC } from 'react'
|
|
||||||
import React, { useRef, useState } from 'react'
|
|
||||||
import { useHover } from 'ahooks'
|
|
||||||
import cn from 'classnames'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import { MessageCheckRemove, MessageFastPlus } from '@/app/components/base/icons/src/vender/line/communication'
|
|
||||||
import { MessageFast } from '@/app/components/base/icons/src/vender/solid/communication'
|
|
||||||
import { Edit04 } from '@/app/components/base/icons/src/vender/line/general'
|
|
||||||
import RemoveAnnotationConfirmModal from '@/app/components/app/annotation/remove-annotation-confirm-modal'
|
|
||||||
import TooltipPlus from '@/app/components/base/tooltip-plus'
|
|
||||||
import { addAnnotation, delAnnotation } from '@/service/annotation'
|
|
||||||
import Toast from '@/app/components/base/toast'
|
|
||||||
import { useProviderContext } from '@/context/provider-context'
|
|
||||||
import { useModalContext } from '@/context/modal-context'
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
appId: string
|
|
||||||
messageId?: string
|
|
||||||
annotationId?: string
|
|
||||||
className?: string
|
|
||||||
cached: boolean
|
|
||||||
query: string
|
|
||||||
answer: string
|
|
||||||
onAdded: (annotationId: string, authorName: string) => void
|
|
||||||
onEdit: () => void
|
|
||||||
onRemoved: () => void
|
|
||||||
}
|
|
||||||
|
|
||||||
const CacheCtrlBtn: FC<Props> = ({
|
|
||||||
className,
|
|
||||||
cached,
|
|
||||||
query,
|
|
||||||
answer,
|
|
||||||
appId,
|
|
||||||
messageId,
|
|
||||||
annotationId,
|
|
||||||
onAdded,
|
|
||||||
onEdit,
|
|
||||||
onRemoved,
|
|
||||||
}) => {
|
|
||||||
const { t } = useTranslation()
|
|
||||||
const { plan, enableBilling } = useProviderContext()
|
|
||||||
const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
|
|
||||||
const { setShowAnnotationFullModal } = useModalContext()
|
|
||||||
const [showModal, setShowModal] = useState(false)
|
|
||||||
const cachedBtnRef = useRef<HTMLDivElement>(null)
|
|
||||||
const isCachedBtnHovering = useHover(cachedBtnRef)
|
|
||||||
const handleAdd = async () => {
|
|
||||||
if (isAnnotationFull) {
|
|
||||||
setShowAnnotationFullModal()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const res: any = await addAnnotation(appId, {
|
|
||||||
message_id: messageId,
|
|
||||||
question: query,
|
|
||||||
answer,
|
|
||||||
})
|
|
||||||
Toast.notify({
|
|
||||||
message: t('common.api.actionSuccess') as string,
|
|
||||||
type: 'success',
|
|
||||||
})
|
|
||||||
onAdded(res.id, res.account?.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleRemove = async () => {
|
|
||||||
await delAnnotation(appId, annotationId!)
|
|
||||||
Toast.notify({
|
|
||||||
message: t('common.api.actionSuccess') as string,
|
|
||||||
type: 'success',
|
|
||||||
})
|
|
||||||
onRemoved()
|
|
||||||
setShowModal(false)
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div className={cn(className, 'inline-block')}>
|
|
||||||
<div className='inline-flex p-0.5 space-x-0.5 rounded-lg bg-white border border-gray-100 shadow-md text-gray-500 cursor-pointer'>
|
|
||||||
{cached
|
|
||||||
? (
|
|
||||||
<div>
|
|
||||||
<div
|
|
||||||
ref={cachedBtnRef}
|
|
||||||
className={cn(isCachedBtnHovering ? 'bg-[#FEF3F2] text-[#D92D20]' : 'bg-[#EEF4FF] text-[#444CE7]', 'flex p-1 space-x-1 items-center rounded-md leading-4 text-xs font-medium')}
|
|
||||||
onClick={() => setShowModal(true)}
|
|
||||||
>
|
|
||||||
{!isCachedBtnHovering
|
|
||||||
? (
|
|
||||||
<>
|
|
||||||
<MessageFast className='w-4 h-4' />
|
|
||||||
<div>{t('appDebug.feature.annotation.cached')}</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
: <>
|
|
||||||
<MessageCheckRemove className='w-4 h-4' />
|
|
||||||
<div>{t('appDebug.feature.annotation.remove')}</div>
|
|
||||||
</>}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
: answer
|
|
||||||
? (
|
|
||||||
<TooltipPlus
|
|
||||||
popupContent={t('appDebug.feature.annotation.add') as string}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
className='p-1 rounded-md hover:bg-[#EEF4FF] hover:text-[#444CE7] cursor-pointer'
|
|
||||||
onClick={handleAdd}
|
|
||||||
>
|
|
||||||
<MessageFastPlus className='w-4 h-4' />
|
|
||||||
</div>
|
|
||||||
</TooltipPlus>
|
|
||||||
)
|
|
||||||
: null
|
|
||||||
}
|
|
||||||
<TooltipPlus
|
|
||||||
popupContent={t('appDebug.feature.annotation.edit') as string}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
className='p-1 cursor-pointer rounded-md hover:bg-black/5'
|
|
||||||
onClick={onEdit}
|
|
||||||
>
|
|
||||||
<Edit04 className='w-4 h-4' />
|
|
||||||
</div>
|
|
||||||
</TooltipPlus>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<RemoveAnnotationConfirmModal
|
|
||||||
isShow={showModal}
|
|
||||||
onHide={() => setShowModal(false)}
|
|
||||||
onRemove={handleRemove}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
export default React.memo(CacheCtrlBtn)
|
|
||||||
@ -1,140 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import type { FC } from 'react'
|
|
||||||
import React, { useState } from 'react'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import ScoreSlider from '../score-slider'
|
|
||||||
import { Item } from './index'
|
|
||||||
import Modal from '@/app/components/base/modal'
|
|
||||||
import Button from '@/app/components/base/button'
|
|
||||||
import Toast from '@/app/components/base/toast'
|
|
||||||
import type { AnnotationReplyConfig } from '@/models/debug'
|
|
||||||
import { ANNOTATION_DEFAULT } from '@/config'
|
|
||||||
import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
|
|
||||||
import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
appId: string
|
|
||||||
isShow: boolean
|
|
||||||
onHide: () => void
|
|
||||||
onSave: (embeddingModel: {
|
|
||||||
embedding_provider_name: string
|
|
||||||
embedding_model_name: string
|
|
||||||
}, score: number) => void
|
|
||||||
isInit?: boolean
|
|
||||||
annotationConfig: AnnotationReplyConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
const ConfigParamModal: FC<Props> = ({
|
|
||||||
isShow,
|
|
||||||
onHide: doHide,
|
|
||||||
onSave,
|
|
||||||
isInit,
|
|
||||||
annotationConfig: oldAnnotationConfig,
|
|
||||||
}) => {
|
|
||||||
const { t } = useTranslation()
|
|
||||||
const {
|
|
||||||
modelList: embeddingsModelList,
|
|
||||||
defaultModel: embeddingsDefaultModel,
|
|
||||||
currentModel: isEmbeddingsDefaultModelValid,
|
|
||||||
} = useModelListAndDefaultModelAndCurrentProviderAndModel(2)
|
|
||||||
const [annotationConfig, setAnnotationConfig] = useState(oldAnnotationConfig)
|
|
||||||
|
|
||||||
const [isLoading, setLoading] = useState(false)
|
|
||||||
const [embeddingModel, setEmbeddingModel] = useState(oldAnnotationConfig.embedding_model
|
|
||||||
? {
|
|
||||||
providerName: oldAnnotationConfig.embedding_model.embedding_provider_name,
|
|
||||||
modelName: oldAnnotationConfig.embedding_model.embedding_model_name,
|
|
||||||
}
|
|
||||||
: (embeddingsDefaultModel
|
|
||||||
? {
|
|
||||||
providerName: embeddingsDefaultModel.provider.provider,
|
|
||||||
modelName: embeddingsDefaultModel.model,
|
|
||||||
}
|
|
||||||
: undefined))
|
|
||||||
const onHide = () => {
|
|
||||||
if (!isLoading)
|
|
||||||
doHide()
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleSave = async () => {
|
|
||||||
if (!embeddingModel || !embeddingModel.modelName || (embeddingModel.modelName === embeddingsDefaultModel?.model && !isEmbeddingsDefaultModelValid)) {
|
|
||||||
Toast.notify({
|
|
||||||
message: t('common.modelProvider.embeddingModel.required'),
|
|
||||||
type: 'error',
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
setLoading(true)
|
|
||||||
await onSave({
|
|
||||||
embedding_provider_name: embeddingModel.providerName,
|
|
||||||
embedding_model_name: embeddingModel.modelName,
|
|
||||||
}, annotationConfig.score_threshold)
|
|
||||||
setLoading(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Modal
|
|
||||||
isShow={isShow}
|
|
||||||
onClose={onHide}
|
|
||||||
className='!p-8 !pb-6 !mt-14 !max-w-none !w-[640px]'
|
|
||||||
wrapperClassName='!z-50'
|
|
||||||
>
|
|
||||||
<div className='mb-2 text-xl font-semibold text-[#1D2939]'>
|
|
||||||
{t(`appAnnotation.initSetup.${isInit ? 'title' : 'configTitle'}`)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='mt-6 space-y-3'>
|
|
||||||
<Item
|
|
||||||
title={t('appDebug.feature.annotation.scoreThreshold.title')}
|
|
||||||
tooltip={t('appDebug.feature.annotation.scoreThreshold.description')}
|
|
||||||
>
|
|
||||||
<ScoreSlider
|
|
||||||
className='mt-1'
|
|
||||||
value={(annotationConfig.score_threshold || ANNOTATION_DEFAULT.score_threshold) * 100}
|
|
||||||
onChange={(val) => {
|
|
||||||
setAnnotationConfig({
|
|
||||||
...annotationConfig,
|
|
||||||
score_threshold: val / 100,
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Item>
|
|
||||||
|
|
||||||
<Item
|
|
||||||
title={t('common.modelProvider.embeddingModel.key')}
|
|
||||||
tooltip={t('appAnnotation.embeddingModelSwitchTip')}
|
|
||||||
>
|
|
||||||
<div className='pt-1'>
|
|
||||||
<ModelSelector
|
|
||||||
defaultModel={embeddingModel && {
|
|
||||||
provider: embeddingModel.providerName,
|
|
||||||
model: embeddingModel.modelName,
|
|
||||||
}}
|
|
||||||
modelList={embeddingsModelList}
|
|
||||||
onSelect={(val) => {
|
|
||||||
setEmbeddingModel({
|
|
||||||
providerName: val.provider,
|
|
||||||
modelName: val.model,
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</Item>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='mt-6 flex gap-2 justify-end'>
|
|
||||||
<Button className='!text-sm' onClick={onHide}>{t('common.operation.cancel')}</Button>
|
|
||||||
<Button
|
|
||||||
type='primary'
|
|
||||||
onClick={handleSave}
|
|
||||||
className='flex items-center border-[0.5px] !text-sm'
|
|
||||||
loading={isLoading}
|
|
||||||
>
|
|
||||||
<div></div>
|
|
||||||
<div>{t(`appAnnotation.initSetup.${isInit ? 'confirmBtn' : 'configConfirmBtn'}`)}</div>
|
|
||||||
</Button >
|
|
||||||
</div >
|
|
||||||
</Modal >
|
|
||||||
)
|
|
||||||
}
|
|
||||||
export default React.memo(ConfigParamModal)
|
|
||||||
@ -1,124 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import type { FC } from 'react'
|
|
||||||
import React from 'react'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import { useContext } from 'use-context-selector'
|
|
||||||
import { usePathname, useRouter } from 'next/navigation'
|
|
||||||
import ConfigParamModal from './config-param-modal'
|
|
||||||
import Panel from '@/app/components/app/configuration/base/feature-panel'
|
|
||||||
import { MessageFast } from '@/app/components/base/icons/src/vender/solid/communication'
|
|
||||||
import TooltipPlus from '@/app/components/base/tooltip-plus'
|
|
||||||
import { HelpCircle, LinkExternal02, Settings04 } from '@/app/components/base/icons/src/vender/line/general'
|
|
||||||
import ConfigContext from '@/context/debug-configuration'
|
|
||||||
import type { EmbeddingModelConfig } from '@/app/components/app/annotation/type'
|
|
||||||
import { updateAnnotationScore } from '@/service/annotation'
|
|
||||||
|
|
||||||
export type AnnotationProps = {
|
|
||||||
onEmbeddingChange: (embeddingModel: EmbeddingModelConfig) => void
|
|
||||||
onScoreChange: (score: number, embeddingModel?: EmbeddingModelConfig) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Item: FC<{ title: string; tooltip: string; children: JSX.Element }> = ({
|
|
||||||
title,
|
|
||||||
tooltip,
|
|
||||||
children,
|
|
||||||
}) => {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div className='flex items-center space-x-1'>
|
|
||||||
<div>{title}</div>
|
|
||||||
<TooltipPlus
|
|
||||||
popupContent={
|
|
||||||
<div className='max-w-[200px] leading-[18px] text-[13px] font-medium text-gray-800'>{tooltip}</div>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<HelpCircle className='w-3.5 h-3.5 text-gray-400' />
|
|
||||||
</TooltipPlus>
|
|
||||||
</div>
|
|
||||||
<div>{children}</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnnotationReplyConfig: FC<AnnotationProps> = ({
|
|
||||||
onEmbeddingChange,
|
|
||||||
onScoreChange,
|
|
||||||
}) => {
|
|
||||||
const { t } = useTranslation()
|
|
||||||
const router = useRouter()
|
|
||||||
const pathname = usePathname()
|
|
||||||
const matched = pathname.match(/\/app\/([^/]+)/)
|
|
||||||
const appId = (matched?.length && matched[1]) ? matched[1] : ''
|
|
||||||
const {
|
|
||||||
annotationConfig,
|
|
||||||
} = useContext(ConfigContext)
|
|
||||||
|
|
||||||
const [isShowEdit, setIsShowEdit] = React.useState(false)
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Panel
|
|
||||||
className="mt-4"
|
|
||||||
headerIcon={
|
|
||||||
<MessageFast className='w-4 h-4 text-[#444CE7]' />
|
|
||||||
}
|
|
||||||
title={t('appDebug.feature.annotation.title')}
|
|
||||||
headerRight={
|
|
||||||
<div className='flex items-center'>
|
|
||||||
<div
|
|
||||||
className='flex items-center rounded-md h-7 px-3 space-x-1 text-gray-700 cursor-pointer hover:bg-gray-200'
|
|
||||||
onClick={() => { setIsShowEdit(true) }}
|
|
||||||
>
|
|
||||||
<Settings04 className="w-[14px] h-[14px]" />
|
|
||||||
<div className='text-xs font-medium'>
|
|
||||||
|
|
||||||
{t('common.operation.params')}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className='ml-1 flex items-center h-7 px-3 space-x-1 leading-[18px] text-xs font-medium text-gray-700 rounded-md cursor-pointer hover:bg-gray-200'
|
|
||||||
onClick={() => {
|
|
||||||
router.push(`/app/${appId}/annotations`)
|
|
||||||
}}>
|
|
||||||
<div>{t('appDebug.feature.annotation.cacheManagement')}</div>
|
|
||||||
<LinkExternal02 className='w-3.5 h-3.5' />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
noBodySpacing
|
|
||||||
/>
|
|
||||||
{isShowEdit && (
|
|
||||||
<ConfigParamModal
|
|
||||||
appId={appId}
|
|
||||||
isShow
|
|
||||||
onHide={() => {
|
|
||||||
setIsShowEdit(false)
|
|
||||||
}}
|
|
||||||
onSave={async (embeddingModel, score) => {
|
|
||||||
let isEmbeddingModelChanged = false
|
|
||||||
if (
|
|
||||||
embeddingModel.embedding_model_name !== annotationConfig.embedding_model.embedding_model_name
|
|
||||||
&& embeddingModel.embedding_provider_name !== annotationConfig.embedding_model.embedding_provider_name
|
|
||||||
) {
|
|
||||||
await onEmbeddingChange(embeddingModel)
|
|
||||||
isEmbeddingModelChanged = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (score !== annotationConfig.score_threshold) {
|
|
||||||
await updateAnnotationScore(appId, annotationConfig.id, score)
|
|
||||||
if (isEmbeddingModelChanged)
|
|
||||||
onScoreChange(score, embeddingModel)
|
|
||||||
|
|
||||||
else
|
|
||||||
onScoreChange(score)
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsShowEdit(false)
|
|
||||||
}}
|
|
||||||
annotationConfig={annotationConfig}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
export default React.memo(AnnotationReplyConfig)
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
export enum PageType {
|
|
||||||
log = 'log',
|
|
||||||
annotation = 'annotation',
|
|
||||||
}
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
import React, { useState } from 'react'
|
|
||||||
import produce from 'immer'
|
|
||||||
import type { AnnotationReplyConfig } from '@/models/debug'
|
|
||||||
import { queryAnnotationJobStatus, updateAnnotationStatus } from '@/service/annotation'
|
|
||||||
import type { EmbeddingModelConfig } from '@/app/components/app/annotation/type'
|
|
||||||
import { AnnotationEnableStatus, JobStatus } from '@/app/components/app/annotation/type'
|
|
||||||
import { sleep } from '@/utils'
|
|
||||||
import { ANNOTATION_DEFAULT } from '@/config'
|
|
||||||
import { useProviderContext } from '@/context/provider-context'
|
|
||||||
|
|
||||||
type Params = {
|
|
||||||
appId: string
|
|
||||||
annotationConfig: AnnotationReplyConfig
|
|
||||||
setAnnotationConfig: (annotationConfig: AnnotationReplyConfig) => void
|
|
||||||
}
|
|
||||||
const useAnnotationConfig = ({
|
|
||||||
appId,
|
|
||||||
annotationConfig,
|
|
||||||
setAnnotationConfig,
|
|
||||||
}: Params) => {
|
|
||||||
const { plan, enableBilling } = useProviderContext()
|
|
||||||
const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
|
|
||||||
const [isShowAnnotationFullModal, setIsShowAnnotationFullModal] = useState(false)
|
|
||||||
const [isShowAnnotationConfigInit, doSetIsShowAnnotationConfigInit] = React.useState(false)
|
|
||||||
const setIsShowAnnotationConfigInit = (isShow: boolean) => {
|
|
||||||
if (isShow) {
|
|
||||||
if (isAnnotationFull) {
|
|
||||||
setIsShowAnnotationFullModal(true)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
doSetIsShowAnnotationConfigInit(isShow)
|
|
||||||
}
|
|
||||||
const ensureJobCompleted = async (jobId: string, status: AnnotationEnableStatus) => {
|
|
||||||
let isCompleted = false
|
|
||||||
while (!isCompleted) {
|
|
||||||
const res: any = await queryAnnotationJobStatus(appId, status, jobId)
|
|
||||||
isCompleted = res.job_status === JobStatus.completed
|
|
||||||
if (isCompleted)
|
|
||||||
break
|
|
||||||
|
|
||||||
await sleep(2000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleEnableAnnotation = async (embeddingModel: EmbeddingModelConfig, score?: number) => {
|
|
||||||
if (isAnnotationFull)
|
|
||||||
return
|
|
||||||
|
|
||||||
const { job_id: jobId }: any = await updateAnnotationStatus(appId, AnnotationEnableStatus.enable, embeddingModel, score)
|
|
||||||
await ensureJobCompleted(jobId, AnnotationEnableStatus.enable)
|
|
||||||
setAnnotationConfig(produce(annotationConfig, (draft: AnnotationReplyConfig) => {
|
|
||||||
draft.enabled = true
|
|
||||||
draft.embedding_model = embeddingModel
|
|
||||||
if (!draft.score_threshold)
|
|
||||||
draft.score_threshold = ANNOTATION_DEFAULT.score_threshold
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
const setScore = (score: number, embeddingModel?: EmbeddingModelConfig) => {
|
|
||||||
setAnnotationConfig(produce(annotationConfig, (draft: AnnotationReplyConfig) => {
|
|
||||||
draft.score_threshold = score
|
|
||||||
if (embeddingModel)
|
|
||||||
draft.embedding_model = embeddingModel
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleDisableAnnotation = async (embeddingModel: EmbeddingModelConfig) => {
|
|
||||||
if (!annotationConfig.enabled)
|
|
||||||
return
|
|
||||||
|
|
||||||
await updateAnnotationStatus(appId, AnnotationEnableStatus.disable, embeddingModel)
|
|
||||||
setAnnotationConfig(produce(annotationConfig, (draft: AnnotationReplyConfig) => {
|
|
||||||
draft.enabled = false
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
handleEnableAnnotation,
|
|
||||||
handleDisableAnnotation,
|
|
||||||
isShowAnnotationConfigInit,
|
|
||||||
setIsShowAnnotationConfigInit,
|
|
||||||
isShowAnnotationFullModal,
|
|
||||||
setIsShowAnnotationFullModal,
|
|
||||||
setScore,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default useAnnotationConfig
|
|
||||||
@ -12,18 +12,14 @@ import TextToSpeech from './text-to-speech'
|
|||||||
import SpeechToText from './speech-to-text'
|
import SpeechToText from './speech-to-text'
|
||||||
import Citation from './citation'
|
import Citation from './citation'
|
||||||
import Moderation from './moderation'
|
import Moderation from './moderation'
|
||||||
import Annotation from './annotation'
|
|
||||||
import type { AnnotationProps } from './annotation'
|
|
||||||
|
|
||||||
export type FeaturePanelProps = {
|
export type FeaturePanelProps = {
|
||||||
onChange?: OnFeaturesChange
|
onChange?: OnFeaturesChange
|
||||||
openingStatementProps: OpeningStatementProps
|
openingStatementProps: OpeningStatementProps
|
||||||
annotationProps: AnnotationProps
|
|
||||||
}
|
}
|
||||||
const FeaturePanel = ({
|
const FeaturePanel = ({
|
||||||
onChange,
|
onChange,
|
||||||
openingStatementProps,
|
openingStatementProps,
|
||||||
annotationProps,
|
|
||||||
}: FeaturePanelProps) => {
|
}: FeaturePanelProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const features = useFeatures(s => s.features)
|
const features = useFeatures(s => s.features)
|
||||||
@ -98,11 +94,6 @@ const FeaturePanel = ({
|
|||||||
<Moderation onChange={onChange} />
|
<Moderation onChange={onChange} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
|
||||||
features.annotation.enabled && (
|
|
||||||
<Annotation {...annotationProps} />
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -54,14 +54,14 @@ const PanelOperator = ({
|
|||||||
}, [toolsets, data.provider_id])
|
}, [toolsets, data.provider_id])
|
||||||
|
|
||||||
const handleGetAbout = useCallback(() => {
|
const handleGetAbout = useCallback(() => {
|
||||||
if (data.provider_id && !toolsMap[data.provider_id]?.length) {
|
if (data.provider_id && !toolsMap[data.provider_id]?.length && open) {
|
||||||
fetchToolList(data.provider_id).then((list: any) => {
|
fetchToolList(data.provider_id).then((list: any) => {
|
||||||
setToolsMap(produce(toolsMap, (draft) => {
|
setToolsMap(produce(toolsMap, (draft) => {
|
||||||
draft[data.provider_id as string] = list
|
draft[data.provider_id as string] = list
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, [data, toolsMap, fetchToolList, setToolsMap])
|
}, [data, toolsMap, fetchToolList, setToolsMap, open])
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
handleGetAbout()
|
handleGetAbout()
|
||||||
}, [handleGetAbout])
|
}, [handleGetAbout])
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user