---
title: "E2B"
id: integrations-e2b
description: "E2B integration for Haystack"
slug: "/integrations-e2b"
---
## haystack_integrations.tools.e2b.bash_tool
### RunBashCommandTool
Bases: Tool
A :class:`~haystack.tools.Tool` that executes bash commands inside an E2B sandbox.
Pass the same :class:`E2BSandbox` instance to multiple tool classes so they
all operate in the same live sandbox environment.
### Usage example
```python
from haystack_integrations.tools.e2b import E2BSandbox, RunBashCommandTool, ReadFileTool
sandbox = E2BSandbox()
agent = Agent(
chat_generator=...,
tools=[
RunBashCommandTool(sandbox=sandbox),
ReadFileTool(sandbox=sandbox),
],
)
```
#### __init__
```python
__init__(sandbox: E2BSandbox) -> None
```
Create a RunBashCommandTool.
**Parameters:**
- **sandbox** (E2BSandbox) – The :class:`E2BSandbox` instance that will execute commands.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this tool to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> RunBashCommandTool
```
Deserialize a RunBashCommandTool from a dictionary.
## haystack_integrations.tools.e2b.e2b_sandbox
### E2BSandbox
Manages the lifecycle of an E2B cloud sandbox.
Instantiate this class and pass it to one or more E2B tool classes
(`RunBashCommandTool`, `ReadFileTool`, `WriteFileTool`,
`ListDirectoryTool`) to share a single sandbox environment across all
tools. All tools that receive the same `E2BSandbox` instance operate
inside the same live sandbox process.
### Usage example
```python
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.agents import Agent
from haystack_integrations.tools.e2b import (
E2BSandbox,
RunBashCommandTool,
ReadFileTool,
WriteFileTool,
ListDirectoryTool,
)
sandbox = E2BSandbox()
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o"),
tools=[
RunBashCommandTool(sandbox=sandbox),
ReadFileTool(sandbox=sandbox),
WriteFileTool(sandbox=sandbox),
ListDirectoryTool(sandbox=sandbox),
],
)
```
Lifecycle is handled automatically by the Agent's pipeline. If you use the
tools standalone, call :meth:`warm_up` before the first tool invocation:
```python
sandbox.warm_up()
# ... use tools ...
sandbox.close()
```
#### __init__
```python
__init__(
api_key: Secret = Secret.from_env_var("E2B_API_KEY", strict=True),
sandbox_template: str = "base",
timeout: int = 120,
environment_vars: dict[str, str] | None = None,
instance_id: str | None = None,
) -> None
```
Create an E2BSandbox instance.
**Parameters:**
- **api_key** (Secret) – E2B API key.
- **sandbox_template** (str) – E2B sandbox template name.
- **timeout** (int) – Sandbox inactivity timeout in seconds.
- **environment_vars** (dict\[str, str\] | None) – Optional environment variables to inject into the sandbox.
- **instance_id** (str | None) – Stable identifier preserved across `to_dict`/`from_dict`. When
omitted, a fresh UUID is generated. Tools that share the same `E2BSandbox`
instance inherit this id, which is what lets them re-share the instance after
a serialization round-trip. Distinct from the cloud-side sandbox id assigned
by E2B at warm-up.
#### warm_up
```python
warm_up() -> None
```
Establish the connection to the E2B sandbox.
Idempotent -- calling it multiple times has no effect if the sandbox is
already running.
**Raises:**
- RuntimeError – If the E2B sandbox cannot be created.
#### close
```python
close() -> None
```
Shut down the E2B sandbox and release all associated resources.
Call this when you are done to avoid leaving idle sandboxes running.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize the sandbox configuration to a dictionary.
**Returns:**
- dict\[str, Any\] – Dictionary containing the serialised configuration.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> E2BSandbox
```
Deserialize an :class:`E2BSandbox` from a dictionary.
Multiple tools that shared a single :class:`E2BSandbox` before serialization
will share the same restored instance: each tool's `from_dict` consults a
process-wide cache keyed on `instance_id`. A cache hit is only honored when
the full serialized config (api_key, template, timeout, environment_vars)
matches the cached entry — a crafted YAML with a guessed id but a different
config falls through to a fresh instance and never observes the cached one.
**Parameters:**
- **data** (dict\[str, Any\]) – Dictionary created by :meth:`to_dict`.
**Returns:**
- E2BSandbox – An :class:`E2BSandbox` instance ready to be warmed up. May be a
previously-restored instance if the id and config match.
## haystack_integrations.tools.e2b.list_directory_tool
### ListDirectoryTool
Bases: Tool
A :class:`~haystack.tools.Tool` that lists directory contents in an E2B sandbox.
Pass the same :class:`E2BSandbox` instance to multiple tool classes so they
all operate in the same live sandbox environment.
### Usage example
```python
from haystack_integrations.tools.e2b import E2BSandbox, ListDirectoryTool
sandbox = E2BSandbox()
agent = Agent(chat_generator=..., tools=[ListDirectoryTool(sandbox=sandbox)])
```
#### __init__
```python
__init__(sandbox: E2BSandbox) -> None
```
Create a ListDirectoryTool.
**Parameters:**
- **sandbox** (E2BSandbox) – The :class:`E2BSandbox` instance to list directories from.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this tool to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> ListDirectoryTool
```
Deserialize a ListDirectoryTool from a dictionary.
## haystack_integrations.tools.e2b.read_file_tool
### ReadFileTool
Bases: Tool
A :class:`~haystack.tools.Tool` that reads files from an E2B sandbox filesystem.
Pass the same :class:`E2BSandbox` instance to multiple tool classes so they
all operate in the same live sandbox environment.
### Usage example
```python
from haystack_integrations.tools.e2b import E2BSandbox, ReadFileTool
sandbox = E2BSandbox()
agent = Agent(chat_generator=..., tools=[ReadFileTool(sandbox=sandbox)])
```
#### __init__
```python
__init__(sandbox: E2BSandbox) -> None
```
Create a ReadFileTool.
**Parameters:**
- **sandbox** (E2BSandbox) – The :class:`E2BSandbox` instance to read files from.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this tool to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> ReadFileTool
```
Deserialize a ReadFileTool from a dictionary.
## haystack_integrations.tools.e2b.sandbox_toolset
### E2BToolset
Bases: Toolset
A :class:`~haystack.tools.Toolset` that bundles all E2B sandbox tools.
All tools in the set share a single :class:`E2BSandbox` instance so they
operate inside the same live sandbox process. The toolset owns the sandbox
lifecycle: calling :meth:`warm_up` starts the sandbox, and serialisation
round-trips preserve the shared-sandbox relationship.
### Usage example
```python
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.agents import Agent
from haystack_integrations.tools.e2b import E2BToolset
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o"),
tools=E2BToolset(),
)
```
#### __init__
```python
__init__(
api_key: Secret = Secret.from_env_var("E2B_API_KEY", strict=True),
sandbox_template: str = "base",
timeout: int = 120,
environment_vars: dict[str, str] | None = None,
) -> None
```
Create an E2BToolset.
**Parameters:**
- **api_key** (Secret) – E2B API key. Defaults to `Secret.from_env_var("E2B_API_KEY")`.
- **sandbox_template** (str) – E2B sandbox template name. Defaults to `"base"`.
- **timeout** (int) – Sandbox inactivity timeout in seconds. Defaults to `120`.
- **environment_vars** (dict\[str, str\] | None) – Optional environment variables to inject into the sandbox.
#### warm_up
```python
warm_up() -> None
```
Start the shared E2B sandbox (idempotent).
#### close
```python
close() -> None
```
Shut down the shared E2B sandbox and release cloud resources.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this toolset to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> E2BToolset
```
Deserialize an E2BToolset from a dictionary.
## haystack_integrations.tools.e2b.write_file_tool
### WriteFileTool
Bases: Tool
A :class:`~haystack.tools.Tool` that writes files to an E2B sandbox filesystem.
Pass the same :class:`E2BSandbox` instance to multiple tool classes so they
all operate in the same live sandbox environment.
### Usage example
```python
from haystack_integrations.tools.e2b import E2BSandbox, WriteFileTool
sandbox = E2BSandbox()
agent = Agent(chat_generator=..., tools=[WriteFileTool(sandbox=sandbox)])
```
#### __init__
```python
__init__(sandbox: E2BSandbox) -> None
```
Create a WriteFileTool.
**Parameters:**
- **sandbox** (E2BSandbox) – The :class:`E2BSandbox` instance to write files to.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this tool to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> WriteFileTool
```
Deserialize a WriteFileTool from a dictionary.