{"record":{"id":"594058b24cf89717","repo":"crewAIInc/crewAI","slug":"the-daytona-package-is-required-for-daytona-sand","errorCode":null,"errorMessage":"The 'daytona' package is required for Daytona sandbox tools. Install it with: uv add daytona  (or) pip install daytona","messagePattern":"The 'daytona' package is required for Daytona sandbox tools\\. Install it with: uv add daytona  \\(or\\) pip install daytona","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"lib/crewai-tools/src/crewai_tools/tools/daytona_sandbox_tool/daytona_base_tool.py","lineNumber":115,"sourceCode":"    _client: Any | None = PrivateAttr(default=None)\n    _persistent_sandbox: Any | None = PrivateAttr(default=None)\n    _lock: threading.Lock = PrivateAttr(default_factory=threading.Lock)\n    _cleanup_registered: bool = PrivateAttr(default=False)\n\n    _sdk_cache: ClassVar[dict[str, Any]] = {}\n\n    @classmethod\n    def _import_sdk(cls) -> dict[str, Any]:\n        if cls._sdk_cache:\n            return cls._sdk_cache\n        try:\n            from daytona import (\n                CreateSandboxFromSnapshotParams,\n                Daytona,\n                DaytonaConfig,\n            )\n        except ImportError as exc:\n            raise ImportError(\n                \"The 'daytona' package is required for Daytona sandbox tools. \"\n                \"Install it with: uv add daytona  (or) pip install daytona\"\n            ) from exc\n        cls._sdk_cache = {\n            \"Daytona\": Daytona,\n            \"DaytonaConfig\": DaytonaConfig,\n            \"CreateSandboxFromSnapshotParams\": CreateSandboxFromSnapshotParams,\n        }\n        return cls._sdk_cache\n\n    def _get_client(self) -> Any:\n        if self._client is not None:\n            return self._client\n        sdk = self._import_sdk()\n        config_kwargs: dict[str, Any] = {}\n        if self.api_key:\n            config_kwargs[\"api_key\"] = self.api_key\n        if self.api_url:","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/crewai-tools/src/crewai_tools/tools/daytona_sandbox_tool/daytona_base_tool.py#L97-L133","documentation":"DaytonaBaseTool._import_sdk() is a classmethod that lazily imports Daytona, DaytonaConfig, and CreateSandboxFromSnapshotParams from the daytona package (cached in _sdk_cache). If the import raises ImportError, it is re-raised with this message telling you to install 'daytona' via uv or pip. Every Daytona sandbox tool (file, process, etc.) goes through this, so the error surfaces on the first tool use or sandbox acquisition.","triggerScenarios":"Constructing or running any Daytona*Tool (e.g. DaytonaFileTool, DaytonaSandboxTool) without the daytona distribution installed in the active interpreter; running in a container/CI image that omitted the optional dependency; having installed a similarly named but wrong package.","commonSituations":"crewai-tools installed without daytona extra; venv mismatch (package installed in another env); CI/Docker image missing optional deps; agent runtime sandbox lacking the package.","solutions":["Install the SDK: uv add daytona (or pip install daytona).","Confirm the import in the same interpreter: python -c \"from daytona import Daytona\".","Pin daytna/daytona in your lockfile or Dockerfile so CI and deployments include it.","If multiple venvs exist, ensure the tool process (agent runner, notebook kernel, service) uses the one where daytona is installed."],"exampleFix":"# before\ntool = DaytonaFileTool()\ntool.run(action=\"list\", path=\"/workspace\")  # ImportError\n\n# after\n# shell:\n#   uv add daytona\ntool.run(action=\"list\", path=\"/workspace\")","handlingStrategy":"validation","validationCode":"def daytona_available() -> bool:\n    try:\n        from daytona import Daytona  # noqa: F401\n        return True\n    except ImportError:\n        return False\n\nif not daytona_available():\n    raise SystemExit(\"Install daytona (uv add daytona) to use Daytona sandbox tools\")","typeGuard":null,"tryCatchPattern":"try:\n    tool = DaytonaFileTool()\nexcept ImportError as e:\n    if \"daytona\" in str(e):\n        subprocess.run([\"uv\", \"add\", \"daytona\"], check=True)\n        tool = DaytonaFileTool()\n    else:\n        raise","preventionTips":["Declare daytona as a dependency in environments using sandbox tools.","Preinstall optional deps in CI images to avoid interactive prompts at runtime.","Check imports in the same interpreter the agent process runs under."],"tags":["daytona","import","dependency","optional-dependency","sandbox"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}