import { useTranslation } from 'react-i18next' import { RiArrowGoBackLine, RiCloseLine, RiMenuLine, RiSparklingFill, } from '@remixicon/react' import { useStore } from '../store' import { BlockEnum } from '../types' import useCurrentVars from '../hooks/use-inspect-vars-crud' import Empty from './empty' import ValueContent from './value-content' import ActionButton from '@/app/components/base/action-button' import Badge from '@/app/components/base/badge' import CopyFeedback from '@/app/components/base/copy-feedback' import Tooltip from '@/app/components/base/tooltip' import BlockIcon from '@/app/components/workflow/block-icon' import Loading from '@/app/components/base/loading' import type { currentVarType } from './panel' import { VarInInspectType } from '@/types/workflow' import cn from '@/utils/classnames' import useNodeInfo from '../nodes/_base/hooks/use-node-info' import { useBoolean } from 'ahooks' import GetAutomaticResModal from '@/app/components/app/configuration/config/automatic/get-automatic-res' import GetCodeGeneratorResModal from '../../app/configuration/config/code-generator/get-code-generator-res' import { AppType } from '@/types/app' import { useHooksStore } from '../hooks-store' import { useCallback, useMemo } from 'react' import { useNodesInteractions } from '../hooks' import { CodeLanguage } from '../nodes/code/types' import useNodeCrud from '../nodes/_base/hooks/use-node-crud' import type { GenRes } from '@/service/debug' import produce from 'immer' import { PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER } from '../../base/prompt-editor/plugins/update-block' import { useEventEmitterContextContext } from '@/context/event-emitter' import { VariableIconWithColor } from '@/app/components/workflow/nodes/_base/components/variable/variable-label' type Props = { nodeId: string currentNodeVar?: currentVarType handleOpenMenu: () => void isValueFetching?: boolean } const Right = ({ nodeId, currentNodeVar, handleOpenMenu, isValueFetching, }: Props) => { const { t } = useTranslation() const bottomPanelWidth = useStore(s => s.bottomPanelWidth) const setShowVariableInspectPanel = useStore(s => s.setShowVariableInspectPanel) const setCurrentFocusNodeId = useStore(s => s.setCurrentFocusNodeId) const { resetConversationVar, resetToLastRunVar, editInspectVarValue, } = useCurrentVars() const handleValueChange = (varId: string, value: any) => { if (!currentNodeVar) return editInspectVarValue(currentNodeVar.nodeId, varId, value) } const resetValue = () => { if (!currentNodeVar) return resetToLastRunVar(currentNodeVar.nodeId, currentNodeVar.var.id) } const handleClose = () => { setShowVariableInspectPanel(false) setCurrentFocusNodeId('') } const handleClear = () => { if (!currentNodeVar) return resetConversationVar(currentNodeVar.var.id) } const getCopyContent = () => { const value = currentNodeVar?.var.value if (value === null || value === undefined) return '' if (typeof value === 'object') return JSON.stringify(value) return String(value) } const configsMap = useHooksStore(s => s.configsMap) const { eventEmitter } = useEventEmitterContextContext() const { handleNodeSelect } = useNodesInteractions() const { node } = useNodeInfo(nodeId) const { setInputs } = useNodeCrud(nodeId, node?.data) const blockType = node?.data?.type const isCodeBlock = blockType === BlockEnum.Code const canShowPromptGenerator = [BlockEnum.LLM, BlockEnum.Code].includes(blockType) const currentPrompt = useMemo(() => { if (!canShowPromptGenerator) return '' if (blockType === BlockEnum.LLM) return node?.data?.prompt_template?.text || node?.data?.prompt_template?.[0].text // if (blockType === BlockEnum.Agent) { // return node?.data?.agent_parameters?.instruction?.value // } if (blockType === BlockEnum.Code) return node?.data?.code }, [canShowPromptGenerator]) const [isShowPromptGenerator, { setTrue: doShowPromptGenerator, setFalse: handleHidePromptGenerator, }] = useBoolean(false) const handleShowPromptGenerator = useCallback(() => { handleNodeSelect(nodeId) doShowPromptGenerator() }, [doShowPromptGenerator, handleNodeSelect, nodeId]) const handleUpdatePrompt = useCallback((res: GenRes) => { const newInputs = produce(node?.data, (draft: any) => { switch (blockType) { case BlockEnum.LLM: if (draft?.prompt_template) { if (Array.isArray(draft.prompt_template)) draft.prompt_template[0].text = res.modified else draft.prompt_template.text = res.modified } break // Agent is a plugin, may has many instructions, can not locate which one to update // case BlockEnum.Agent: // if (draft?.agent_parameters?.instruction) { // draft.agent_parameters.instruction.value = res.modified // } // break case BlockEnum.Code: draft.code = res.modified break } }) setInputs(newInputs) eventEmitter?.emit({ type: PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER, instanceId: `${nodeId}-chat-workflow-llm-prompt-editor`, payload: res.modified, } as any) handleHidePromptGenerator() }, [setInputs, blockType, nodeId, node?.data, handleHidePromptGenerator]) return (