/ haystack / tools / utils.py
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")