From d09fa0c1f64f05e158796e8f1981460bab6d5431 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Fri, 7 Nov 2025 12:20:50 +0800 Subject: [PATCH] =?UTF-8?q?update:=E7=9F=A5=E8=AF=86=E5=BA=93=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=9B=E5=BB=BAfunction=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/AgentPluginMappingServiceImpl.java | 2 +- .../tools/server_plugins/plugin_executor.py | 82 ++++++++++++++++++- .../functions/search_from_ragflow.py | 33 ++++++++ 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 main/xiaozhi-server/plugins_func/functions/search_from_ragflow.py diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentPluginMappingServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentPluginMappingServiceImpl.java index 450c4ce0..e168489f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentPluginMappingServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentPluginMappingServiceImpl.java @@ -55,7 +55,7 @@ public class AgentPluginMappingServiceImpl extends ServiceImpl Optional[str]: + """ + 解析知识库配置名称,提取真实的插件名称 + + Args: + config_name: 配置名称,格式为 xzKnowledgeBase__ + + Returns: + 真实的插件名称,如果不是知识库配置则返回 None + + Example: + "xzKnowledgeBase_search_from_ragflow_0" -> "search_from_ragflow" + "xzKnowledgeBase_search_from_ragflow_1" -> "search_from_ragflow" + """ + if not config_name.startswith("xzKnowledgeBase_"): + return None + + # 移除前缀 + name_without_prefix = config_name[len("xzKnowledgeBase_"):] + + # 找到最后一个下划线的位置 + last_underscore_index = name_without_prefix.rfind("_") + + if last_underscore_index == -1: + return None + + # 提取真实插件名称(从开头到最后一个下划线之前) + real_plugin_name = name_without_prefix[:last_underscore_index] + + return real_plugin_name async def execute( self, conn, tool_name: str, arguments: Dict[str, Any] ) -> ActionResponse: """执行服务端插件工具""" - func_item = all_function_registry.get(tool_name) + # 检查是否是知识库工具调用 + real_plugin_name = self._knowledge_base_mapping.get(tool_name) + if real_plugin_name: + # 使用真实的插件名称获取函数 + func_item = all_function_registry.get(real_plugin_name) + else: + # 普通插件调用 + func_item = all_function_registry.get(tool_name) + if not func_item: return ActionResponse( action=Action.NOTFOUND, response=f"插件函数 {tool_name} 不存在" @@ -77,8 +118,45 @@ class ServerPluginExecutor(ToolExecutor): tool_type=ToolType.SERVER_PLUGIN, ) + # 处理知识库配置 + plugins_config = self.config.get("plugins", {}) + for config_name, config_value in plugins_config.items(): + # 检查是否是知识库配置 + real_plugin_name = self._parse_knowledge_base_config(config_name) + if real_plugin_name: + # 获取真实的插件函数 + func_item = all_function_registry.get(real_plugin_name) + if func_item and isinstance(config_value, dict): + # 从配置中获取自定义的 name 和 description + custom_name = config_value.get("name", "") + custom_description = config_value.get("description", "") + + # 创建动态的工具名称(使用配置名称去掉前缀部分作为工具名) + tool_name = config_name[len("xzKnowledgeBase_"):] + + # 复制原始函数描述并修改 + custom_func_desc = func_item.description.copy() + if "function" in custom_func_desc: + custom_func_desc["function"] = custom_func_desc["function"].copy() + custom_func_desc["function"]["name"] = tool_name + custom_func_desc["function"]["description"] = custom_description + + # 注册工具 + tools[tool_name] = ToolDefinition( + name=tool_name, + description=custom_func_desc, + tool_type=ToolType.SERVER_PLUGIN, + ) + + # 保存映射关系 + self._knowledge_base_mapping[tool_name] = real_plugin_name + return tools def has_tool(self, tool_name: str) -> bool: """检查是否有指定的服务端插件工具""" + # 检查是否是知识库工具 + if tool_name in self._knowledge_base_mapping: + return True + # 检查是否是普通工具 return tool_name in all_function_registry diff --git a/main/xiaozhi-server/plugins_func/functions/search_from_ragflow.py b/main/xiaozhi-server/plugins_func/functions/search_from_ragflow.py new file mode 100644 index 00000000..ae1ed42f --- /dev/null +++ b/main/xiaozhi-server/plugins_func/functions/search_from_ragflow.py @@ -0,0 +1,33 @@ +from plugins_func.register import register_function, ToolType, ActionResponse, Action + +# 定义基础的函数描述模板 +SEARCH_FROM_RAGFLOW_FUNCTION_DESC = { + "type": "function", + "function": { + "name": "search_from_ragflow", + "description": "从知识库中查询信息", + "parameters": { + "type": "object", + "properties": {"query": {"type": "string", "description": "查询的关键词"}}, + "required": ["query"], + }, + }, +} + + +@register_function( + "search_from_ragflow", SEARCH_FROM_RAGFLOW_FUNCTION_DESC, ToolType.WAIT +) +def search_from_ragflow(query=None): + """ + 用于从ragflow知识库中查询信息 + """ + # TODO 从ragflow知识库中查询信息 + if query and "医生" in query: + response_text = "医院有张山、里斯、王五3名全科医生,其中王五医生是主要擅长眼科" + elif query and "科室" in query: + response_text = "医院眼科、麻醉科" + else: + response_text = "暂无相关信息" + + return ActionResponse(Action.REQLLM, response_text, None)