diff --git a/web/app/components/workflow/nodes/llm/components/config-prompt-item.tsx b/web/app/components/workflow/nodes/llm/components/config-prompt-item.tsx new file mode 100644 index 0000000000..a6d9525453 --- /dev/null +++ b/web/app/components/workflow/nodes/llm/components/config-prompt-item.tsx @@ -0,0 +1,107 @@ +'use client' +import type { FC } from 'react' +import React, { useEffect, useState } from 'react' +import { uniqueId } from 'lodash-es' +import { useTranslation } from 'react-i18next' +import type { PromptItem } from '../../../types' +import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor' +import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector' +import TooltipPlus from '@/app/components/base/tooltip-plus' +import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general' +import { PromptRole } from '@/models/debug' + +const i18nPrefix = 'workflow.nodes.llm' + +type Props = { + readOnly: boolean + id: string + canRemove: boolean + isChatModel: boolean + isChatApp: boolean + payload: PromptItem + handleChatModeMessageRoleChange: (role: PromptRole) => void + onPromptChange: (p: string) => void + onRemove: () => void + isShowContext: boolean + hasSetBlockStatus: { + context: boolean + history: boolean + query: boolean + } + availableVars: any + availableNodes: any +} + +const roleOptions = [ + { + label: 'system', + value: PromptRole.system, + }, + { + label: 'user', + value: PromptRole.user, + }, + { + label: 'assistant', + value: PromptRole.assistant, + }, +] + +const ConfigPromptItem: FC = ({ + readOnly, + id, + canRemove, + handleChatModeMessageRoleChange, + isChatModel, + isChatApp, + payload, + onPromptChange, + onRemove, + isShowContext, + hasSetBlockStatus, + availableVars, + availableNodes, +}) => { + const { t } = useTranslation() + const [instanceId, setInstanceId] = useState(uniqueId()) + useEffect(() => { + setInstanceId(`${id}-${uniqueId()}`) + }, [id]) + return ( + + + + {t(`${i18nPrefix}.roleDescription.${payload.role}`)} + } + > + + + + } + value={payload.text} + onChange={onPromptChange} + readOnly={readOnly} + showRemove={canRemove} + onRemove={onRemove} + isChatModel={isChatModel} + isChatApp={isChatApp} + isShowContext={isShowContext} + hasSetBlockStatus={hasSetBlockStatus} + nodesOutputVars={availableVars} + availableNodes={availableNodes} + /> + ) +} +export default React.memo(ConfigPromptItem) diff --git a/web/app/components/workflow/nodes/llm/components/config-prompt.tsx b/web/app/components/workflow/nodes/llm/components/config-prompt.tsx index 7ffff9cb33..87671e6db5 100644 --- a/web/app/components/workflow/nodes/llm/components/config-prompt.tsx +++ b/web/app/components/workflow/nodes/llm/components/config-prompt.tsx @@ -6,11 +6,9 @@ import produce from 'immer' import type { PromptItem, ValueSelector, Var } from '../../../types' import { PromptRole } from '../../../types' import useAvailableVarList from '../../_base/hooks/use-available-var-list' +import ConfigPromptItem from './config-prompt-item' import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor' import AddButton from '@/app/components/workflow/nodes/_base/components/add-button' -import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector' -import TooltipPlus from '@/app/components/base/tooltip-plus' -import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general' const i18nPrefix = 'workflow.nodes.llm' type Props = { @@ -58,21 +56,6 @@ const ConfigPrompt: FC = ({ } }, [onChange, payload]) - const roleOptions = [ - { - label: 'system', - value: PromptRole.system, - }, - { - label: 'user', - value: PromptRole.user, - }, - { - label: 'assistant', - value: PromptRole.assistant, - }, - ] - const handleChatModeMessageRoleChange = useCallback((index: number) => { return (role: PromptRole) => { const newPrompt = produce(payload as PromptItem[], (draft) => { @@ -117,37 +100,20 @@ const ConfigPrompt: FC = ({ { (payload as PromptItem[]).map((item, index) => { return ( - - - {t(`${i18nPrefix}.roleDescription.${item.role}`)} - } - > - - - - } - value={item.text} - onChange={handleChatModePromptChange(index)} + 1} readOnly={readOnly} - showRemove={(payload as PromptItem[]).length > 1} - onRemove={handleRemove(index)} + id={`${payload.length}-${index}`} + handleChatModeMessageRoleChange={handleChatModeMessageRoleChange(index)} isChatModel={isChatModel} isChatApp={isChatApp} + payload={item} + onPromptChange={handleChatModePromptChange(index)} + onRemove={handleRemove(index)} isShowContext={isShowContext} hasSetBlockStatus={hasSetBlockStatus} - nodesOutputVars={availableVars} + availableVars={availableVars} availableNodes={availableNodes} /> )