utils.py
1 # SPDX-FileCopyrightText: 2022-present deepset GmbH <info@deepset.ai> 2 # 3 # SPDX-License-Identifier: Apache-2.0 4 5 from typing import TYPE_CHECKING 6 7 from haystack.tools.tool import Tool 8 from haystack.tools.toolset import Toolset 9 10 if TYPE_CHECKING: 11 from haystack.tools import ToolsType 12 13 14 def warm_up_tools(tools: "ToolsType | None" = None) -> None: 15 """ 16 Warm up tools from various formats (Tools, Toolsets, or mixed lists). 17 18 For Toolset objects, this delegates to Toolset.warm_up(), which by default 19 warms up all tools in the Toolset. Toolset subclasses can override warm_up() 20 to customize initialization behavior (e.g., setting up shared resources). 21 22 :param tools: A list of Tool and/or Toolset objects, a single Toolset, or None. 23 """ 24 if tools is None: 25 return 26 27 # If tools is a single Toolset or Tool, warm it up 28 if isinstance(tools, (Toolset, Tool)): 29 if hasattr(tools, "warm_up"): 30 tools.warm_up() 31 return 32 33 # If tools is a list, warm up each item (Tool or Toolset) 34 if isinstance(tools, list): 35 for item in tools: 36 if hasattr(item, "warm_up"): 37 item.warm_up() 38 39 40 def flatten_tools_or_toolsets(tools: "ToolsType | None") -> list[Tool]: 41 """ 42 Flatten tools from various formats into a list of Tool instances. 43 44 :param tools: Tools in list[Union[Tool, Toolset]], Toolset, or None format. 45 :returns: A flat list of Tool instances. 46 """ 47 if tools is None: 48 return [] 49 50 if isinstance(tools, Toolset): 51 return list(tools) 52 53 if isinstance(tools, list): 54 flattened: list[Tool] = [] 55 for item in tools: 56 if isinstance(item, Toolset): 57 flattened.extend(list(item)) 58 elif isinstance(item, Tool): 59 flattened.append(item) 60 else: 61 raise TypeError("Items in the tools list must be Tool or Toolset instances.") 62 return flattened 63 64 raise TypeError("tools must be list[Union[Tool, Toolset]], Toolset, or None")