diff --git a/packages/global/core/app/constants.ts b/packages/global/core/app/constants.ts index 629ba16fc..5186c916c 100644 --- a/packages/global/core/app/constants.ts +++ b/packages/global/core/app/constants.ts @@ -10,7 +10,7 @@ export enum AppTypeEnum { folder = 'folder', toolFolder = 'toolFolder', simple = 'simple', - agent = 'agent', + chatAgent = 'chatAgent', workflow = 'advanced', workflowTool = 'plugin', mcpToolSet = 'toolSet', // 'mcp' @@ -33,7 +33,7 @@ export const ToolTypeList = [ AppTypeEnum.httpToolSet, AppTypeEnum.workflowTool ]; -export const AppTypeList = [AppTypeEnum.simple, AppTypeEnum.agent, AppTypeEnum.workflow]; +export const AppTypeList = [AppTypeEnum.simple, AppTypeEnum.chatAgent, AppTypeEnum.workflow]; export const defaultTTSConfig: AppTTSConfigType = { type: 'web' }; diff --git a/packages/service/core/app/tool/controller.ts b/packages/service/core/app/tool/controller.ts index d2ed14e9d..cba8cb4f8 100644 --- a/packages/service/core/app/tool/controller.ts +++ b/packages/service/core/app/tool/controller.ts @@ -45,7 +45,7 @@ import { Output_Template_Error_Message } from '@fastgpt/global/core/workflow/tem import { splitCombineToolId } from '@fastgpt/global/core/app/tool/utils'; import { getMCPToolRuntimeNode } from '@fastgpt/global/core/app/tool/mcpTool/utils'; import { getHTTPToolRuntimeNode } from '@fastgpt/global/core/app/tool/httpTool/utils'; -import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; +import { AppFolderTypeList, AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { getMCPChildren } from '../mcp'; import { cloneDeep } from 'lodash'; import { UserError } from '@fastgpt/global/common/error/utils'; @@ -227,6 +227,7 @@ export async function getChildAppPreviewNode({ if (source === AppToolSourceEnum.personal) { const item = await MongoApp.findById(pluginId).lean(); if (!item) return Promise.reject(PluginErrEnum.unExist); + if (AppFolderTypeList.includes(item.type)) return Promise.reject(PluginErrEnum.unExist); const version = await getAppVersionById({ appId: pluginId, versionId, app: item }); diff --git a/packages/service/support/permission/teamLimit.ts b/packages/service/support/permission/teamLimit.ts index ad6493b5d..207c45801 100644 --- a/packages/service/support/permission/teamLimit.ts +++ b/packages/service/support/permission/teamLimit.ts @@ -55,7 +55,7 @@ export const checkTeamAppTypeLimit = async ({ MongoApp.countDocuments({ teamId, type: { - $in: [AppTypeEnum.agent, AppTypeEnum.simple, AppTypeEnum.workflow] + $in: [AppTypeEnum.chatAgent, AppTypeEnum.simple, AppTypeEnum.workflow] } }) ]); diff --git a/packages/service/support/user/audit/util.ts b/packages/service/support/user/audit/util.ts index cada6339b..7e5feeeab 100644 --- a/packages/service/support/user/audit/util.ts +++ b/packages/service/support/user/audit/util.ts @@ -13,7 +13,7 @@ import { retryFn } from '@fastgpt/global/common/system/utils'; export function getI18nAppType(type: AppTypeEnum): string { if (type === AppTypeEnum.folder) return i18nT('account_team:type.Folder'); if (type === AppTypeEnum.simple) return i18nT('app:type.Chat_Agent'); - if (type === AppTypeEnum.agent) return 'Agent'; + if (type === AppTypeEnum.chatAgent) return 'Agent'; if (type === AppTypeEnum.workflow) return i18nT('account_team:type.Workflow bot'); if (type === AppTypeEnum.workflowTool) return i18nT('app:toolType_workflow'); if (type === AppTypeEnum.httpPlugin) return i18nT('account_team:type.Http plugin'); diff --git a/packages/web/components/common/Textarea/PromptEditor/plugins/SkillPickerPlugin/index.tsx b/packages/web/components/common/Textarea/PromptEditor/plugins/SkillPickerPlugin/index.tsx index 7026317e8..3da7257e1 100644 --- a/packages/web/components/common/Textarea/PromptEditor/plugins/SkillPickerPlugin/index.tsx +++ b/packages/web/components/common/Textarea/PromptEditor/plugins/SkillPickerPlugin/index.tsx @@ -30,10 +30,9 @@ import { useTranslation } from 'next-i18next'; export type SkillOptionItemType = { description?: string; list: SkillItemType[]; - onSelect?: (id: string) => Promise; onClick?: (id: string) => Promise; - onFolderLoad?: (id: string) => Promise; + onFolderLoad?: (id: string) => Promise; }; export type SkillItemType = { @@ -41,12 +40,16 @@ export type SkillItemType = { id: string; label: string; icon?: string; - showArrow?: boolean; - canOpen?: boolean; - canUse?: boolean; + canClick: boolean; + + // Folder open?: boolean; - children?: SkillOptionItemType; + isFolder?: boolean; folderChildren?: SkillItemType[]; + + // System tool/ model + showArrow?: boolean; + children?: SkillOptionItemType; }; export default function SkillPickerPlugin({ @@ -75,7 +78,6 @@ export default function SkillPickerPlugin({ const [currentColumnIndex, setCurrentColumnIndex] = useState(0); const [currentRowIndex, setCurrentRowIndex] = useState(0); const [interactionMode, setInteractionMode] = useState<'mouse' | 'keyboard'>('mouse'); - const [loadingFolderIds, setLoadingFolderIds] = useState(new Set()); // Refs for scroll management const itemRefs = useRef>(new Map()); @@ -105,10 +107,6 @@ export default function SkillPickerPlugin({ } }, []); - const checkForTriggerMatch = useBasicTypeaheadTriggerMatch('@', { - minLength: 0 - }); - // Recursively collects all visible items including expanded folder children for keyboard navigation const getFlattenedVisibleItems = useCallback( (columnIndex: number): SkillItemType[] => { @@ -119,7 +117,7 @@ export default function SkillPickerPlugin({ items.forEach((item) => { result.push(item); // Include folder children only if folder is expanded - if (item.canOpen && item.open && item.folderChildren) { + if (item.isFolder && item.open && item.folderChildren) { result.push(...flatten(item.folderChildren)); } }); @@ -142,7 +140,8 @@ export default function SkillPickerPlugin({ item?: SkillItemType; option?: SkillOptionItemType; }) => { - if (!item) return; + if (!item || !option?.onSelect) return; + const buffer = item.children; if (buffer) { setSkillOptions((prev) => { @@ -153,7 +152,7 @@ export default function SkillPickerPlugin({ return; } - const result = await option?.onSelect?.(item.id); + const result = await option.onSelect(item.id); setSkillOptions((prev) => { const newOptions = [...prev]; @@ -173,11 +172,14 @@ export default function SkillPickerPlugin({ // Handle item click (confirm selection) const { runAsync: handleItemClick, loading: isItemClickLoading } = useRequest2( async ({ item, option }: { item: SkillItemType; option?: SkillOptionItemType }) => { + if (!item.canClick || !option?.onClick) return; + // Step 1: Execute async onClick to get skillId (outside editor.update) - const skillId = await option?.onClick?.(item.id); + const skillId = await option.onClick(item.id); // Step 2: Update editor with the skillId (inside a fresh editor.update) if (skillId) { + console.log(skillId, 2222); editor.update(() => { // Re-acquire selection in this update cycle to avoid stale node references const selection = $getSelection(); @@ -213,7 +215,8 @@ export default function SkillPickerPlugin({ ); // Handle folder toggle - const { runAsync: handleFolderToggle, loading: isFolderLoading } = useRequest2( + const [loadingFolderIds, setLoadingFolderIds] = useState(new Set()); + const { runAsync: handleFolderToggle } = useRequest2( async ({ currentColumnIndex, item, @@ -223,7 +226,7 @@ export default function SkillPickerPlugin({ item?: SkillItemType; option?: SkillOptionItemType; }) => { - if (!item || !item.canOpen) return; + if (!item || !item.isFolder || !option?.onFolderLoad) return; const currentFolder = item; // Step 1: Toggle folder open/closed state @@ -260,7 +263,7 @@ export default function SkillPickerPlugin({ }); try { - const result = await option?.onFolderLoad?.(currentFolder.id); + const result = await option.onFolderLoad(currentFolder.id); setSkillOptions((prev) => { const newOptions = [...prev]; @@ -271,7 +274,7 @@ export default function SkillPickerPlugin({ if (item.id === currentFolder.id) { return { ...item, - folderChildren: result || [] + folderChildren: result }; } if (item.folderChildren) { @@ -482,6 +485,9 @@ export default function SkillPickerPlugin({ const removeSpaceCommand = editor.registerCommand( KEY_SPACE_COMMAND, (e: KeyboardEvent) => { + e.preventDefault(); + e.stopPropagation(); + if (!isMenuOpen) return true; setInteractionMode('keyboard'); @@ -490,9 +496,7 @@ export default function SkillPickerPlugin({ const latestItem = flattenedItems[currentRowIndex]; const latestOption = skillOptions[currentColumnIndex]; - if (latestItem?.canOpen && !(latestItem.open && latestItem.folderChildren?.length === 0)) { - e.preventDefault(); - e.stopPropagation(); + if (!(latestItem.open && latestItem.folderChildren?.length === 0)) { handleFolderToggle({ currentColumnIndex, item: latestItem, @@ -509,6 +513,9 @@ export default function SkillPickerPlugin({ const removeEnterCommand = editor.registerCommand( KEY_ENTER_COMMAND, (e: KeyboardEvent) => { + e.preventDefault(); + e.stopPropagation(); + if (!isMenuOpen) return true; setInteractionMode('keyboard'); @@ -517,9 +524,7 @@ export default function SkillPickerPlugin({ const latestItem = flattenedItems[currentRowIndex]; const latestOption = skillOptions[currentColumnIndex]; - if (latestItem?.canUse && latestOption) { - e.preventDefault(); - e.stopPropagation(); + if (latestOption?.onClick) { handleItemClick({ item: latestItem, option: latestOption }); return true; @@ -565,7 +570,6 @@ export default function SkillPickerPlugin({ const result: JSX.Element[] = []; const activeRowIndex = selectedRowIndex[columnIndex]; let currentFlatIndex = startFlatIndex; - console.log('items', { selectedRowIndex, columnIndex, activeRowIndex }); items.forEach((item) => { const flatIndex = currentFlatIndex; @@ -596,7 +600,6 @@ export default function SkillPickerPlugin({ color={isSelected ? 'primary.700' : 'myGray.600'} display={'flex'} alignItems={'center'} - isLoading={loadingFolderIds.has(item.id)} size={'sm'} onMouseDown={(e) => { e.preventDefault(); @@ -609,13 +612,13 @@ export default function SkillPickerPlugin({ onClick={(e) => { e.preventDefault(); e.stopPropagation(); - if (item.canOpen) { + if (item.isFolder) { handleFolderToggle({ currentColumnIndex: columnIndex, item, option: columnData }); - } else if (item.canUse) { + } else { handleItemClick({ item, option: columnData @@ -639,18 +642,16 @@ export default function SkillPickerPlugin({ setCurrentRowIndex(flatIndex); setCurrentColumnIndex(columnIndex); - if (item.canUse) { - handleItemSelect({ - currentColumnIndex: columnIndex, - item, - option: columnData - }); - } + handleItemSelect({ + currentColumnIndex: columnIndex, + item, + option: columnData + }); }} > - {item.canOpen && !(item.open && item.folderChildren?.length === 0) ? ( + {item.isFolder && !(item.open && item.folderChildren?.length === 0) ? ( ) : null} {item.icon && } - + + {/* Folder content */} + {item.label} - {item.canOpen && item.open && item.folderChildren?.length === 0 && ( + {item.isFolder && item.open && item.folderChildren?.length === 0 && ( {t('app:empty_folder')} @@ -676,7 +679,7 @@ export default function SkillPickerPlugin({ ); // render folderChildren - if (item.canOpen && item.open && !!item.folderChildren && item.folderChildren.length > 0) { + if (item.isFolder && item.open && !!item.folderChildren && item.folderChildren.length > 0) { const { elements, nextFlatIndex } = renderItemList( item.folderChildren, columnData, @@ -695,14 +698,14 @@ export default function SkillPickerPlugin({ selectedRowIndex, currentColumnIndex, currentRowIndex, + loadingFolderIds, + t, + interactionMode, handleFolderToggle, handleItemClick, - handleItemSelect, - interactionMode, - loadingFolderIds + handleItemSelect ] ); - // Render single column const renderColumn = useCallback( (columnData: SkillOptionItemType, columnIndex: number) => { @@ -719,7 +722,7 @@ export default function SkillPickerPlugin({ boxShadow={'0 4px 10px 0 rgba(19, 51, 107, 0.10), 0 0 1px 0 rgba(19, 51, 107, 0.10)'} bg={'white'} flexShrink={0} - maxH={'300px'} + maxH={'350px'} overflow={'auto'} > {columnData.description && ( @@ -785,6 +788,9 @@ export default function SkillPickerPlugin({ }, [editor] ); + const checkForTriggerMatch = useBasicTypeaheadTriggerMatch('@', { + minLength: 0 + }); return ( import('@/components/core/app/DatasetSelectModal')); @@ -76,18 +76,36 @@ const EditForm = ({ // Skill picker const selectedTools = useMemoEnhance(() => appForm.selectedTools, [appForm.selectedTools]); - const setSelectedTools = useCallback( - (tools: FlowNodeTemplateType[]) => { + 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: tools + selectedTools: state.selectedTools.filter((t) => t.id !== id) })); }, [setAppForm] ); const { SkillModal, skillOption, selectedSkills, onClickSkill, onRemoveSkill } = useSkillManager({ selectedTools, - setSelectedTools, + onUpdateOrAddTool, + onDeleteTool, canSelectFile: appForm.chatConfig?.fileSelectConfig?.canSelectFile, canSelectImg: appForm.chatConfig?.fileSelectConfig?.canSelectImg }); diff --git a/projects/app/src/pageComponents/app/detail/Edit/Agent/hooks/useSkillManager.tsx b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/hooks/useSkillManager.tsx similarity index 79% rename from projects/app/src/pageComponents/app/detail/Edit/Agent/hooks/useSkillManager.tsx rename to projects/app/src/pageComponents/app/detail/Edit/ChatAgent/hooks/useSkillManager.tsx index 9fc001cd3..e82066f92 100644 --- a/projects/app/src/pageComponents/app/detail/Edit/Agent/hooks/useSkillManager.tsx +++ b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/hooks/useSkillManager.tsx @@ -24,7 +24,12 @@ import { getToolPreviewNode, getTeamAppTemplates } from '@/web/core/app/api/tool'; -import { AppTypeEnum, AppTypeList, ToolTypeList } from '@fastgpt/global/core/app/constants'; +import { + AppFolderTypeList, + AppTypeEnum, + AppTypeList, + ToolTypeList +} from '@fastgpt/global/core/app/constants'; const ConfigToolModal = dynamic(() => import('../../component/ConfigToolModal')); @@ -38,16 +43,18 @@ const isSubApp = (flowNodeType: FlowNodeTypeEnum) => { return !!subAppTypeMap[flowNodeType]; }; -type SelectedToolItemType = AppFormEditFormType['selectedTools'][number]; +export type SelectedToolItemType = AppFormEditFormType['selectedTools'][number]; export const useSkillManager = ({ selectedTools, - setSelectedTools, + onUpdateOrAddTool, + onDeleteTool, canSelectFile, canSelectImg }: { selectedTools: SelectedToolItemType[]; - setSelectedTools: (tools: SelectedToolItemType[]) => void; + onDeleteTool: (id: string) => void; + onUpdateOrAddTool: (tool: SelectedToolItemType) => void; canSelectFile?: boolean; canSelectImg?: boolean; }) => { @@ -66,7 +73,8 @@ export const useSkillManager = ({ parentId: item.parentId, label: item.name, icon: item.avatar, - showArrow: item.isFolder + showArrow: item.isFolder, + canClick: true }; }); }, @@ -83,15 +91,10 @@ export const useSkillManager = ({ [systemTools] ); - /* ===== Team Apps ===== */ - const { data: allTeamApps = [] } = useRequest2( - async () => { - return await getTeamAppTemplates({ parentId: null }); - }, - { - manual: false - } - ); + /* ===== Team agents/tools ===== */ + const { data: allTeamApps = [] } = useRequest2(() => getTeamAppTemplates({ parentId: null }), { + manual: false + }); const myTools = useMemo( () => allTeamApps @@ -100,12 +103,12 @@ export const useSkillManager = ({ id: item.id, label: item.name, icon: item.avatar, - canOpen: item.isFolder ?? false, - canUse: item.appType !== AppTypeEnum.folder && item.appType !== AppTypeEnum.toolFolder + isFolder: item.isFolder ?? false, + canClick: !AppFolderTypeList.includes(item.appType) })), [allTeamApps] ); - const agentApps = useMemo( + const myAgents = useMemo( () => allTeamApps .filter((item) => [AppTypeEnum.folder, ...AppTypeList].includes(item.appType)) @@ -113,8 +116,8 @@ export const useSkillManager = ({ id: item.id, label: item.name, icon: item.avatar, - canOpen: item.isFolder ?? false, - canUse: item.appType !== AppTypeEnum.folder && item.appType !== AppTypeEnum.toolFolder + isFolder: item.isFolder ?? false, + canClick: !AppFolderTypeList.includes(item.appType) })), [allTeamApps] ); @@ -132,16 +135,22 @@ export const useSkillManager = ({ id: item.id, label: item.name, icon: item.avatar, - canOpen: item.isFolder ?? false, - canUse: item.appType !== AppTypeEnum.folder && item.appType !== AppTypeEnum.toolFolder + isFolder: item.isFolder ?? false, + canClick: !AppFolderTypeList.includes(item.appType) }; }); }, []); - /* ===== Workflow tool ===== */ - const { runAsync: onAddAppOrTool } = useRequest2( + const onAddAppOrTool = useCallback( async (appId: string) => { + console.log(appId); const toolTemplate = await getToolPreviewNode({ appId }); + console.log(toolTemplate); + + if (!toolTemplate) { + return; + } + const checkRes = validateToolConfiguration({ toolTemplate, canSelectFile, @@ -171,17 +180,14 @@ export const useSkillManager = ({ }; const hasFormInput = checkNeedsUserConfiguration(tool); - setSelectedTools([ - ...selectedTools, - { - ...tool, - configStatus: hasFormInput ? 'waitingForConfig' : 'active' - } - ]); + onUpdateOrAddTool({ + ...tool, + configStatus: hasFormInput ? 'waitingForConfig' : 'active' + }); return tool.id; }, - { manual: true } + [canSelectFile, canSelectImg, onUpdateOrAddTool, t, toast] ); /* ===== Skill option ===== */ @@ -199,7 +205,8 @@ export const useSkillManager = ({ onClick: onAddAppOrTool, list: data.map((item) => ({ id: item.id, - label: item.label + label: item.label, + canClick: true })) }; }, @@ -215,7 +222,7 @@ export const useSkillManager = ({ } else if (id === 'agent') { return { description: t('app:space_to_expand_folder'), - list: agentApps, + list: myAgents, onFolderLoad: (folderId: string) => onFolderLoadTeamApps(folderId, AppTypeList), onClick: onAddAppOrTool }; @@ -226,21 +233,24 @@ export const useSkillManager = ({ { id: 'systemTool', label: t('app:core.module.template.System Tools'), - icon: 'core/workflow/template/toolCall' + icon: 'core/workflow/template/toolCall', + canClick: false }, { id: 'myTools', label: t('common:navbar.Tools'), - icon: 'core/app/type/pluginFill' + icon: 'core/app/type/pluginFill', + canClick: false }, { id: 'agent', - label: 'Agent', - icon: 'core/workflow/template/runApp' + label: t('app:my_agents'), + icon: 'core/workflow/template/runApp', + canClick: false } ] }; - }, [onAddAppOrTool, onLoadSystemTool, myTools, agentApps, onFolderLoadTeamApps, t]); + }, [onAddAppOrTool, onLoadSystemTool, myTools, myAgents, onFolderLoadTeamApps, t]); /* ===== Selected skills ===== */ const selectedSkills = useMemoEnhance(() => { @@ -279,9 +289,9 @@ export const useSkillManager = ({ const onRemoveSkill = useCallback( (id: string) => { console.log('onRemoveSkill', id); - setSelectedTools(selectedTools.filter((tool) => tool.id !== id)); + onDeleteTool(id); }, - [selectedTools, setSelectedTools] + [onDeleteTool] ); const SkillModal = useCallback(() => { @@ -292,22 +302,16 @@ export const useSkillManager = ({ configTool={configTool} onCloseConfigTool={() => setConfigTool(undefined)} onAddTool={(tool) => - setSelectedTools( - selectedTools.map((t) => - t.id === tool.id - ? { - ...tool, - configStatus: 'active' - } - : t - ) - ) + onUpdateOrAddTool({ + ...tool, + configStatus: 'active' + }) } /> )} ); - }, [configTool, selectedTools, setSelectedTools]); + }, [configTool, onUpdateOrAddTool]); return { skillOption, diff --git a/projects/app/src/pageComponents/app/detail/Edit/Agent/hooks/utils.ts b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/hooks/utils.ts similarity index 100% rename from projects/app/src/pageComponents/app/detail/Edit/Agent/hooks/utils.ts rename to projects/app/src/pageComponents/app/detail/Edit/ChatAgent/hooks/utils.ts diff --git a/projects/app/src/pageComponents/app/detail/Edit/Agent/index.tsx b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/index.tsx similarity index 100% rename from projects/app/src/pageComponents/app/detail/Edit/Agent/index.tsx rename to projects/app/src/pageComponents/app/detail/Edit/ChatAgent/index.tsx diff --git a/projects/app/src/pageComponents/app/detail/Edit/Agent/utils.ts b/projects/app/src/pageComponents/app/detail/Edit/ChatAgent/utils.ts similarity index 100% rename from projects/app/src/pageComponents/app/detail/Edit/Agent/utils.ts rename to projects/app/src/pageComponents/app/detail/Edit/ChatAgent/utils.ts diff --git a/projects/app/src/pageComponents/app/detail/Edit/FormComponent/type.d.ts b/projects/app/src/pageComponents/app/detail/Edit/FormComponent/type.d.ts index 27ef4089a..9c62bbe34 100644 --- a/projects/app/src/pageComponents/app/detail/Edit/FormComponent/type.d.ts +++ b/projects/app/src/pageComponents/app/detail/Edit/FormComponent/type.d.ts @@ -1,5 +1,5 @@ import type { AppChatConfigType, AppFormEditFormType } from '@fastgpt/global/core/app/type'; -import type { WorkflowType } from '../Agent/utils'; +import type { WorkflowType } from '../ChatAgent/utils'; import type { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/node'; export type AppForm2WorkflowFnType = ({ diff --git a/projects/app/src/pageComponents/chat/ChatTeamApp/TypeTag.tsx b/projects/app/src/pageComponents/chat/ChatTeamApp/TypeTag.tsx index 939e60ea2..07807ec85 100644 --- a/projects/app/src/pageComponents/chat/ChatTeamApp/TypeTag.tsx +++ b/projects/app/src/pageComponents/chat/ChatTeamApp/TypeTag.tsx @@ -8,7 +8,7 @@ const AppTypeTag = ({ type }: { type: AppTypeEnum }) => { const { t } = useTranslation(); const map = useRef({ - [AppTypeEnum.agent]: { + [AppTypeEnum.chatAgent]: { label: 'Agent', icon: 'core/app/type/simple', bg: '#DBF3FF', diff --git a/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx b/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx index d9ff25ef2..44fe0f132 100644 --- a/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx +++ b/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx @@ -36,7 +36,7 @@ const MyApps = () => { const map = useMemo( () => ({ all: t('common:core.module.template.all_team_app'), - [AppTypeEnum.agent]: 'Agent', + [AppTypeEnum.chatAgent]: 'Agent', [AppTypeEnum.simple]: t('app:type.Chat_Agent'), [AppTypeEnum.workflow]: t('app:type.Workflow bot'), [AppTypeEnum.workflowTool]: t('app:toolType_workflow'), diff --git a/projects/app/src/pageComponents/dashboard/agent/List.tsx b/projects/app/src/pageComponents/dashboard/agent/List.tsx index 7d7263e3a..0e7ba6d0a 100644 --- a/projects/app/src/pageComponents/dashboard/agent/List.tsx +++ b/projects/app/src/pageComponents/dashboard/agent/List.tsx @@ -303,7 +303,11 @@ const List = () => { /> } menuList={[ - ...([AppTypeEnum.simple, AppTypeEnum.workflow].includes(app.type) + ...([ + AppTypeEnum.simple, + AppTypeEnum.workflow, + AppTypeEnum.chatAgent + ].includes(app.type) ? [ { children: [ diff --git a/projects/app/src/pageComponents/dashboard/agent/context.tsx b/projects/app/src/pageComponents/dashboard/agent/context.tsx index 7617730d2..2749eb57f 100644 --- a/projects/app/src/pageComponents/dashboard/agent/context.tsx +++ b/projects/app/src/pageComponents/dashboard/agent/context.tsx @@ -87,7 +87,7 @@ const AppListContextProvider = ({ children }: { children: ReactNode }) => { // agent page if (router.pathname.includes('/agent')) { return !type || type === 'all' - ? [AppTypeEnum.folder, AppTypeEnum.simple, AppTypeEnum.workflow, AppTypeEnum.agent] + ? [AppTypeEnum.folder, AppTypeEnum.simple, AppTypeEnum.workflow, AppTypeEnum.chatAgent] : [AppTypeEnum.folder, type]; } diff --git a/projects/app/src/pageComponents/dashboard/constant.ts b/projects/app/src/pageComponents/dashboard/constant.ts index 6bcee9b86..685efbc06 100644 --- a/projects/app/src/pageComponents/dashboard/constant.ts +++ b/projects/app/src/pageComponents/dashboard/constant.ts @@ -2,9 +2,9 @@ import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { i18nT } from '@fastgpt/web/i18n/utils'; export const appTypeTagMap = { - [AppTypeEnum.agent]: { - label: 'Agent', - icon: 'core/app/type/mcpTools' + [AppTypeEnum.chatAgent]: { + label: i18nT('app:type.Chat_Agent_v2'), + icon: 'core/app/type/simple' }, [AppTypeEnum.simple]: { label: i18nT('app:type.Chat_Agent'), diff --git a/projects/app/src/pages/app/detail/index.tsx b/projects/app/src/pages/app/detail/index.tsx index 08ad49953..d0e37dfe2 100644 --- a/projects/app/src/pages/app/detail/index.tsx +++ b/projects/app/src/pages/app/detail/index.tsx @@ -15,7 +15,7 @@ const SimpleEdit = dynamic(() => import('@/pageComponents/app/detail/Edit/Simple ssr: false, loading: () => }); -const AgentEdit = dynamic(() => import('@/pageComponents/app/detail/Edit/Agent'), { +const AgentEdit = dynamic(() => import('@/pageComponents/app/detail/Edit/ChatAgent'), { ssr: false, loading: () => }); @@ -61,7 +61,7 @@ const AppDetail = () => { ) : ( <> {appDetail.type === AppTypeEnum.simple && } - {appDetail.type === AppTypeEnum.agent && } + {appDetail.type === AppTypeEnum.chatAgent && } {appDetail.type === AppTypeEnum.workflow && } {appDetail.type === AppTypeEnum.workflowTool && } {appDetail.type === AppTypeEnum.mcpToolSet && } diff --git a/projects/app/src/pages/dashboard/create/index.tsx b/projects/app/src/pages/dashboard/create/index.tsx index ddf328574..452d7a8b9 100644 --- a/projects/app/src/pages/dashboard/create/index.tsx +++ b/projects/app/src/pages/dashboard/create/index.tsx @@ -57,7 +57,7 @@ type FormType = { }; export type CreateAppType = - | AppTypeEnum.agent + | AppTypeEnum.chatAgent | AppTypeEnum.simple | AppTypeEnum.workflow | AppTypeEnum.workflowTool @@ -72,7 +72,7 @@ const CreateAppsPage = () => { const { parentId, appType } = query; const [selectedAppType, setSelectedAppType] = useState( - (appType as CreateAppType) || AppTypeEnum.workflow + (appType as CreateAppType) || AppTypeEnum.chatAgent ); const [creatingTemplateId, setCreatingTemplateId] = useState(null); const isToolType = ToolTypeList.includes(selectedAppType); diff --git a/projects/app/src/web/core/app/templates.ts b/projects/app/src/web/core/app/templates.ts index dba1cc14e..476a40360 100644 --- a/projects/app/src/web/core/app/templates.ts +++ b/projects/app/src/web/core/app/templates.ts @@ -15,7 +15,7 @@ import { i18nT } from '@fastgpt/web/i18n/utils'; // TODO: 需要做一个类型强制约束 export const emptyTemplates = { - [AppTypeEnum.agent]: { + [AppTypeEnum.chatAgent]: { avatar: 'core/app/type/simpleFill', name: 'Agent', nodes: [],