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 1c757180b..3482e5f79 100644 --- a/src/plugin_system/base/base_tool.py +++ b/src/plugin_system/base/base_tool.py @@ -54,7 +54,9 @@ class BaseTool(ABC): @abstractmethod async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]: - """执行工具函数 + """执行工具函数(供llm调用) + 通过该方法,maicore会通过llm的tool call来调用工具 + 传入的是json格式的参数,符合parameters定义的格式 Args: function_args: 工具调用参数 @@ -63,3 +65,22 @@ class BaseTool(ABC): 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 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) diff --git a/src/plugin_system/core/component_registry.py b/src/plugin_system/core/component_registry.py index 616e5e463..ec8a7d793 100644 --- a/src/plugin_system/core/component_registry.py +++ b/src/plugin_system/core/component_registry.py @@ -195,6 +195,7 @@ class ComponentRegistry: def _register_tool_component(self, tool_info: ToolInfo, tool_class: Type[BaseTool]) -> bool: """注册Tool组件到Tool特定注册表""" tool_name = tool_info.name + self._tool_registry[tool_name] = tool_class # 如果是llm可用的且启用的工具,添加到 llm可用工具列表