crewAIInc/crewAI · error · ImportError

The 'daytona' package is required for Daytona sandbox tools.

Error message

The 'daytona' package is required for Daytona sandbox tools. Install it with: uv add daytona  (or) pip install daytona

What it means

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.

Source

Thrown at lib/crewai-tools/src/crewai_tools/tools/daytona_sandbox_tool/daytona_base_tool.py:115

    _client: Any | None = PrivateAttr(default=None)
    _persistent_sandbox: Any | None = PrivateAttr(default=None)
    _lock: threading.Lock = PrivateAttr(default_factory=threading.Lock)
    _cleanup_registered: bool = PrivateAttr(default=False)

    _sdk_cache: ClassVar[dict[str, Any]] = {}

    @classmethod
    def _import_sdk(cls) -> dict[str, Any]:
        if cls._sdk_cache:
            return cls._sdk_cache
        try:
            from daytona import (
                CreateSandboxFromSnapshotParams,
                Daytona,
                DaytonaConfig,
            )
        except ImportError as exc:
            raise ImportError(
                "The 'daytona' package is required for Daytona sandbox tools. "
                "Install it with: uv add daytona  (or) pip install daytona"
            ) from exc
        cls._sdk_cache = {
            "Daytona": Daytona,
            "DaytonaConfig": DaytonaConfig,
            "CreateSandboxFromSnapshotParams": CreateSandboxFromSnapshotParams,
        }
        return cls._sdk_cache

    def _get_client(self) -> Any:
        if self._client is not None:
            return self._client
        sdk = self._import_sdk()
        config_kwargs: dict[str, Any] = {}
        if self.api_key:
            config_kwargs["api_key"] = self.api_key
        if self.api_url:

View on GitHub (pinned to 754d7323be)

Solutions

  1. Install the SDK: uv add daytona (or pip install daytona).
  2. Confirm the import in the same interpreter: python -c "from daytona import Daytona".
  3. Pin daytna/daytona in your lockfile or Dockerfile so CI and deployments include it.
  4. If multiple venvs exist, ensure the tool process (agent runner, notebook kernel, service) uses the one where daytona is installed.

Example fix

# before
tool = DaytonaFileTool()
tool.run(action="list", path="/workspace")  # ImportError

# after
# shell:
#   uv add daytona
tool.run(action="list", path="/workspace")
Defensive patterns

Strategy: validation

Validate before calling

def daytona_available() -> bool:
    try:
        from daytona import Daytona  # noqa: F401
        return True
    except ImportError:
        return False

if not daytona_available():
    raise SystemExit("Install daytona (uv add daytona) to use Daytona sandbox tools")

Try / catch

try:
    tool = DaytonaFileTool()
except ImportError as e:
    if "daytona" in str(e):
        subprocess.run(["uv", "add", "daytona"], check=True)
        tool = DaytonaFileTool()
    else:
        raise

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of crewAIInc/crewAI@754d7323be (2026-08-15). Data as JSON: /api/errors/594058b24cf89717. Report an issue: GitHub.