{"record":{"id":"d8c548ce31477158","repo":"JuliusBrussee/caveman","slug":"initial-tool-count-must-be-a-non-negative-integer","errorCode":null,"errorMessage":"initial_tool_count must be a non-negative integer","messagePattern":"initial_tool_count must be a non-negative integer","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/sdk/python/caveman_cloud/core.py","lineNumber":656,"sourceCode":"        \"\"\"Build a tool-catalog handle with server-side search via\n        ``/sdk/v1/tool-search``.\n\n        ``strategy=\"all\"``      → ``initial`` is the whole catalog; ``search()``\n                                  still calls the server.\n        ``strategy=\"deferred\"`` → ``initial`` is the ``always_load`` tools plus\n                                  the first ``initial_tool_count`` of the catalog\n                                  (a subset sent on the first turn); ``search()``\n                                  calls the server to load relevant tools on demand.\n\n        Returns a handle with ``.strategy``, ``.initial`` (a ``list[CaveTool]``),\n        and ``.search(query, *, max_tools, context, workflow, ranker)`` which\n        hits the gateway and returns a :class:`ToolSearchResult`. Mirrors the\n        TypeScript ``cave.tools({ catalog, strategy })``.\n        \"\"\"\n        if strategy not in {\"all\", \"deferred\"}:\n            raise ValueError(\"strategy must be all or deferred\")\n        if isinstance(initial_tool_count, bool) or not isinstance(initial_tool_count, int) or initial_tool_count < 0:\n            raise ValueError(\"initial_tool_count must be a non-negative integer\")\n        if max_loaded_tools is not None and (isinstance(max_loaded_tools, bool) or not isinstance(max_loaded_tools, int) or max_loaded_tools < 1):\n            raise ValueError(\"max_loaded_tools must be a positive integer\")\n        if strategy == \"all\":\n            initial = list(catalog)\n        else:\n            always = [t for t in catalog if t.always_load]\n            if max_loaded_tools is not None and len(always) > max_loaded_tools:\n                raise ValueError(\"max_loaded_tools must be at least the always_load tool count\")\n            lazy = [t for t in catalog if not t.always_load]\n            lazy_limit = initial_tool_count if max_loaded_tools is None else min(initial_tool_count, max_loaded_tools - len(always))\n            initial = always + lazy[:lazy_limit]\n        return _ToolsHandle(self, catalog, strategy, initial, max_loaded_tools)\n\n    def tool_search(\n        self,\n        tools: list[CaveTool],\n        query: str,\n        *,","sourceCodeStart":638,"sourceCodeEnd":674,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/sdk/python/caveman_cloud/core.py#L638-L674","documentation":"Error \"initial_tool_count must be a non-negative integer\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at packages/sdk/python/caveman_cloud/core.py:656 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set initial_tool_count to a non-negative integer."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}