{"record":{"id":"a6789914dee17b48","repo":"JuliusBrussee/caveman","slug":"install-caveman-middleware-crewai-to-use-the-crewai-adapter","errorCode":null,"errorMessage":"Install caveman-middleware[crewai] to use the CrewAI adapter","messagePattern":"Install caveman-middleware\\[crewai\\] to use the CrewAI adapter","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"packages/middleware/python/caveman_middleware/crewai.py","lineNumber":29,"sourceCode":"import threading\nimport uuid\nimport weakref\nfrom contextlib import ExitStack\nfrom dataclasses import dataclass, field\nfrom importlib.metadata import version\nfrom typing import Any\n\ntry:\n    from crewai import BaseLLM\n    from crewai.events import LLMCallCompletedEvent, crewai_event_bus\n    from crewai.hooks import InterceptionPoint, on, unregister_hook\n    from crewai.llms.base_llm import call_stop_override, call_stream_override\n    from crewai.tools import BaseTool\n    from crewai.utilities.agent_utils import convert_tools_to_openai_schema\n    from crewai.utilities.string_utils import sanitize_tool_name\n    from pydantic import BaseModel, ConfigDict, Field, PrivateAttr\nexcept ModuleNotFoundError as error:\n    raise ImportError(\"Install caveman-middleware[crewai] to use the CrewAI adapter\") from error\n\nfrom caveman_cloud.middleware import Adapter, Candidate, MiddlewareError, MiddlewareRuntime, Scope\nfrom caveman_cloud.middleware.runtime import RECOVERY_DESCRIPTION\nfrom ._native import Attempt, leaves, manifest, owner, plain, replace_path\nfrom ._versions import matches_framework\nfrom ._usage import usage\n\nFRAMEWORK_VERSION = version(\"crewai\")\nADAPTER = Adapter(\"crewai\", \"0.1.0\", FRAMEWORK_VERSION, \"crewai-messages-v1\")\n_call = contextvars.ContextVar(\"caveman_crewai_call\", default=None)\n\n\nclass _RecoveryInput(BaseModel):\n    model_config = ConfigDict(extra=\"forbid\")\n    handle: str = Field(pattern=r\"^cmw_[a-f0-9]{48}$\")\n    offset: int = Field(default=0, ge=0)\n    limit: int = Field(default=262144, ge=4, le=262144)\n    query: str = Field(default=\"\", max_length=1024)","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/middleware/python/caveman_middleware/crewai.py#L11-L47","documentation":"The CrewAI adapter in caveman_middleware imports optional CrewAI dependencies (crewai.llms, crewai.tools, crewai.utilities) at module import time. If CrewAI is not installed, this ImportError is raised as the cause-chained error, telling you to install the optional extra instead of a raw ModuleNotFoundError.","triggerScenarios":"Importing caveman_middleware.crewai (or any code path that imports the CrewAI adapter) in an environment where the `crewai` package (or one of its imported submodules) is missing. Triggered during `import`, before any adapter API is used.","commonSituations":"Installing caveman-middleware without extras (pip install caveman-middleware instead of caveman-middleware[crewai]); deploying to an environment where the extra was omitted from requirements; a CrewAI version change renaming submodules like crewai.llms.base_llm.","solutions":["Run pip install \"caveman-middleware[crewai]\" to install CrewAI with the supported version range.","Add caveman-middleware[crewai] to your requirements/pyproject dependencies and reinstall.","Verify crewai imports directly: python -c \"import crewai.llms.base_llm\"; if that fails, upgrade/reinstall crewai to a version providing those submodules."],"exampleFix":"// before\npip install caveman-middleware\n// after\npip install \"caveman-middleware[crewai]\"","handlingStrategy":"try-catch","validationCode":"try:\n    from crewai.llms.base_llm import BaseLLM\nexcept ModuleNotFoundError:\n    raise RuntimeError(\"Run: pip install 'caveman-middleware[crewai]'\")","typeGuard":"def crewai_extra_installed() -> bool:\n    import importlib.util\n    return importlib.util.find_spec(\"crewai\") is not None","tryCatchPattern":"try:\n    from caveman_middleware import crewai as caveman_crewai\nexcept ImportError as e:\n    logging.error(\"Install the extra: pip install 'caveman-middleware[crewai]' (%s)\", e)\n    raise","preventionTips":["Always install optional framework adapters with their extras (caveman-middleware[crewai]).","Pin the extra in requirements/pyproject, not the bare package.","Import adapter modules lazily at startup so missing extras fail fast with a clear message.","Verify imports in CI for every deployment image."],"tags":["crewai","dependency","import-error","optional-extra"],"backgroundTag":"missing-optional-dependency","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}