import traceback from typing import Any from yuxi.utils import logger def get_tool_info(tools) -> list[dict[str, Any]]: """获取所有工具的信息(用于前端展示)""" tools_info = [] try: # 获取注册的工具信息 for tool_obj in tools: try: metadata = getattr(tool_obj, "metadata", {}) or {} info = { "id": tool_obj.name, "name": metadata.get("name", tool_obj.name), "description": tool_obj.description, "metadata": metadata, "args": [], # "is_async": is_async # Include async information } if hasattr(tool_obj, "args_schema") and tool_obj.args_schema: if isinstance(tool_obj.args_schema, dict): schema = tool_obj.args_schema else: schema = tool_obj.args_schema.schema() for arg_name, arg_info in schema.get("properties", {}).items(): info["args"].append( { "name": arg_name, "type": arg_info.get("type", ""), "description": arg_info.get("description", ""), } ) tools_info.append(info) # logger.debug(f"Successfully processed tool info for {tool_obj.name}") except Exception as e: logger.error( f"Failed to process tool {getattr(tool_obj, 'name', 'unknown')}: {e}\n{traceback.format_exc()}. " f"Details: {dict(tool_obj.__dict__)}" ) continue except Exception as e: logger.error(f"Failed to get tools info: {e}\n{traceback.format_exc()}") return [] logger.info(f"Successfully extracted info for {len(tools_info)} tools") return tools_info