| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 | 
							- 'use client'
 - import type { FC } from 'react'
 - import React, { useState } from 'react'
 - import { useTranslation } from 'react-i18next'
 - import { useBoolean } from 'ahooks'
 - import {
 -   RiQuestionLine,
 - } from '@remixicon/react'
 - import produce from 'immer'
 - import { useContext } from 'use-context-selector'
 - import ConfirmAddVar from './confirm-add-var'
 - import s from './style.module.css'
 - import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap'
 - import cn from '@/utils/classnames'
 - import { type PromptVariable } from '@/models/debug'
 - import Tooltip from '@/app/components/base/tooltip'
 - import { AppType } from '@/types/app'
 - import { getNewVar, getVars } from '@/utils/var'
 - import AutomaticBtn from '@/app/components/app/configuration/config/automatic/automatic-btn'
 - import type { AutomaticRes } from '@/service/debug'
 - import GetAutomaticResModal from '@/app/components/app/configuration/config/automatic/get-automatic-res'
 - import PromptEditor from '@/app/components/base/prompt-editor'
 - import ConfigContext from '@/context/debug-configuration'
 - import { useModalContext } from '@/context/modal-context'
 - import type { ExternalDataTool } from '@/models/common'
 - import { useToastContext } from '@/app/components/base/toast'
 - import { useEventEmitterContextContext } from '@/context/event-emitter'
 - import { ADD_EXTERNAL_DATA_TOOL } from '@/app/components/app/configuration/config-var'
 - import { INSERT_VARIABLE_VALUE_BLOCK_COMMAND } from '@/app/components/base/prompt-editor/plugins/variable-block'
 - import { PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER } from '@/app/components/base/prompt-editor/plugins/update-block'
 - 
 - export type ISimplePromptInput = {
 -   mode: AppType
 -   promptTemplate: string
 -   promptVariables: PromptVariable[]
 -   readonly?: boolean
 -   onChange?: (promp: string, promptVariables: PromptVariable[]) => void
 - }
 - 
 - const Prompt: FC<ISimplePromptInput> = ({
 -   mode,
 -   promptTemplate,
 -   promptVariables,
 -   readonly = false,
 -   onChange,
 - }) => {
 -   const { t } = useTranslation()
 -   const { eventEmitter } = useEventEmitterContextContext()
 -   const {
 -     modelConfig,
 -     dataSets,
 -     setModelConfig,
 -     setPrevPromptConfig,
 -     setIntroduction,
 -     hasSetBlockStatus,
 -     showSelectDataSet,
 -     externalDataToolsConfig,
 -     isAgent,
 -   } = useContext(ConfigContext)
 -   const { notify } = useToastContext()
 -   const { setShowExternalDataToolModal } = useModalContext()
 -   const handleOpenExternalDataToolModal = () => {
 -     setShowExternalDataToolModal({
 -       payload: {},
 -       onSaveCallback: (newExternalDataTool: ExternalDataTool) => {
 -         eventEmitter?.emit({
 -           type: ADD_EXTERNAL_DATA_TOOL,
 -           payload: newExternalDataTool,
 -         } as any)
 -         eventEmitter?.emit({
 -           type: INSERT_VARIABLE_VALUE_BLOCK_COMMAND,
 -           payload: newExternalDataTool.variable,
 -         } as any)
 -       },
 -       onValidateBeforeSaveCallback: (newExternalDataTool: ExternalDataTool) => {
 -         for (let i = 0; i < promptVariables.length; i++) {
 -           if (promptVariables[i].key === newExternalDataTool.variable) {
 -             notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: promptVariables[i].key }) })
 -             return false
 -           }
 -         }
 - 
 -         return true
 -       },
 -     })
 -   }
 -   const promptVariablesObj = (() => {
 -     const obj: Record<string, boolean> = {}
 -     promptVariables.forEach((item) => {
 -       obj[item.key] = true
 -     })
 -     return obj
 -   })()
 - 
 -   const [newPromptVariables, setNewPromptVariables] = React.useState<PromptVariable[]>(promptVariables)
 -   const [newTemplates, setNewTemplates] = React.useState('')
 -   const [isShowConfirmAddVar, { setTrue: showConfirmAddVar, setFalse: hideConfirmAddVar }] = useBoolean(false)
 - 
 -   const handleChange = (newTemplates: string, keys: string[]) => {
 -     const newPromptVariables = keys.filter(key => !(key in promptVariablesObj) && !externalDataToolsConfig.find(item => item.variable === key)).map(key => getNewVar(key, ''))
 -     if (newPromptVariables.length > 0) {
 -       setNewPromptVariables(newPromptVariables)
 -       setNewTemplates(newTemplates)
 -       showConfirmAddVar()
 -       return
 -     }
 -     onChange?.(newTemplates, [])
 -   }
 - 
 -   const handleAutoAdd = (isAdd: boolean) => {
 -     return () => {
 -       onChange?.(newTemplates, isAdd ? newPromptVariables : [])
 -       hideConfirmAddVar()
 -     }
 -   }
 - 
 -   const [showAutomatic, { setTrue: showAutomaticTrue, setFalse: showAutomaticFalse }] = useBoolean(false)
 -   const handleAutomaticRes = (res: AutomaticRes) => {
 -     const newModelConfig = produce(modelConfig, (draft) => {
 -       draft.configs.prompt_template = res.prompt
 -       draft.configs.prompt_variables = res.variables.map(key => ({ key, name: key, type: 'string', required: true }))
 -     })
 -     setModelConfig(newModelConfig)
 -     setPrevPromptConfig(modelConfig.configs)
 -     if (mode !== AppType.completion)
 -       setIntroduction(res.opening_statement)
 -     showAutomaticFalse()
 -     eventEmitter?.emit({
 -       type: PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER,
 -       payload: res.prompt,
 -     } as any)
 -   }
 -   const minHeight = 228
 -   const [editorHeight, setEditorHeight] = useState(minHeight)
 - 
 -   return (
 -     <div className={cn(!readonly ? `${s.gradientBorder}` : 'bg-gray-50', ' relative shadow-md')}>
 -       <div className='rounded-xl bg-[#EEF4FF]'>
 -         <div className="flex justify-between items-center h-11 px-3">
 -           <div className="flex items-center space-x-1">
 -             <div className='h2'>{mode !== AppType.completion ? t('appDebug.chatSubTitle') : t('appDebug.completionSubTitle')}</div>
 -             {!readonly && (
 -               <Tooltip
 -                 htmlContent={<div className='w-[180px]'>
 -                   {t('appDebug.promptTip')}
 -                 </div>}
 -                 selector='config-prompt-tooltip'>
 -                 <RiQuestionLine className='w-[14px] h-[14px] text-indigo-400' />
 -               </Tooltip>
 -             )}
 -           </div>
 -           <div className='flex items-center'>
 -             {!isAgent && !readonly && (
 -               <AutomaticBtn onClick={showAutomaticTrue} />
 -             )}
 -           </div>
 -         </div>
 -         <PromptEditorHeightResizeWrap
 -           className='px-4 pt-2 min-h-[228px] bg-white rounded-t-xl text-sm text-gray-700'
 -           height={editorHeight}
 -           minHeight={minHeight}
 -           onHeightChange={setEditorHeight}
 -           footer={(
 -             <div className='pl-4 pb-2 flex bg-white rounded-b-xl'>
 -               <div className="h-[18px] leading-[18px] px-1 rounded-md bg-gray-100 text-xs text-gray-500">{promptTemplate.length}</div>
 -             </div>
 -           )}
 -         >
 -           <PromptEditor
 -             className='min-h-[210px]'
 -             compact
 -             value={promptTemplate}
 -             contextBlock={{
 -               show: false,
 -               selectable: !hasSetBlockStatus.context,
 -               datasets: dataSets.map(item => ({
 -                 id: item.id,
 -                 name: item.name,
 -                 type: item.data_source_type,
 -               })),
 -               onAddContext: showSelectDataSet,
 -             }}
 -             variableBlock={{
 -               show: true,
 -               variables: modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({
 -                 name: item.name,
 -                 value: item.key,
 -               })),
 -             }}
 -             externalToolBlock={{
 -               show: true,
 -               externalTools: modelConfig.configs.prompt_variables.filter(item => item.type === 'api').map(item => ({
 -                 name: item.name,
 -                 variableName: item.key,
 -                 icon: item.icon,
 -                 icon_background: item.icon_background,
 -               })),
 -               onAddExternalTool: handleOpenExternalDataToolModal,
 -             }}
 -             historyBlock={{
 -               show: false,
 -               selectable: false,
 -               history: {
 -                 user: '',
 -                 assistant: '',
 -               },
 -               onEditRole: () => { },
 -             }}
 -             queryBlock={{
 -               show: false,
 -               selectable: !hasSetBlockStatus.query,
 -             }}
 -             onChange={(value) => {
 -               handleChange?.(value, [])
 -             }}
 -             onBlur={() => {
 -               handleChange(promptTemplate, getVars(promptTemplate))
 -             }}
 -           />
 -         </PromptEditorHeightResizeWrap>
 -       </div>
 - 
 -       {isShowConfirmAddVar && (
 -         <ConfirmAddVar
 -           varNameArr={newPromptVariables.map(v => v.name)}
 -           onConfrim={handleAutoAdd(true)}
 -           onCancel={handleAutoAdd(false)}
 -           onHide={hideConfirmAddVar}
 -         />
 -       )}
 - 
 -       {showAutomatic && (
 -         <GetAutomaticResModal
 -           mode={mode as AppType}
 -           isShow={showAutomatic}
 -           onClose={showAutomaticFalse}
 -           onFinished={handleAutomaticRes}
 -         />
 -       )}
 -     </div>
 -   )
 - }
 - 
 - export default React.memo(Prompt)
 
 
  |