From e89a5b6c7616a565f867d52b226e7035c1b2e57c Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Tue, 2 Dec 2025 10:21:40 +0800 Subject: [PATCH] perf: agent editform --- packages/global/core/app/type.d.ts | 3 + packages/global/core/workflow/constants.ts | 2 + .../common/MySelect/MultipleRowSelect.tsx | 10 +- packages/web/i18n/en/app.json | 4 +- packages/web/i18n/zh-CN/app.json | 4 +- packages/web/i18n/zh-Hant/app.json | 4 +- .../core/ai/SettingLLMModel/index.tsx | 1 + .../app/detail/Edit/ChatAgent/Edit.tsx | 2 +- .../app/detail/Edit/ChatAgent/EditForm.tsx | 110 +++++++----------- .../app/detail/Edit/ChatAgent/utils.ts | 19 +-- 10 files changed, 70 insertions(+), 89 deletions(-) diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index b86ff05a21..08e7a8ca88 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -108,6 +108,9 @@ export type AppFormEditFormType = { aiSettings: { [NodeInputKeyEnum.aiModel]: string; [NodeInputKeyEnum.aiSystemPrompt]?: string | undefined; + [NodeInputKeyEnum.aiRole]?: string | undefined; + [NodeInputKeyEnum.aiTaskObject]?: string | undefined; + [NodeInputKeyEnum.aiChatTemperature]?: number; [NodeInputKeyEnum.aiChatMaxToken]?: number; [NodeInputKeyEnum.aiChatIsResponseText]: boolean; diff --git a/packages/global/core/workflow/constants.ts b/packages/global/core/workflow/constants.ts index 9157a6049d..4a73f8afd3 100644 --- a/packages/global/core/workflow/constants.ts +++ b/packages/global/core/workflow/constants.ts @@ -167,6 +167,8 @@ export enum NodeInputKeyEnum { aiChatStopSign = 'aiChatStopSign', aiChatResponseFormat = 'aiChatResponseFormat', aiChatJsonSchema = 'aiChatJsonSchema', + aiRole = 'aiRole', + aiTaskObject = 'aiTaskObject', // agent subApps = 'subApps', diff --git a/packages/web/components/common/MySelect/MultipleRowSelect.tsx b/packages/web/components/common/MySelect/MultipleRowSelect.tsx index a495040e3f..b82e93131a 100644 --- a/packages/web/components/common/MySelect/MultipleRowSelect.tsx +++ b/packages/web/components/common/MySelect/MultipleRowSelect.tsx @@ -179,14 +179,15 @@ export const MultipleRowSelect = ({ _active={{ transform: 'none' }} + {...ButtonProps} {...(isOpen ? { boxShadow: '0px 0px 0px 2.4px rgba(51, 112, 255, 0.15)', borderColor: 'primary.600', - color: 'primary.700' + color: 'primary.700', + bg: 'white !important' } : {})} - {...ButtonProps} > @@ -364,17 +365,18 @@ export const MultipleRowArraySelect = ({ _hover={{ borderColor: 'primary.500' }} + {...ButtonProps} {...(isOpen ? { borderColor: 'primary.600', color: 'primary.700', - boxShadow: '0px 0px 0px 2.4px rgba(51, 112, 255, 0.15)' + boxShadow: '0px 0px 0px 2.4px rgba(51, 112, 255, 0.15)', + bg: 'white !important' } : { borderColor: 'myGray.200', boxShadow: 'none' })} - {...ButtonProps} onClick={() => (isOpen ? onClose() : onOpenSelect())} className="nowheel" > diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index 1dc62cea23..673e31887a 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -38,8 +38,7 @@ "Team_Tags": "Team tags", "Tool_name": "Tool name", "ai_point_price": "Billing", - "ai_role": "AI role description", - "ai_role_placeholder": "Refer to the following template:\n## Role\n## Response style\n## Response rule", + "ai_role": "AI Role", "ai_settings": "AI Configuration", "all_apps": "All Applications", "app.Version name": "Version Name", @@ -338,6 +337,7 @@ "sync_team_app_log_keys": "Restore to team configuration", "system_secret": "System secret", "systemval_conflict_globalval": "The variable name conflicts with the system variable, please use other variable names", + "task_object": "mission objectives", "team_tags_set": "Team tags", "temperature": "Temperature", "temperature_tip": "Range 0~10. \nThe larger the value, the more divergent the model’s answer is; the smaller the value, the more rigorous the answer.", diff --git a/packages/web/i18n/zh-CN/app.json b/packages/web/i18n/zh-CN/app.json index a420950ab4..ee2f4dd602 100644 --- a/packages/web/i18n/zh-CN/app.json +++ b/packages/web/i18n/zh-CN/app.json @@ -40,8 +40,7 @@ "Tool_description": "工具描述", "Tool_name": "工具名称", "ai_point_price": "AI积分计费", - "ai_role": "AI 角色描述", - "ai_role_placeholder": "参考以下模板:\n## 角色\n## 回答风格\n## 回答要求", + "ai_role": "AI 角色", "ai_settings": "AI 配置", "all_apps": "全部应用", "app.Version name": "版本名称", @@ -352,6 +351,7 @@ "sync_team_app_log_keys": "还原成团队配置", "system_secret": "系统密钥", "systemval_conflict_globalval": "变量名与系统变量有冲突,请使用其他变量名", + "task_object": "任务目标", "team_tags_set": "团队标签", "temperature": "温度", "temperature_tip": "范围 0~10。值越大,代表模型回答越发散;值越小,代表回答越严谨。", diff --git a/packages/web/i18n/zh-Hant/app.json b/packages/web/i18n/zh-Hant/app.json index e881197e89..799306e5cf 100644 --- a/packages/web/i18n/zh-Hant/app.json +++ b/packages/web/i18n/zh-Hant/app.json @@ -38,8 +38,7 @@ "Tool_description": "工具描述", "Tool_name": "工具名稱", "ai_point_price": "AI 積分計費", - "ai_role": "AI 角色描述", - "ai_role_placeholder": "參考以下模板:\n## 角色\n## 回答风格\n## 回答要求", + "ai_role": "AI 角色", "ai_settings": "AI 設定", "all_apps": "所有應用程式", "app.Version name": "版本名稱", @@ -336,6 +335,7 @@ "sync_team_app_log_keys": "還原成團隊配置", "system_secret": "系統密鑰", "systemval_conflict_globalval": "變量名與系統變量有衝突,請使用其他變量名", + "task_object": "任務目標", "team_tags_set": "團隊標籤", "temperature": "溫度", "temperature_tip": "範圍 0~10。\n值越大,代表模型回答越發散;值越小,代表回答越嚴謹。", diff --git a/projects/app/src/components/core/ai/SettingLLMModel/index.tsx b/projects/app/src/components/core/ai/SettingLLMModel/index.tsx index 2b5b1e38f1..2f3e6744a7 100644 --- a/projects/app/src/components/core/ai/SettingLLMModel/index.tsx +++ b/projects/app/src/components/core/ai/SettingLLMModel/index.tsx @@ -71,6 +71,7 @@ const SettingLLMModel = ({ ({ diff --git a/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/Edit.tsx b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/Edit.tsx index 0333a358fc..c3322c0f2d 100644 --- a/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/Edit.tsx +++ b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/Edit.tsx @@ -46,7 +46,7 @@ const Edit = ({ - + diff --git a/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/EditForm.tsx b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/EditForm.tsx index ef3e17fbb5..4a8fcb7501 100644 --- a/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/EditForm.tsx +++ b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/EditForm.tsx @@ -7,7 +7,8 @@ import { useTheme, useDisclosure, Button, - HStack + HStack, + Input } from '@chakra-ui/react'; import type { AppFormEditFormType } from '@fastgpt/global/core/app/type.d'; import { useRouter } from 'next/router'; @@ -35,6 +36,7 @@ import OptimizerPopover from '@/components/common/PromptEditor/OptimizerPopover' import type { FlowNodeTemplateType } from '@fastgpt/global/core/workflow/type/node'; import { type SelectedToolItemType, useSkillManager } from './hooks/useSkillManager'; import { useMemoEnhance } from '@fastgpt/web/hooks/useMemoEnhance'; +import { cardStyles } from '../../constants'; const DatasetSelectModal = dynamic(() => import('@/components/core/app/DatasetSelectModal')); const DatasetParamsModal = dynamic(() => import('@/components/core/app/DatasetParamsModal')); @@ -67,42 +69,6 @@ const EditForm = ({ const selectDatasets = useMemo(() => appForm?.dataset?.datasets, [appForm]); const [, startTst] = useTransition(); - // Skill picker - // const selectedTools = useMemoEnhance(() => appForm.selectedTools, [appForm.selectedTools]); - // const onUpdateOrAddTool = useCallback( - // (tool: SelectedToolItemType) => { - // setAppForm((state) => { - // if (state.selectedTools.some((t) => t.id === tool.id)) { - // return { - // ...state, - // selectedTools: state.selectedTools.map((t) => (t.id === tool.id ? tool : t)) - // }; - // } - // return { - // ...state, - // selectedTools: [tool, ...state.selectedTools] - // }; - // }); - // }, - // [setAppForm] - // ); - // const onDeleteTool = useCallback( - // (id: string) => { - // setAppForm((state) => ({ - // ...state, - // selectedTools: state.selectedTools.filter((t) => t.id !== id) - // })); - // }, - // [setAppForm] - // ); - // const { SkillModal, skillOption, selectedSkills, onClickSkill, onRemoveSkill } = useSkillManager({ - // selectedTools, - // onUpdateOrAddTool, - // onDeleteTool, - // canSelectFile: appForm.chatConfig?.fileSelectConfig?.canSelectFile, - // canSelectImg: appForm.chatConfig?.fileSelectConfig?.canSelectImg - // }); - const { isOpen: isOpenDatasetSelect, onOpen: onOpenKbSelect, @@ -159,30 +125,9 @@ const EditForm = ({ } }, [selectedModel, setAppForm]); - const OptimizerPromptPopverComponent = useCallback( - ({ iconButtonStyle }: { iconButtonStyle: Record }) => { - return ( - { - setAppForm((state) => ({ - ...state, - aiSettings: { - ...state.aiSettings, - systemPrompt: e - } - })); - }} - /> - ); - }, - [appForm.aiSettings.systemPrompt, setAppForm] - ); - return ( <> - + {/* ai */} @@ -228,15 +173,12 @@ const EditForm = ({ {t('app:ai_role')} - - - - {/* */} { startTst(() => { @@ -244,16 +186,41 @@ const EditForm = ({ ...state, aiSettings: { ...state.aiSettings, - systemPrompt: text + aiRole: text } })); }); }} // variableLabels={formatVariables} - placeholder={t('app:ai_role_placeholder')} - title={t('common:core.ai.Prompt')} - ExtensionPopover={[OptimizerPromptPopverComponent]} - isRichText={true} + title={t('app:ai_role')} + isRichText={false} + /> + + + + + {t('app:task_object')} + + + { + startTst(() => { + setAppForm((state) => ({ + ...state, + aiSettings: { + ...state.aiSettings, + aiTaskObject: text + } + })); + }); + }} + // variableLabels={formatVariables} + title={t('app:task_object')} + isRichText={false} /> @@ -374,7 +341,8 @@ const EditForm = ({ }} /> */} - + + {/* welcome */} [input.key, input.value])); if (node.flowNodeType === FlowNodeTypeEnum.agent) { defaultAppForm.aiSettings.model = findInputValueByKey(node.inputs, NodeInputKeyEnum.aiModel); - defaultAppForm.aiSettings.systemPrompt = inputMap.get(NodeInputKeyEnum.aiSystemPrompt); + defaultAppForm.aiSettings.aiRole = inputMap.get(NodeInputKeyEnum.aiRole); + defaultAppForm.aiSettings.aiTaskObject = inputMap.get(NodeInputKeyEnum.aiTaskObject); defaultAppForm.aiSettings.temperature = inputMap.get(NodeInputKeyEnum.aiChatTemperature); defaultAppForm.aiSettings.maxHistories = inputMap.get(NodeInputKeyEnum.history); defaultAppForm.aiSettings.aiChatTopP = inputMap.get(NodeInputKeyEnum.aiChatTopP); @@ -134,14 +135,18 @@ export function agentForm2AppWorkflow( value: data.aiSettings.model }, { - key: NodeInputKeyEnum.aiSystemPrompt, + key: NodeInputKeyEnum.aiRole, renderTypeList: [FlowNodeInputTypeEnum.textarea, FlowNodeInputTypeEnum.reference], - max: 3000, valueType: WorkflowIOValueTypeEnum.string, - label: t('common:core.ai.Prompt'), - description: t('common:core.app.tip.systemPromptTip'), - placeholder: t('common:core.app.tip.chatNodeSystemPromptTip'), - value: data.aiSettings.systemPrompt + label: t('app:ai_role'), + value: data.aiSettings.aiRole + }, + { + key: NodeInputKeyEnum.aiTaskObject, + renderTypeList: [FlowNodeInputTypeEnum.textarea, FlowNodeInputTypeEnum.reference], + valueType: WorkflowIOValueTypeEnum.string, + label: t('app:task_object'), + value: data.aiSettings.aiTaskObject }, { ...Input_Template_File_Link,