From 8131e65e9e34897603718b44d66b58db0d1ddea4 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Mon, 28 Jul 2025 22:56:52 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=20tool=E6=94=AF=E6=8C=81=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=90=AF=E7=94=A8=EF=BC=8C=E6=9B=B4=E4=BA=BA=E6=80=A7=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E7=9B=B4=E6=8E=A5=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- src/plugin_system/base/base_tool.py | 26 +++++++++++++++++++- src/plugin_system/core/component_registry.py | 8 ++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 4db85eab8..c26f8d2c9 100644 --- a/.gitignore +++ b/.gitignore @@ -321,4 +321,5 @@ run_pet.bat config.toml -interested_rates.txt \ No newline at end of file +interested_rates.txt +MaiBot.code-workspace diff --git a/src/plugin_system/base/base_tool.py b/src/plugin_system/base/base_tool.py index b2f219629..2936bcbc6 100644 --- a/src/plugin_system/base/base_tool.py +++ b/src/plugin_system/base/base_tool.py @@ -19,6 +19,8 @@ class BaseTool: parameters = None # 是否可供LLM使用,默认为False available_for_llm = False + # 是否启用该工具 + enabled = True @classmethod def get_tool_definition(cls) -> dict[str, Any]: @@ -43,6 +45,7 @@ class BaseTool: return ToolInfo( name=cls.name, + enabled=cls.enabled, tool_description=cls.description, available_for_llm=cls.available_for_llm, tool_parameters=cls.parameters, @@ -51,7 +54,9 @@ class BaseTool: # 工具参数定义,子类必须重写 async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]: - """执行工具函数 + """执行工具函数(供llm调用) + 通过该方法,maicore会通过llm的tool call来调用工具 + 传入的是json格式的参数,符合parameters定义的格式 Args: function_args: 工具调用参数 @@ -60,3 +65,22 @@ class BaseTool: dict: 工具执行结果 """ raise NotImplementedError("子类必须实现execute方法") + + async def direct_execute(self, **function_args: dict[str, Any]) -> dict[str, Any]: + """直接执行工具函数(供插件调用) + 通过该方法,插件可以直接调用工具,而不需要传入字典格式的参数 + 插件可以直接调用此方法,用更加明了的方式传入参数 + 示例: result = await tool.direct_execute(arg1="参数",arg2="参数2") + + 工具开发者可以重写此方法以实现与llm调用差异化的执行逻辑 + + Args: + **function_args: 工具调用参数 + + Returns: + dict: 工具执行结果 + """ + if not self.parameters.get("required") in function_args.keys(): + raise ValueError(f"工具类 {self.__class__.__name__} 的参数 {self.parameters.get('required')} 必须在在调用时中提供") + + return await self.execute(function_args) diff --git a/src/plugin_system/core/component_registry.py b/src/plugin_system/core/component_registry.py index 832739f1d..ab91dfc4f 100644 --- a/src/plugin_system/core/component_registry.py +++ b/src/plugin_system/core/component_registry.py @@ -193,10 +193,14 @@ class ComponentRegistry: def _register_tool_component(self, tool_info: ToolInfo, tool_class: BaseTool): """注册Tool组件到Tool特定注册表""" tool_name = tool_info.name + if not tool_info.enabled: + logger.info(f"Tool组件 {tool_name} 未启用,跳过注册") + return False + self._tool_registry[tool_name] = tool_class - # 如果是llm可用的且启用的工具,添加到 llm可用工具列表 - if tool_info.available_for_llm and tool_info.enabled: + # 如果是llm可用的工具,添加到 llm可用工具列表 + if tool_info.available_for_llm: self._llm_available_tools[tool_name] = tool_class return True From a395573f062935478d08815f887be8e3697b8d03 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Mon, 28 Jul 2025 23:06:02 +0800 Subject: [PATCH 2/3] Update src/plugin_system/base/base_tool.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/plugin_system/base/base_tool.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugin_system/base/base_tool.py b/src/plugin_system/base/base_tool.py index 2936bcbc6..567f2ac51 100644 --- a/src/plugin_system/base/base_tool.py +++ b/src/plugin_system/base/base_tool.py @@ -80,7 +80,7 @@ class BaseTool: Returns: dict: 工具执行结果 """ - if not self.parameters.get("required") in function_args.keys(): - raise ValueError(f"工具类 {self.__class__.__name__} 的参数 {self.parameters.get('required')} 必须在在调用时中提供") + if self.parameters and (missing := [p for p in self.parameters.get("required", []) if p not in function_args]): + raise ValueError(f"工具类 {self.__class__.__name__} 缺少必要参数: {', '.join(missing)}") return await self.execute(function_args) From 3692015ce59f88970cb377cde12b4786dec06655 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Mon, 28 Jul 2025 23:53:54 +0800 Subject: [PATCH 3/3] update --- src/plugin_system/base/base_tool.py | 3 --- src/plugin_system/core/component_registry.py | 7 ++----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/plugin_system/base/base_tool.py b/src/plugin_system/base/base_tool.py index 567f2ac51..0c4bcb271 100644 --- a/src/plugin_system/base/base_tool.py +++ b/src/plugin_system/base/base_tool.py @@ -19,8 +19,6 @@ class BaseTool: parameters = None # 是否可供LLM使用,默认为False available_for_llm = False - # 是否启用该工具 - enabled = True @classmethod def get_tool_definition(cls) -> dict[str, Any]: @@ -45,7 +43,6 @@ class BaseTool: return ToolInfo( name=cls.name, - enabled=cls.enabled, tool_description=cls.description, available_for_llm=cls.available_for_llm, tool_parameters=cls.parameters, diff --git a/src/plugin_system/core/component_registry.py b/src/plugin_system/core/component_registry.py index ab91dfc4f..a0b680e68 100644 --- a/src/plugin_system/core/component_registry.py +++ b/src/plugin_system/core/component_registry.py @@ -193,14 +193,11 @@ class ComponentRegistry: def _register_tool_component(self, tool_info: ToolInfo, tool_class: BaseTool): """注册Tool组件到Tool特定注册表""" tool_name = tool_info.name - if not tool_info.enabled: - logger.info(f"Tool组件 {tool_name} 未启用,跳过注册") - return False self._tool_registry[tool_name] = tool_class - # 如果是llm可用的工具,添加到 llm可用工具列表 - if tool_info.available_for_llm: + # 如果是llm可用的且启用的工具,添加到 llm可用工具列表 + if tool_info.available_for_llm and tool_info.enabled: self._llm_available_tools[tool_name] = tool_class return True