c56bef871b
CodeQL / Analyze (python) (push) Has been cancelled
Update Platform Components Table / update (push) Has been cancelled
Docker image release / Build base image (push) Has been cancelled
Sync docs with Docusaurus / sync (push) Has been cancelled
Tests / Check if changed (push) Has been cancelled
Tests / format (push) Has been cancelled
Tests / check-imports (push) Has been cancelled
Tests / Unit / macos-latest (push) Has been cancelled
Tests / Unit / ubuntu-latest (push) Has been cancelled
Tests / Unit / windows-latest (push) Has been cancelled
Tests / mypy (push) Has been cancelled
Tests / Integration / ubuntu-latest (push) Has been cancelled
Tests / Integration / macos-latest (push) Has been cancelled
Tests / Integration / windows-latest (push) Has been cancelled
Tests / notify-slack-on-failure (push) Has been cancelled
Tests / Mark tests as completed (push) Has been cancelled
162 lines
5.9 KiB
Plaintext
162 lines
5.9 KiB
Plaintext
---
|
|
title: "E2BToolset"
|
|
id: e2btoolset
|
|
slug: "/e2btoolset"
|
|
description: "A Toolset that gives Agents access to a live E2B cloud sandbox for executing bash commands and managing files."
|
|
---
|
|
|
|
# E2BToolset
|
|
|
|
A Toolset that gives Agents access to a live [E2B](https://e2b.dev/) cloud sandbox for executing bash commands and managing files.
|
|
|
|
<div className="key-value-table">
|
|
|
|
| | |
|
|
| --- | --- |
|
|
| **Mandatory init variables** | `api_key`: E2B API key. Can be set with `E2B_API_KEY` env var. |
|
|
| **API reference** | [E2B](/reference/integrations-e2b) |
|
|
| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/e2b |
|
|
| **Package name** | `e2b-haystack` |
|
|
|
|
</div>
|
|
|
|
## Overview
|
|
|
|
`E2BToolset` bundles four tools that operate inside the same [E2B](https://e2b.dev/) cloud sandbox, giving an Agent a secure, isolated Linux environment to execute code and manipulate files:
|
|
|
|
- **`run_bash_command`** (`RunBashCommandTool`): Runs a bash command and returns the combined `exit_code`, `stdout`, and `stderr`. Use it for shell scripts, package installation, code compilation, or any system-level operation.
|
|
- **`read_file`** (`ReadFileTool`): Reads the text content of a file from the sandbox filesystem.
|
|
- **`write_file`** (`WriteFileTool`): Writes text content to a file in the sandbox. Parent directories are created automatically and existing files are overwritten.
|
|
- **`list_directory`** (`ListDirectoryTool`): Lists files and subdirectories at a given path.
|
|
|
|
All four tools share a single `E2BSandbox` instance, so a file written by `write_file` is immediately available to `run_bash_command` and `read_file` in the same Agent run. The toolset owns the sandbox lifecycle: `warm_up()` starts the sandbox, `close()` shuts it down, and YAML serialization round-trips preserve the shared-sandbox relationship.
|
|
|
|
### Parameters
|
|
|
|
- `api_key` is _mandatory_ and must be an E2B API key. The default setting uses the environment variable `E2B_API_KEY`. Get a key at [e2b.dev](https://e2b.dev/).
|
|
- `sandbox_template` is _optional_ and defaults to `"base"`. Sets the E2B sandbox template to use.
|
|
- `timeout` is _optional_ and defaults to `120`. Sets the sandbox inactivity timeout in seconds.
|
|
- `environment_vars` is _optional_ and lets you inject environment variables into the sandbox process.
|
|
|
|
## Usage
|
|
|
|
Install the E2B integration to use `E2BToolset`:
|
|
|
|
```shell
|
|
pip install e2b-haystack
|
|
```
|
|
|
|
Set your E2B API key:
|
|
|
|
```shell
|
|
export E2B_API_KEY="your-e2b-api-key"
|
|
```
|
|
|
|
### With an Agent
|
|
|
|
You can use `E2BToolset` with the [Agent](../../pipeline-components/agents-1/agent.mdx) component. The Agent will automatically start the sandbox, invoke the tools to write, run, and inspect code, and let the LLM chain calls together inside the same sandbox process.
|
|
|
|
```python
|
|
from haystack.components.agents import Agent
|
|
from haystack.components.generators.chat import OpenAIChatGenerator
|
|
from haystack.dataclasses import ChatMessage
|
|
|
|
from haystack_integrations.tools.e2b import E2BToolset
|
|
|
|
agent = Agent(
|
|
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
|
|
tools=E2BToolset(),
|
|
system_prompt=(
|
|
"You are a helpful coding assistant with access to a live Linux sandbox. "
|
|
"Use the available tools freely to explore, write files, and run commands. "
|
|
"All tools operate inside the same sandbox environment, so files written "
|
|
"with write_file are immediately available to run_bash_command and read_file."
|
|
),
|
|
max_agent_steps=15,
|
|
)
|
|
|
|
response = agent.run(
|
|
messages=[
|
|
ChatMessage.from_user(
|
|
"Write a Python script to /tmp/primes.py that prints all prime numbers "
|
|
"up to 50, run it, and then read the file back so I can see both the "
|
|
"script and its output.",
|
|
),
|
|
],
|
|
)
|
|
|
|
print(response["last_message"].text)
|
|
```
|
|
|
|
### Using individual tools
|
|
|
|
If you only need a subset of the tools, you can instantiate them directly and pass them a shared `E2BSandbox`:
|
|
|
|
```python
|
|
from haystack.components.agents import Agent
|
|
from haystack.components.generators.chat import OpenAIChatGenerator
|
|
|
|
from haystack_integrations.tools.e2b import (
|
|
E2BSandbox,
|
|
ListDirectoryTool,
|
|
ReadFileTool,
|
|
RunBashCommandTool,
|
|
WriteFileTool,
|
|
)
|
|
|
|
sandbox = E2BSandbox(sandbox_template="base", timeout=300)
|
|
|
|
agent = Agent(
|
|
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
|
|
tools=[
|
|
RunBashCommandTool(sandbox=sandbox),
|
|
ReadFileTool(sandbox=sandbox),
|
|
WriteFileTool(sandbox=sandbox),
|
|
ListDirectoryTool(sandbox=sandbox),
|
|
],
|
|
)
|
|
```
|
|
|
|
When using the tools standalone (outside an Agent or Pipeline), call `sandbox.warm_up()` before the first invocation and `sandbox.close()` when you are done to release the cloud resources.
|
|
|
|
### In a Pipeline
|
|
|
|
`E2BToolset` is fully serializable, so you can wrap an Agent that uses it in a Pipeline and save the Pipeline to YAML:
|
|
|
|
```python
|
|
from haystack.components.agents import Agent
|
|
from haystack.components.generators.chat import OpenAIChatGenerator
|
|
from haystack.core.pipeline import Pipeline
|
|
from haystack.dataclasses import ChatMessage
|
|
|
|
from haystack_integrations.tools.e2b import E2BToolset
|
|
|
|
agent = Agent(
|
|
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
|
|
tools=E2BToolset(sandbox_template="base", timeout=120),
|
|
system_prompt="You are a helpful coding assistant with access to a live Linux sandbox.",
|
|
max_agent_steps=10,
|
|
)
|
|
|
|
pipeline = Pipeline()
|
|
pipeline.add_component("agent", agent)
|
|
|
|
# Serialize and restore - all four tools still share the same E2BSandbox after the round-trip.
|
|
yaml_str = pipeline.dumps()
|
|
restored = Pipeline.loads(yaml_str)
|
|
|
|
result = restored.run(
|
|
data={
|
|
"agent": {
|
|
"messages": [
|
|
ChatMessage.from_user(
|
|
"Write a Python one-liner to /tmp/hello.py that prints "
|
|
"'Hello from E2B!', run it, then show me the output.",
|
|
),
|
|
],
|
|
},
|
|
},
|
|
)
|
|
print(result["agent"]["last_message"].text)
|
|
```
|