mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-21 11:43:56 +00:00
perf: mcp tool type (#4820)
This commit is contained in:
@@ -5,7 +5,7 @@ import {
|
|||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../workflow/node/constant';
|
} from '../../workflow/node/constant';
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
import { type ToolType } from '../type';
|
import { type McpToolConfigType } from '../type';
|
||||||
import { i18nT } from '../../../../web/i18n/utils';
|
import { i18nT } from '../../../../web/i18n/utils';
|
||||||
import { type RuntimeNodeItemType } from '../../workflow/runtime/type';
|
import { type RuntimeNodeItemType } from '../../workflow/runtime/type';
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ export const getMCPToolSetRuntimeNode = ({
|
|||||||
avatar
|
avatar
|
||||||
}: {
|
}: {
|
||||||
url: string;
|
url: string;
|
||||||
toolList: ToolType[];
|
toolList: McpToolConfigType[];
|
||||||
name?: string;
|
name?: string;
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
}): RuntimeNodeItemType => {
|
}): RuntimeNodeItemType => {
|
||||||
@@ -45,7 +45,7 @@ export const getMCPToolRuntimeNode = ({
|
|||||||
url,
|
url,
|
||||||
avatar = 'core/app/type/mcpToolsFill'
|
avatar = 'core/app/type/mcpToolsFill'
|
||||||
}: {
|
}: {
|
||||||
tool: ToolType;
|
tool: McpToolConfigType;
|
||||||
url: string;
|
url: string;
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
}): RuntimeNodeItemType => {
|
}): RuntimeNodeItemType => {
|
||||||
@@ -65,7 +65,7 @@ export const getMCPToolRuntimeNode = ({
|
|||||||
...Object.entries(tool.inputSchema?.properties || {}).map(([key, value]) => ({
|
...Object.entries(tool.inputSchema?.properties || {}).map(([key, value]) => ({
|
||||||
key,
|
key,
|
||||||
label: key,
|
label: key,
|
||||||
valueType: value.type as WorkflowIOValueTypeEnum,
|
valueType: value.type as WorkflowIOValueTypeEnum, // TODO: 这里需要做一个映射
|
||||||
description: value.description,
|
description: value.description,
|
||||||
toolDescription: value.description || key,
|
toolDescription: value.description || key,
|
||||||
required: tool.inputSchema?.required?.includes(key) || false,
|
required: tool.inputSchema?.required?.includes(key) || false,
|
||||||
|
20
packages/global/core/app/type.d.ts
vendored
20
packages/global/core/app/type.d.ts
vendored
@@ -16,16 +16,6 @@ import { FlowNodeInputTypeEnum } from '../../core/workflow/node/constant';
|
|||||||
import type { WorkflowTemplateBasicType } from '@fastgpt/global/core/workflow/type';
|
import type { WorkflowTemplateBasicType } from '@fastgpt/global/core/workflow/type';
|
||||||
import type { SourceMemberType } from '../../support/user/type';
|
import type { SourceMemberType } from '../../support/user/type';
|
||||||
|
|
||||||
export type ToolType = {
|
|
||||||
name: string;
|
|
||||||
description: string;
|
|
||||||
inputSchema: {
|
|
||||||
type: string;
|
|
||||||
properties?: Record<string, { type: string; description?: string }>;
|
|
||||||
required?: string[];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export type AppSchema = {
|
export type AppSchema = {
|
||||||
_id: string;
|
_id: string;
|
||||||
parentId?: ParentIdType;
|
parentId?: ParentIdType;
|
||||||
@@ -117,6 +107,16 @@ export type AppSimpleEditFormType = {
|
|||||||
chatConfig: AppChatConfigType;
|
chatConfig: AppChatConfigType;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type McpToolConfigType = {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
inputSchema: {
|
||||||
|
type: string;
|
||||||
|
properties?: Record<string, { type: string; description?: string }>;
|
||||||
|
required?: string[];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/* app chat config type */
|
/* app chat config type */
|
||||||
export type AppChatConfigType = {
|
export type AppChatConfigType = {
|
||||||
welcomeText?: string;
|
welcomeText?: string;
|
||||||
|
@@ -7,7 +7,7 @@ import type {
|
|||||||
} from '../../chat/type';
|
} from '../../chat/type';
|
||||||
import { NodeOutputItemType } from '../../chat/type';
|
import { NodeOutputItemType } from '../../chat/type';
|
||||||
import type { FlowNodeInputItemType, FlowNodeOutputItemType } from '../type/io.d';
|
import type { FlowNodeInputItemType, FlowNodeOutputItemType } from '../type/io.d';
|
||||||
import type { StoreNodeItemType } from '../type/node';
|
import type { NodeToolConfigType, StoreNodeItemType } from '../type/node';
|
||||||
import type { DispatchNodeResponseKeyEnum } from './constants';
|
import type { DispatchNodeResponseKeyEnum } from './constants';
|
||||||
import type { StoreEdgeItemType } from '../type/edge';
|
import type { StoreEdgeItemType } from '../type/edge';
|
||||||
import type { NodeInputKeyEnum } from '../constants';
|
import type { NodeInputKeyEnum } from '../constants';
|
||||||
@@ -102,6 +102,9 @@ export type RuntimeNodeItemType = {
|
|||||||
|
|
||||||
pluginId?: string; // workflow id / plugin id
|
pluginId?: string; // workflow id / plugin id
|
||||||
version?: string;
|
version?: string;
|
||||||
|
|
||||||
|
// tool
|
||||||
|
toolConfig?: NodeToolConfigType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type RuntimeEdgeItemType = StoreEdgeItemType & {
|
export type RuntimeEdgeItemType = StoreEdgeItemType & {
|
||||||
@@ -114,7 +117,7 @@ export type DispatchNodeResponseType = {
|
|||||||
runningTime?: number;
|
runningTime?: number;
|
||||||
query?: string;
|
query?: string;
|
||||||
textOutput?: string;
|
textOutput?: string;
|
||||||
error?: Record<string, any>;
|
error?: Record<string, any> | string;
|
||||||
customInputs?: Record<string, any>;
|
customInputs?: Record<string, any>;
|
||||||
customOutputs?: Record<string, any>;
|
customOutputs?: Record<string, any>;
|
||||||
nodeInputs?: Record<string, any>;
|
nodeInputs?: Record<string, any>;
|
||||||
|
14
packages/global/core/workflow/type/node.d.ts
vendored
14
packages/global/core/workflow/type/node.d.ts
vendored
@@ -20,11 +20,17 @@ import { RuntimeNodeItemType } from '../runtime/type';
|
|||||||
import { PluginTypeEnum } from '../../plugin/constants';
|
import { PluginTypeEnum } from '../../plugin/constants';
|
||||||
import { RuntimeEdgeItemType, StoreEdgeItemType } from './edge';
|
import { RuntimeEdgeItemType, StoreEdgeItemType } from './edge';
|
||||||
import { NextApiResponse } from 'next';
|
import { NextApiResponse } from 'next';
|
||||||
import { AppDetailType, AppSchema } from '../../app/type';
|
import type { AppDetailType, AppSchema, McpToolConfigType } from '../../app/type';
|
||||||
import type { ParentIdType } from 'common/parentFolder/type';
|
import type { ParentIdType } from 'common/parentFolder/type';
|
||||||
import { AppTypeEnum } from 'core/app/constants';
|
import { AppTypeEnum } from '../../app/constants';
|
||||||
import type { WorkflowInteractiveResponseType } from '../template/system/interactive/type';
|
import type { WorkflowInteractiveResponseType } from '../template/system/interactive/type';
|
||||||
|
|
||||||
|
export type NodeToolConfigType = {
|
||||||
|
mcpTool?: McpToolConfigType & {
|
||||||
|
url: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export type FlowNodeCommonType = {
|
export type FlowNodeCommonType = {
|
||||||
parentNodeId?: string;
|
parentNodeId?: string;
|
||||||
flowNodeType: FlowNodeTypeEnum; // render node card
|
flowNodeType: FlowNodeTypeEnum; // render node card
|
||||||
@@ -46,8 +52,10 @@ export type FlowNodeCommonType = {
|
|||||||
// plugin data
|
// plugin data
|
||||||
pluginId?: string;
|
pluginId?: string;
|
||||||
isFolder?: boolean;
|
isFolder?: boolean;
|
||||||
// pluginType?: AppTypeEnum;
|
|
||||||
pluginData?: PluginDataType;
|
pluginData?: PluginDataType;
|
||||||
|
|
||||||
|
// tool data
|
||||||
|
toolData?: NodeToolConfigType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type PluginDataType = {
|
export type PluginDataType = {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
||||||
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
||||||
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { addLog } from '../../common/system/log';
|
import { addLog } from '../../common/system/log';
|
||||||
import { retryFn } from '@fastgpt/global/common/system/utils';
|
import { retryFn } from '@fastgpt/global/common/system/utils';
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ export class MCPClient {
|
|||||||
* Get available tools list
|
* Get available tools list
|
||||||
* @returns List of tools
|
* @returns List of tools
|
||||||
*/
|
*/
|
||||||
public async getTools(): Promise<ToolType[]> {
|
public async getTools(): Promise<McpToolConfigType[]> {
|
||||||
try {
|
try {
|
||||||
const client = await this.getConnection();
|
const client = await this.getConnection();
|
||||||
const response = await client.listTools();
|
const response = await client.listTools();
|
||||||
|
@@ -553,7 +553,7 @@ const ChatBox = ({
|
|||||||
const responseData = mergeChatResponseData(item.responseData || []);
|
const responseData = mergeChatResponseData(item.responseData || []);
|
||||||
if (responseData[responseData.length - 1]?.error) {
|
if (responseData[responseData.length - 1]?.error) {
|
||||||
toast({
|
toast({
|
||||||
title: t(responseData[responseData.length - 1].error?.message),
|
title: t(getErrText(responseData[responseData.length - 1].error)),
|
||||||
status: 'error'
|
status: 'error'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,7 @@ import { ChatRecordContext } from '@/web/core/chat/context/chatRecordContext';
|
|||||||
import { type AppFileSelectConfigType } from '@fastgpt/global/core/app/type';
|
import { type AppFileSelectConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { defaultAppSelectFileConfig } from '@fastgpt/global/core/app/constants';
|
import { defaultAppSelectFileConfig } from '@fastgpt/global/core/app/constants';
|
||||||
import { mergeChatResponseData } from '@fastgpt/global/core/chat/utils';
|
import { mergeChatResponseData } from '@fastgpt/global/core/chat/utils';
|
||||||
|
import { getErrText } from '@fastgpt/global/common/error/utils';
|
||||||
|
|
||||||
type PluginRunContextType = PluginRunBoxProps & {
|
type PluginRunContextType = PluginRunBoxProps & {
|
||||||
isChatting: boolean;
|
isChatting: boolean;
|
||||||
@@ -258,7 +259,7 @@ const PluginRunContextProvider = ({
|
|||||||
const responseData = mergeChatResponseData(item.responseData || []);
|
const responseData = mergeChatResponseData(item.responseData || []);
|
||||||
if (responseData[responseData.length - 1]?.error) {
|
if (responseData[responseData.length - 1]?.error) {
|
||||||
toast({
|
toast({
|
||||||
title: t(responseData[responseData.length - 1].error?.message),
|
title: t(getErrText(responseData[responseData.length - 1].error)),
|
||||||
status: 'error'
|
status: 'error'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ import ChatRecordContextProvider from '@/web/core/chat/context/chatRecordContext
|
|||||||
import { Box, Button, Flex, Switch, Textarea } from '@chakra-ui/react';
|
import { Box, Button, Flex, Switch, Textarea } from '@chakra-ui/react';
|
||||||
import { cardStyles } from '../constants';
|
import { cardStyles } from '../constants';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
|
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
|
||||||
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
|
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
|
||||||
import { Controller, useForm } from 'react-hook-form';
|
import { Controller, useForm } from 'react-hook-form';
|
||||||
@@ -19,7 +19,7 @@ import { postRunMCPTool } from '@/web/core/app/api/plugin';
|
|||||||
|
|
||||||
const JsonEditor = dynamic(() => import('@fastgpt/web/components/common/Textarea/JsonEditor'));
|
const JsonEditor = dynamic(() => import('@fastgpt/web/components/common/Textarea/JsonEditor'));
|
||||||
|
|
||||||
const ChatTest = ({ currentTool, url }: { currentTool: ToolType | null; url: string }) => {
|
const ChatTest = ({ currentTool, url }: { currentTool: McpToolConfigType | null; url: string }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const [output, setOutput] = useState<string>('');
|
const [output, setOutput] = useState<string>('');
|
||||||
@@ -135,7 +135,7 @@ const ChatTest = ({ currentTool, url }: { currentTool: ToolType | null; url: str
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const Render = ({ currentTool, url }: { currentTool: ToolType | null; url: string }) => {
|
const Render = ({ currentTool, url }: { currentTool: McpToolConfigType | null; url: string }) => {
|
||||||
const { chatId } = useChatStore();
|
const { chatId } = useChatStore();
|
||||||
const { appDetail } = useContextSelector(AppContext, (v) => v);
|
const { appDetail } = useContextSelector(AppContext, (v) => v);
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ const RenderToolInput = ({
|
|||||||
type: string;
|
type: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
};
|
};
|
||||||
toolData: ToolType | null;
|
toolData: McpToolConfigType | null;
|
||||||
value: any;
|
value: any;
|
||||||
onChange: (value: any) => void;
|
onChange: (value: any) => void;
|
||||||
isInvalid: boolean;
|
isInvalid: boolean;
|
||||||
|
@@ -7,7 +7,7 @@ import AppCard from './AppCard';
|
|||||||
import ChatTest from './ChatTest';
|
import ChatTest from './ChatTest';
|
||||||
import MyBox from '@fastgpt/web/components/common/MyBox';
|
import MyBox from '@fastgpt/web/components/common/MyBox';
|
||||||
import EditForm from './EditForm';
|
import EditForm from './EditForm';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
|
|
||||||
const Edit = ({
|
const Edit = ({
|
||||||
url,
|
url,
|
||||||
@@ -19,10 +19,10 @@ const Edit = ({
|
|||||||
}: {
|
}: {
|
||||||
url: string;
|
url: string;
|
||||||
setUrl: (url: string) => void;
|
setUrl: (url: string) => void;
|
||||||
toolList: ToolType[];
|
toolList: McpToolConfigType[];
|
||||||
setToolList: (toolList: ToolType[]) => void;
|
setToolList: (toolList: McpToolConfigType[]) => void;
|
||||||
currentTool: ToolType | null;
|
currentTool: McpToolConfigType | null;
|
||||||
setCurrentTool: (tool: ToolType) => void;
|
setCurrentTool: (tool: McpToolConfigType) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const { isPc } = useSystem();
|
const { isPc } = useSystem();
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@ import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
|||||||
import { AppContext } from '../context';
|
import { AppContext } from '../context';
|
||||||
import { useContextSelector } from 'use-context-selector';
|
import { useContextSelector } from 'use-context-selector';
|
||||||
import MyIconButton from '@fastgpt/web/components/common/Icon/button';
|
import MyIconButton from '@fastgpt/web/components/common/Icon/button';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import MyModal from '@fastgpt/web/components/common/MyModal';
|
import MyModal from '@fastgpt/web/components/common/MyModal';
|
||||||
import Avatar from '@fastgpt/web/components/common/Avatar';
|
import Avatar from '@fastgpt/web/components/common/Avatar';
|
||||||
import MyBox from '@fastgpt/web/components/common/MyBox';
|
import MyBox from '@fastgpt/web/components/common/MyBox';
|
||||||
@@ -24,14 +24,14 @@ const EditForm = ({
|
|||||||
}: {
|
}: {
|
||||||
url: string;
|
url: string;
|
||||||
setUrl: (url: string) => void;
|
setUrl: (url: string) => void;
|
||||||
toolList: ToolType[];
|
toolList: McpToolConfigType[];
|
||||||
setToolList: (toolList: ToolType[]) => void;
|
setToolList: (toolList: McpToolConfigType[]) => void;
|
||||||
currentTool: ToolType | null;
|
currentTool: McpToolConfigType | null;
|
||||||
setCurrentTool: (tool: ToolType) => void;
|
setCurrentTool: (tool: McpToolConfigType) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const [toolDetail, setToolDetail] = useState<ToolType | null>(null);
|
const [toolDetail, setToolDetail] = useState<McpToolConfigType | null>(null);
|
||||||
|
|
||||||
const { runAsync: runGetMCPTools, loading: isGettingTools } = useRequest2(
|
const { runAsync: runGetMCPTools, loading: isGettingTools } = useRequest2(
|
||||||
async (data: getMCPToolsBody) => await getMCPTools(data),
|
async (data: getMCPToolsBody) => await getMCPTools(data),
|
||||||
@@ -180,7 +180,7 @@ const EditForm = ({
|
|||||||
|
|
||||||
export default React.memo(EditForm);
|
export default React.memo(EditForm);
|
||||||
|
|
||||||
const ToolDetailModal = ({ tool, onClose }: { tool: ToolType; onClose: () => void }) => {
|
const ToolDetailModal = ({ tool, onClose }: { tool: McpToolConfigType; onClose: () => void }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const appDetail = useContextSelector(AppContext, (v) => v.appDetail);
|
const appDetail = useContextSelector(AppContext, (v) => v.appDetail);
|
||||||
|
|
||||||
|
@@ -8,10 +8,10 @@ import { getAppFolderPath } from '@/web/core/app/api/app';
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { postUpdateMCPTools } from '@/web/core/app/api/plugin';
|
import { postUpdateMCPTools } from '@/web/core/app/api/plugin';
|
||||||
|
|
||||||
const Header = ({ url, toolList }: { url: string; toolList: ToolType[] }) => {
|
const Header = ({ url, toolList }: { url: string; toolList: McpToolConfigType[] }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const appId = useContextSelector(AppContext, (v) => v.appId);
|
const appId = useContextSelector(AppContext, (v) => v.appId);
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
@@ -5,7 +5,7 @@ import Edit from './Edit';
|
|||||||
import { useContextSelector } from 'use-context-selector';
|
import { useContextSelector } from 'use-context-selector';
|
||||||
import { AppContext } from '../context';
|
import { AppContext } from '../context';
|
||||||
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
|
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { type MCPToolSetData } from '@/pageComponents/dashboard/apps/MCPToolsEditModal';
|
import { type MCPToolSetData } from '@/pageComponents/dashboard/apps/MCPToolsEditModal';
|
||||||
|
|
||||||
const MCPTools = () => {
|
const MCPTools = () => {
|
||||||
@@ -18,8 +18,10 @@ const MCPTools = () => {
|
|||||||
}, [appDetail.modules]);
|
}, [appDetail.modules]);
|
||||||
|
|
||||||
const [url, setUrl] = useState(toolSetData?.url || '');
|
const [url, setUrl] = useState(toolSetData?.url || '');
|
||||||
const [toolList, setToolList] = useState<ToolType[]>(toolSetData?.toolList || []);
|
const [toolList, setToolList] = useState<McpToolConfigType[]>(toolSetData?.toolList || []);
|
||||||
const [currentTool, setCurrentTool] = useState<ToolType | null>(toolSetData?.toolList[0] || null);
|
const [currentTool, setCurrentTool] = useState<McpToolConfigType | null>(
|
||||||
|
toolSetData?.toolList[0] || null
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex h={'100%'} flexDirection={'column'} px={[3, 0]} pr={[3, 3]}>
|
<Flex h={'100%'} flexDirection={'column'} px={[3, 0]} pr={[3, 3]}>
|
||||||
|
@@ -5,14 +5,15 @@ import NodeCard from './render/NodeCard';
|
|||||||
import IOTitle from '../components/IOTitle';
|
import IOTitle from '../components/IOTitle';
|
||||||
import Container from '../components/Container';
|
import Container from '../components/Container';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { Box, Flex } from '@chakra-ui/react';
|
import { Box, Flex } from '@chakra-ui/react';
|
||||||
|
|
||||||
const NodeToolSet = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
|
const NodeToolSet = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { inputs } = data;
|
const { inputs } = data;
|
||||||
const toolList: ToolType[] = inputs.find((item) => item.key === 'toolSetData')?.value?.toolList;
|
const toolList: McpToolConfigType[] = inputs.find((item) => item.key === 'toolSetData')?.value
|
||||||
|
?.toolList;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<NodeCard minW={'350px'} selected={selected} {...data}>
|
<NodeCard minW={'350px'} selected={selected} {...data}>
|
||||||
|
@@ -20,17 +20,16 @@ import Avatar from '@fastgpt/web/components/common/Avatar';
|
|||||||
import MyModal from '@fastgpt/web/components/common/MyModal';
|
import MyModal from '@fastgpt/web/components/common/MyModal';
|
||||||
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
|
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
|
||||||
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
||||||
import { useToast } from '@fastgpt/web/hooks/useToast';
|
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { AppListContext } from './context';
|
import { AppListContext } from './context';
|
||||||
import { useContextSelector } from 'use-context-selector';
|
import { useContextSelector } from 'use-context-selector';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import type { getMCPToolsBody } from '@/pages/api/support/mcp/client/getTools';
|
import type { getMCPToolsBody } from '@/pages/api/support/mcp/client/getTools';
|
||||||
|
|
||||||
export type MCPToolSetData = {
|
export type MCPToolSetData = {
|
||||||
url: string;
|
url: string;
|
||||||
toolList: ToolType[];
|
toolList: McpToolConfigType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type EditMCPToolsProps = {
|
export type EditMCPToolsProps = {
|
||||||
@@ -41,7 +40,6 @@ export type EditMCPToolsProps = {
|
|||||||
|
|
||||||
const MCPToolsEditModal = ({ onClose }: { onClose: () => void }) => {
|
const MCPToolsEditModal = ({ onClose }: { onClose: () => void }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { toast } = useToast();
|
|
||||||
|
|
||||||
const { parentId, loadMyApps } = useContextSelector(AppListContext, (v) => v);
|
const { parentId, loadMyApps } = useContextSelector(AppListContext, (v) => v);
|
||||||
|
|
||||||
@@ -81,7 +79,7 @@ const MCPToolsEditModal = ({ onClose }: { onClose: () => void }) => {
|
|||||||
const { runAsync: runGetMCPTools, loading: isGettingTools } = useRequest2(
|
const { runAsync: runGetMCPTools, loading: isGettingTools } = useRequest2(
|
||||||
(data: getMCPToolsBody) => getMCPTools(data),
|
(data: getMCPToolsBody) => getMCPTools(data),
|
||||||
{
|
{
|
||||||
onSuccess: (res: ToolType[]) => {
|
onSuccess: (res: McpToolConfigType[]) => {
|
||||||
setValue('mcpData.toolList', res);
|
setValue('mcpData.toolList', res);
|
||||||
},
|
},
|
||||||
errorToast: t('app:MCP_tools_parse_failed')
|
errorToast: t('app:MCP_tools_parse_failed')
|
||||||
|
@@ -4,7 +4,7 @@ import { TeamAppCreatePermissionVal } from '@fastgpt/global/support/permission/u
|
|||||||
import { authApp } from '@fastgpt/service/support/permission/app/auth';
|
import { authApp } from '@fastgpt/service/support/permission/app/auth';
|
||||||
import { authUserPer } from '@fastgpt/service/support/permission/user/auth';
|
import { authUserPer } from '@fastgpt/service/support/permission/user/auth';
|
||||||
import { type CreateAppBody, onCreateApp } from '../create';
|
import { type CreateAppBody, onCreateApp } from '../create';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun';
|
import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun';
|
||||||
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';
|
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';
|
||||||
import {
|
import {
|
||||||
@@ -22,7 +22,7 @@ export type createMCPToolsBody = Omit<
|
|||||||
'type' | 'modules' | 'edges' | 'chatConfig'
|
'type' | 'modules' | 'edges' | 'chatConfig'
|
||||||
> & {
|
> & {
|
||||||
url: string;
|
url: string;
|
||||||
toolList: ToolType[];
|
toolList: McpToolConfigType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type createMCPToolsResponse = {};
|
export type createMCPToolsResponse = {};
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
||||||
import { NextAPI } from '@/service/middleware/entry';
|
import { NextAPI } from '@/service/middleware/entry';
|
||||||
import { type AppDetailType, type ToolType } from '@fastgpt/global/core/app/type';
|
import { type AppDetailType, type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import { authApp } from '@fastgpt/service/support/permission/app/auth';
|
import { authApp } from '@fastgpt/service/support/permission/app/auth';
|
||||||
import { ManagePermissionVal } from '@fastgpt/global/support/permission/constant';
|
import { ManagePermissionVal } from '@fastgpt/global/support/permission/constant';
|
||||||
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
|
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
|
||||||
@@ -24,7 +24,7 @@ export type updateMCPToolsQuery = {};
|
|||||||
export type updateMCPToolsBody = {
|
export type updateMCPToolsBody = {
|
||||||
appId: string;
|
appId: string;
|
||||||
url: string;
|
url: string;
|
||||||
toolList: ToolType[];
|
toolList: McpToolConfigType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type updateMCPToolsResponse = {};
|
export type updateMCPToolsResponse = {};
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { NextAPI } from '@/service/middleware/entry';
|
import { NextAPI } from '@/service/middleware/entry';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
||||||
import { MCPClient } from '@fastgpt/service/core/app/mcp';
|
import { MCPClient } from '@fastgpt/service/core/app/mcp';
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ export type getMCPToolsQuery = {};
|
|||||||
|
|
||||||
export type getMCPToolsBody = { url: string };
|
export type getMCPToolsBody = { url: string };
|
||||||
|
|
||||||
export type getMCPToolsResponse = ToolType[];
|
export type getMCPToolsResponse = McpToolConfigType[];
|
||||||
|
|
||||||
async function handler(
|
async function handler(
|
||||||
req: ApiRequestProps<getMCPToolsBody, getMCPToolsQuery>,
|
req: ApiRequestProps<getMCPToolsBody, getMCPToolsQuery>,
|
||||||
|
@@ -262,7 +262,7 @@ const MyApps = ({ MenuIcon }: { MenuIcon: JSX.Element }) => {
|
|||||||
|
|
||||||
{/* Folder slider */}
|
{/* Folder slider */}
|
||||||
{!!folderDetail && isPc && (
|
{!!folderDetail && isPc && (
|
||||||
<Box pt={[4, 6]} pr={[4, 6]}>
|
<Box pt={[4, 6]} pr={[4, 6]} h={'100%'} pb={4} overflow={'auto'}>
|
||||||
<FolderSlideCard
|
<FolderSlideCard
|
||||||
refetchResource={() => Promise.all([refetchFolderDetail(), loadMyApps()])}
|
refetchResource={() => Promise.all([refetchFolderDetail(), loadMyApps()])}
|
||||||
resumeInheritPermission={() => resumeInheritPer(folderDetail._id)}
|
resumeInheritPermission={() => resumeInheritPer(folderDetail._id)}
|
||||||
|
@@ -223,7 +223,7 @@ const Dataset = () => {
|
|||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
{!!folderDetail && isPc && (
|
{!!folderDetail && isPc && (
|
||||||
<Box ml="6">
|
<Box ml="6" h={'100%'} pb={4} overflow={'auto'}>
|
||||||
<FolderSlideCard
|
<FolderSlideCard
|
||||||
resumeInheritPermission={() => resumeInheritPer(folderDetail._id)}
|
resumeInheritPermission={() => resumeInheritPer(folderDetail._id)}
|
||||||
isInheritPermission={folderDetail.inheritPermission}
|
isInheritPermission={folderDetail.inheritPermission}
|
||||||
|
@@ -20,7 +20,7 @@ import type { PluginGroupSchemaType } from '@fastgpt/service/core/app/plugin/typ
|
|||||||
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
import { defaultGroup } from '@fastgpt/web/core/workflow/constants';
|
import { defaultGroup } from '@fastgpt/web/core/workflow/constants';
|
||||||
import type { createMCPToolsBody } from '@/pages/api/core/app/mcpTools/create';
|
import type { createMCPToolsBody } from '@/pages/api/core/app/mcpTools/create';
|
||||||
import { type ToolType } from '@fastgpt/global/core/app/type';
|
import { type McpToolConfigType } from '@fastgpt/global/core/app/type';
|
||||||
import type { updateMCPToolsBody } from '@/pages/api/core/app/mcpTools/update';
|
import type { updateMCPToolsBody } from '@/pages/api/core/app/mcpTools/update';
|
||||||
import type { RunMCPToolBody } from '@/pages/api/support/mcp/client/runTool';
|
import type { RunMCPToolBody } from '@/pages/api/support/mcp/client/runTool';
|
||||||
import type { getMCPToolsBody } from '@/pages/api/support/mcp/client/getTools';
|
import type { getMCPToolsBody } from '@/pages/api/support/mcp/client/getTools';
|
||||||
@@ -79,7 +79,7 @@ export const postUpdateMCPTools = (data: updateMCPToolsBody) =>
|
|||||||
POST('/core/app/mcpTools/update', data);
|
POST('/core/app/mcpTools/update', data);
|
||||||
|
|
||||||
export const getMCPTools = (data: getMCPToolsBody) =>
|
export const getMCPTools = (data: getMCPToolsBody) =>
|
||||||
POST<ToolType[]>('/support/mcp/client/getTools', data);
|
POST<McpToolConfigType[]>('/support/mcp/client/getTools', data);
|
||||||
|
|
||||||
export const postRunMCPTool = (data: RunMCPToolBody) => POST('/support/mcp/client/runTool', data);
|
export const postRunMCPTool = (data: RunMCPToolBody) => POST('/support/mcp/client/runTool', data);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user