{"record":{"id":"774fe400f0749151","repo":"crewAIInc/crewAI","slug":"expected-a-llamabasetool-got-type-tool","errorCode":null,"errorMessage":"Expected a LlamaBaseTool, got {type(tool)}","messagePattern":"Expected a LlamaBaseTool, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/llamaindex_tool.py","lineNumber":34,"sourceCode":"        *args: Any,\n        **kwargs: Any,\n    ) -> Any:\n        \"\"\"Run tool.\"\"\"\n        tool = self.llama_index_tool\n\n        if self.result_as_answer:\n            return tool(*args, **kwargs).content\n\n        return tool(*args, **kwargs)\n\n    @classmethod\n    def from_tool(cls, tool: Any, **kwargs: Any) -> LlamaIndexTool:\n        from llama_index.core.tools import (  # type: ignore[import-not-found]\n            BaseTool as LlamaBaseTool,\n        )\n\n        if not isinstance(tool, LlamaBaseTool):\n            raise ValueError(f\"Expected a LlamaBaseTool, got {type(tool)}\")\n\n        if tool.metadata.fn_schema is None:\n            raise ValueError(\n                \"The LlamaIndex tool does not have an fn_schema specified.\"\n            )\n        args_schema = cast(type[BaseModel], tool.metadata.fn_schema)\n\n        return cls(\n            name=tool.metadata.name,\n            description=tool.metadata.description,\n            args_schema=args_schema,\n            llama_index_tool=tool,\n            **kwargs,\n        )\n\n    @classmethod\n    def from_query_engine(\n        cls,","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/llamaindex_tool.py#L16-L52","documentation":"LlamaIndexTool.from_tool type-checks its argument against llama_index.core.tools.BaseTool before wrapping it. Passing anything else — a function, a llama-index <0.9 legacy ToolMetadata object, or an object from an incompatible llama-index version — raises this ValueError because the wrapper relies on tool.metadata.fn_schema downstream.","triggerScenarios":"Calling LlamaIndexTool.from_tool(some_function); passing a llama-index v0.8/early-0.9-style tool object whose class no longer matches llama_index.core.tools.BaseTool; passing a QueryEngine instead of a wrapped tool (use from_query_engine for that); two llama-index copies installed so isinstance fails across module identities.","commonSituations":"Upgrading llama-index past 0.9 where the package moved from llama_index to llama_index.core; mixing llama-index versions in one env; confusion between from_tool (expects a BaseTool) and from_query_engine (expects a query engine).","solutions":["Wrap the object correctly: for functions use llama_index.core.tools.FunctionTool.from_defaults(fn=...), for query engines use LlamaIndexTool.from_query_engine(...)","Align versions: upgrade llama-index so llama_index.core exists and matches the object being passed (pip install -U llama-index)","Check for duplicate installs: `pip list | grep llama` and uninstall stragglers so isinstance uses one BaseTool class"],"exampleFix":"# before\nfrom llama_index.core import VectorStoreIndex\nengine = VectorStoreIndex.from_documents(docs).as_query_engine()\ntool = LlamaIndexTool.from_tool(engine)  # ValueError\n\n# after\ntool = LlamaIndexTool.from_query_engine(engine, name=\"docs_qa\", description=\"Answer questions over docs\")","handlingStrategy":"type-guard","validationCode":"def is_llama_base_tool(tool) -> bool:\n    from llama_index.core.tools import BaseTool\n    return isinstance(tool, BaseTool)","typeGuard":"from typing import Any\n\ndef is_llama_base_tool(tool: Any) -> \"TypeGuard[Any]\":\n    try:\n        from llama_index.core.tools import BaseTool\n    except ImportError:\n        return False\n    return isinstance(tool, BaseTool)","tryCatchPattern":"try:\n    crew_tool = LlamaIndexTool.from_tool(tool)\nexcept ValueError as e:\n    if \"Expected a LlamaBaseTool\" in str(e):\n        from llama_index.core.tools import FunctionTool\n        tool = FunctionTool.from_defaults(fn=tool)\n        crew_tool = LlamaIndexTool.from_tool(tool)\n    else:\n        raise","preventionTips":["Use from_query_engine for query engines and from_tool for BaseTool instances","Pin one llama-index version (>=0.10 with llama_index.core) across the project","Check pip list for duplicate llama-index distributions before wrapping tools"],"tags":["type-check","llamaindex","version-mismatch","crewai-tools"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}