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
- 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.
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
- 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.
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
- The 'couchbase' package is required to use the CouchbaseFTSV
- `databricks-sdk` package not found, please run `uv add datab
- Pillow is required for image resizing
- Pillow is required for image optimization
- pypdf is required for PDF chunking
AI-assisted analysis of crewAIInc/crewAI@754d7323be (2026-08-15).
Data as JSON: /api/errors/594058b24cf89717.
Report an issue: GitHub.