registry.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. """工具注册表 - HelloAgents原生工具系统"""
  2. from typing import Optional, Any, Callable
  3. from .base import Tool
  4. class ToolRegistry:
  5. """
  6. HelloAgents工具注册表
  7. 提供工具的注册、管理和执行功能。
  8. 支持两种工具注册方式:
  9. 1. Tool对象注册(推荐)
  10. 2. 函数直接注册(简便)
  11. """
  12. def __init__(self):
  13. self._tools: dict[str, Tool] = {}
  14. self._functions: dict[str, dict[str, Any]] = {}
  15. def register_tool(self, tool: Tool):
  16. """注册 Tool 对象"""
  17. if tool.name in self._tools:
  18. print(f"⚠️ 警告:工具 '{tool.name}' 已存在,将被覆盖。")
  19. self._tools[tool.name] = tool
  20. print(f"✅ 工具 '{tool.name}' 已注册。")
  21. def register_function(
  22. self, name: str, description: str, func: Callable[[str], str]
  23. ):
  24. """
  25. 直接注册函数作为工具(简便方式)
  26. Args:
  27. name: 工具名称
  28. description: 工具描述
  29. func: 工具函数,接受字符串参数,返回字符串结果
  30. """
  31. if name in self._functions:
  32. print(f"⚠️ 警告:工具 '{name}' 已存在,将被覆盖。")
  33. self._functions[name] = {"description": description, "func": func}
  34. print(f"✅ 工具 '{name}' 已注册。")
  35. def unregister(self, name: str):
  36. """注销工具"""
  37. if name in self._tools:
  38. del self._tools[name]
  39. print(f"🗑️ 工具 '{name}' 已注销。")
  40. elif name in self._functions:
  41. del self._functions[name]
  42. print(f"🗑️ 工具 '{name}' 已注销。")
  43. else:
  44. print(f"⚠️ 工具 '{name}' 不存在。")
  45. def get_tool(self, name: str) -> Optional[Tool]:
  46. """获取Tool对象"""
  47. return self._tools.get(name)
  48. def get_function(self, name: str) -> Optional[Callable]:
  49. """获取工具函数"""
  50. func_info = self._functions.get(name)
  51. return func_info["func"] if func_info else None
  52. def execute_tool(self, name: str, input_text: str) -> str:
  53. """
  54. 执行工具
  55. Args:
  56. name: 工具名称
  57. input_text: 输入参数
  58. Returns:
  59. 工具执行结果
  60. """
  61. # 优先查找Tool对象
  62. if name in self._tools:
  63. tool = self._tools[name]
  64. try:
  65. # 简化参数传递,直接传入字符串
  66. return tool.run({"input": input_text})
  67. except Exception as e:
  68. return f"错误:执行工具 '{name}' 时发生异常: {str(e)}"
  69. # 查找函数工具
  70. elif name in self._functions:
  71. func = self._functions[name]["func"]
  72. try:
  73. return func(input_text)
  74. except Exception as e:
  75. return f"错误:执行工具 '{name}' 时发生异常: {str(e)}"
  76. else:
  77. return f"错误:未找到名为 '{name}' 的工具。"
  78. def get_tools_description(self) -> str:
  79. """
  80. 获取所有可用工具的格式化描述字符串
  81. Returns:
  82. 工具描述字符串,用于构建提示词
  83. """
  84. descriptions = []
  85. # Tool对象描述
  86. for tool in self._tools.values():
  87. descriptions.append(f"- {tool.name}: {tool.description}")
  88. # 函数工具描述
  89. for name, info in self._functions.items():
  90. descriptions.append(f"- {name}: {info['description']}")
  91. return "\n".join(descriptions) if descriptions else "暂无可用工具"
  92. def list_tools(self) -> list[str]:
  93. """列出所有工具名称"""
  94. return list(self._tools.keys()) + list(self._functions.keys())
  95. def get_all_tools(self) -> list[Tool]:
  96. """获取所有Tool对象"""
  97. return list(self._tools.values())
  98. def clear(self):
  99. """清空所有工具"""
  100. self._tools.clear()
  101. self._functions.clear()
  102. print("🧹 所有工具已清空。")
  103. # 全局工具注册表
  104. global_registry = ToolRegistry()