{"record":{"id":"48c58b2aae9a1cf7","repo":"deepset-ai/haystack","slug":"invalid-catalog-type-type-catalog-expected-to","errorCode":null,"errorMessage":"Invalid catalog type: {type(catalog)}. Expected Tool, Toolset, or list of Tools and/or Toolsets.","messagePattern":"Invalid catalog type: (.+?)\\. Expected Tool, Toolset, or list of Tools and/or Toolsets\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"haystack/tools/searchable_toolset.py","lineNumber":104,"sourceCode":"        \"\"\"\n        Initialize the SearchableToolset.\n\n        :param catalog: Source of tools - a list of Tools, list of Toolsets, or a single Toolset.\n        :param top_k: Default number of results for search_tools.\n        :param search_threshold: Minimum catalog size to activate search. If catalog has fewer tools, acts as\n            passthrough (all tools visible). Default is 8.\n        :param search_tool_name: Custom name for the bootstrap search tool. Default is \"search_tools\".\n        :param search_tool_description: Custom description for the bootstrap search tool. If not provided, uses a\n            default description.\n        :param search_tool_parameters_description: Custom descriptions for the bootstrap search tool's parameters.\n            Keys must be a subset of `{\"tool_keywords\", \"k\"}`.\n            Example: `{\"tool_keywords\": \"Keywords to find tools, e.g. 'email send'\"}`\n        \"\"\"\n        valid_catalog = isinstance(catalog, Toolset) or (\n            isinstance(catalog, list) and all(isinstance(item, (Tool, Toolset)) for item in catalog)\n        )\n        if not valid_catalog:\n            raise TypeError(\n                f\"Invalid catalog type: {type(catalog)}. Expected Tool, Toolset, or list of Tools and/or Toolsets.\"\n            )\n\n        if search_tool_parameters_description is not None:\n            invalid_keys = set(search_tool_parameters_description.keys()) - self._VALID_SEARCH_TOOL_PARAMS\n            if invalid_keys:\n                raise ValueError(\n                    f\"Invalid search_tool_parameters_description keys: {invalid_keys}. \"\n                    f\"Valid keys are: {self._VALID_SEARCH_TOOL_PARAMS}\"\n                )\n\n        # Store raw catalog; flattening is deferred to warm_up() so that lazy toolsets\n        # (e.g. MCPToolset with eager_connect=False) can connect first.\n        self._raw_catalog: \"ToolsType\" = catalog\n        self._catalog: list[Tool] = []\n\n        self._top_k = top_k\n        self._search_threshold = search_threshold","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/tools/searchable_toolset.py#L86-L122","documentation":"SearchableToolset.__init__ validates its 'catalog' argument: it must be a Toolset, or a list whose items are all Tool or Toolset instances. Anything else (a single bare Tool, a string, None, a list containing non-tool items) raises TypeError.","triggerScenarios":"SearchableToolset(catalog=single_tool) passing one Tool instead of [tool]; passing a list containing None or dicts; passing a string tool name; passing None.","commonSituations":"Refactoring from a tool-list API and forgetting to wrap a single Tool in a list; mixing tool names (strings) with Tool objects; constructing the toolset before tools are created so the list contains None placeholders.","solutions":["Wrap a single Tool in a list: SearchableToolset(catalog=[my_tool])","Ensure every list item is a Tool or Toolset instance — instantiate tools before passing them","Pass a Toolset (e.g. Toolset(tools=[...])) instead of an ad-hoc list"],"exampleFix":"// before\nSearchableToolset(catalog=my_tool)\n\n// after\nSearchableToolset(catalog=[my_tool])","handlingStrategy":"type-guard","validationCode":"from haystack.tools import Tool, Toolset\n\ndef validate_catalog(catalog) -> bool:\n    if isinstance(catalog, Toolset):\n        return True\n    return isinstance(catalog, list) and all(isinstance(i, (Tool, Toolset)) for i in catalog)","typeGuard":"def is_valid_searchable_catalog(catalog) -> bool:\n    from haystack.tools import Tool, Toolset\n    return isinstance(catalog, Toolset) or (\n        isinstance(catalog, list) and all(isinstance(i, (Tool, Toolset)) for i in catalog)\n    )","tryCatchPattern":"try:\n    ts = SearchableToolset(catalog=catalog)\nexcept TypeError as e:\n    if isinstance(catalog, Tool):\n        catalog = [catalog]\n    ts = SearchableToolset(catalog=catalog)","preventionTips":["Always pass a list of Tools/Toolsets or a Toolset — never a bare Tool","Instantiate all tools before constructing the toolset","Validate catalog contents with a small helper in agent setup code"],"tags":["type-check","toolset","validation"],"backgroundTag":"wrong-argument-type","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}