Суть урока
Когда агент пишет и запускает код — кто несёт ответственность за то, что этот код натворит? Если агент запустит rm -rf / или случайно удалит базу данных — последствия будут на твоей машине, у твоего клиента, в продакшне.
Sandboxes решают эту проблему радикально: агент получает изолированную среду — виртуальный контейнер — где он может запускать любой код, читать и писать файлы, делать сетевые запросы. Но всё это происходит внутри «клетки». Снаружи — нетронутый мир.
В этом уроке разберём два главных инструмента: E2B — специально созданные sandboxes для AI-агентов, и Modal — serverless-платформу для ML-задач и тяжёлых вычислений.
Ключевые концепции
- Sandbox — изолированная среда выполнения кода с ограниченным доступом к внешним ресурсам
- Containerization — технология (Docker) изоляции процессов на уровне операционной системы
- Stateful sandbox — sandbox с сохранением состояния между вызовами (файлы, установленные пакеты, переменные)
- Cold start — время запуска sandbox с нуля; для E2B — порядка секунды (точные цифры в документации E2B)
- Filesystem access — агент может читать и писать файлы внутри sandbox, как на обычном компьютере
- Network isolation — sandbox может иметь или не иметь доступа в интернет (зависит от настроек)
- Pay-per-use — оба инструмента тарифицируют по реальному времени использования, а не за фиксированный сервер
- GPU sandbox — Modal предоставляет доступ к GPU для ML-задач без аренды дорогих серверов
Теория
Почему агентам нужны sandboxes
Представь, что ты нанял программиста, который работает удалённо. Ты ему доверяешь, но на его машине — твои данные, твои API-ключи, твоя продакшн-база. Даже случайная ошибка может стоить дорого.
С AI-агентами ситуация острее: агент не просто пишет код — он его запускает. И если агент неправильно понял задачу, написал деструктивный скрипт, или попался на prompt injection — без изоляции последствия мгновенно выйдут за пределы задуманного.
Три главных сценария, где нужна изоляция:
Запуск ненадёжного кода. Агент-программист, который пишет и тестирует код по задаче пользователя. Код может быть корректным по логике, но опасным по побочным эффектам.
Анализ данных без риска. Агент-аналитик, которому дают CSV, Excel, или базу данных для исследования. Лучше, чтобы он работал с копией в sandbox, а не с оригиналом.
Тестирование перед продакшном. Агент-деплойер проверяет, что сборка работает, запускает тесты — и только потом даёт добро на реальный деплой.
E2B — Sandboxes специально для AI-агентов
E2B (e2b.dev) — компания, которая сделала одну вещь и сделала её хорошо: микровиртуальные машины для выполнения кода агентами.
Ключевые характеристики E2B:
Быстрый старт: порядка секунды. Обычный Docker-контейнер обычно стартует заметно дольше. E2B использует облегчённые виртуальные машины на основе Firecracker (технология AWS), которые поднимают изолированную среду очень быстро.
Python и JavaScript SDK. Управляй sandbox через код: создал, запустил команду, получил результат, закрыл.
Persistent filesystem. Файлы, которые создал агент в sandbox, сохраняются на протяжении всей сессии. Можно скачать результат обратно после работы.
Сетевой доступ. По умолчанию sandbox имеет выход в интернет — агент может скачивать пакеты, делать API-запросы.
Кастомные шаблоны. Можно создать свой template с предустановленными зависимостями, чтобы не устанавливать их каждый раз.
Пример — агент-программист на Python с E2B:
import anthropic
from e2b_code_interpreter import Sandbox
client = anthropic.Anthropic()
# Создаём sandbox
sandbox = Sandbox.create()
# Промпт для агента
user_task = """
Напиши Python-скрипт, который:
1. Генерирует 100 случайных чисел от 1 до 1000
2. Находит среднее, медиану и стандартное отклонение
3. Строит гистограмму и сохраняет в файл histogram.png
Запусти скрипт и покажи результаты.
"""
# Агент генерирует код (актуальные модели: страница «Актуальное сейчас»)
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2048,
messages=[{"role": "user", "content": user_task}]
)
def extract_code(text: str) -> str:
"""Модель часто оборачивает код в ```python ... ```: достаём только код."""
if "```" not in text:
return text
block = text.split("```")[1]
return block.removeprefix("python").strip()
# Извлекаем код из ответа агента
agent_code = extract_code("".join(b.text for b in response.content if b.type == "text"))
# Запускаем код агента в изолированном sandbox
execution = sandbox.run_code(agent_code)
# Получаем результаты
print("Stdout:", execution.logs.stdout)
print("Stderr:", execution.logs.stderr)
# Скачиваем файл результата
if execution.results:
for result in execution.results:
if hasattr(result, 'png'):
with open("histogram.png", "wb") as f:
f.write(result.png)
print("Гистограмма сохранена в histogram.png")
# Закрываем sandbox (очищает все ресурсы)
sandbox.kill()Сценарии использования E2B:
- AI coding assistant — пользователь просит написать скрипт, агент пишет код, тестирует в sandbox, исправляет ошибки, возвращает рабочий результат
- Data analysis agent — загружаешь файл данных, агент анализирует, строит графики, возвращает insights
- Web scraping agent — агент пишет и тестирует парсер в безопасной среде, без риска заблокировать продакшн IP
- Code review с запуском — агент не только читает код, но и запускает тесты, проверяет edge cases
Modal — serverless для ML и тяжёлых задач
Modal (modal.com) — другой класс инструментов. Это не просто sandbox для кода, это полноценная serverless-платформа с акцентом на ML-задачи.
Что умеет Modal, чего нет у E2B:
GPU по запросу. Можно запустить функцию на L4, A10, A100, H100 и других GPU — платишь только за время GPU. Не нужен выделенный сервер.
Scheduled jobs. Запускать функции по расписанию (cron) — как GitHub Actions, но с доступом к GPU и Python-окружению.
Web endpoints. Разворачивать API-эндпоинты из Python-функций одной командой.
Volume storage. Постоянное хранилище для моделей, датасетов, результатов.
Параллельные задачи. Запускать тысячи задач параллельно без инфраструктуры.
Пример — запуск ML-модели на GPU через Modal:
import modal
app = modal.App("ai-inference")
# Образ с зависимостями
image = modal.Image.debian_slim().pip_install(
"torch", "transformers", "pillow"
)
@app.function(
image=image,
gpu="A10", # тип GPU: список допустимых значений смотри в документации Modal
timeout=300
)
def run_inference(prompt: str) -> str:
from transformers import pipeline
generator = pipeline("text-generation", model="gpt2")
result = generator(prompt, max_length=200)
return result[0]["generated_text"]
# Запуск из локального скрипта (Modal сам поднимает GPU-инстанс)
if __name__ == "__main__":
with modal.enable_output():
with app.run():
result = run_inference.remote("Напиши короткий рассказ:")
print(result)E2B против Modal — когда что использовать
| Критерий | E2B | Modal |
|---|---|---|
| Главная задача | Агент запускает код пользователя | ML-задачи, heavy compute |
| Скорость старта | порядка секунды | секунды, зависит от образа и GPU (холодный старт) |
| GPU | Нет | Да (L4, A10, A100, H100 и другие) |
| Stateful filesystem | Да, в рамках сессии | Да, через Volume |
| Scheduled jobs | Нет | Да |
| Web endpoints | Нет (только API) | Да |
| Целевой пользователь | AI-агент разработчик | ML-инженер, data scientist |
| Бесплатный старт | Да (разовые кредиты) | Да (ежемесячные кредиты) |
| Оплата | по секундам за vCPU и память | по секундам за ядро, память и GPU |
Вывод: E2B — для агентов, которые пишут и запускают произвольный код. Modal — для агентов, которым нужны серьёзные вычислительные ресурсы (инференс, файн-тюнинг, batch processing).
Другие альтернативы
Daytona — open source self-hosted альтернатива E2B. Если важна privacy (запускаешь код клиентов), можно поднять на собственном сервере. Поддерживает те же операции — создание среды, выполнение кода, файловая система.
Docker напрямую — если хочешь полный контроль и готов настраивать самостоятельно. Больше гибкости, но и больше работы. Нет встроенной интеграции с AI-агентами.
GitHub Codespaces / Gitpod (теперь Ona) — среды для разработки, не для агентов. Слишком тяжёлые и дорогие для per-request использования.
Безопасность: что агент МОЖЕТ и НЕ МОЖЕТ в sandbox
Может:
- Читать и писать файлы внутри sandbox
- Запускать любые shell-команды (bash, python, node...)
- Устанавливать пакеты через pip, npm, apt
- Делать HTTP-запросы наружу (если сеть разрешена)
- Использовать CPU и RAM в рамках лимитов
Не может (изолировано):
- Получить доступ к файлам на твоей машине
- Читать переменные окружения хоста
- Изменить что-либо за пределами контейнера
- Использовать больше CPU/RAM, чем выделено
Важное замечание: E2B по умолчанию открывает сетевой доступ. Если агент в sandbox получил злонамеренный промпт и захочет exfiltrate данные — он технически может сделать HTTP-запрос на внешний сервер. Для параноидальных сценариев E2B поддерживает network isolation.
Стоимость
Оба сервиса берут плату посекундно за реальное время работы, простой не оплачивается, и в обоих можно начать бесплатно. У E2B есть бесплатный план Hobby с разовыми кредитами при регистрации и ограничениями на число одновременных sandbox и длину сессии, и план Pro с ежемесячной платой плюс расход, более длинными сессиями и большим числом одновременных sandbox. У Modal есть план Starter без ежемесячной платы, в него каждый месяц входят кредиты; время GPU стоит заметно дороже CPU, а sandbox дороже обычных функций.
Тарифы меняются, поэтому цифр здесь нет: перед тем как планировать бюджет, сверь актуальные на официальных страницах e2b.dev/pricing и modal.com/pricing. Чтобы оценить задачу, умножь её длительность в секундах на ресурсы, которые она занимает (vCPU, память, GPU), и на опубликованную ставку. Короткая задача агента на конфигурации E2B по умолчанию обычно стоит долю цента, но считай по ценам на сегодня.
Цены и версии, которые мы отслеживаем: Актуальное сейчас.
Практика
Задача: Построить data analysis агента, который принимает CSV-файл, запускает анализ в E2B sandbox и возвращает отчёт.
Шаг 1: Установка и настройка
# Установить SDK
pip install e2b-code-interpreter anthropic
# Получить API ключи
# E2B: https://e2b.dev/dashboard → API Keys
# Добавить в .env:
# E2B_API_KEY=e2b_...
# ANTHROPIC_API_KEY=sk-ant-...Шаг 2: Создание базового sandbox
from e2b_code_interpreter import Sandbox
import os
# Создать sandbox
sbx = Sandbox.create(api_key=os.environ["E2B_API_KEY"])
# Проверить, что работает
result = sbx.run_code("print('Sandbox запущен!')")
print(result.logs.stdout) # ['Sandbox запущен!\n']
# Установить зависимости (один раз на сессию)
sbx.run_code("import subprocess; subprocess.run(['pip', 'install', 'pandas', 'matplotlib', 'seaborn'], capture_output=True)")
print("Sandbox готов")
sbx.kill()Шаг 3: Загрузка данных в sandbox
from e2b_code_interpreter import Sandbox
import anthropic, os
def analyze_csv(csv_path: str) -> dict:
sbx = Sandbox.create(api_key=os.environ["E2B_API_KEY"])
# Загружаем CSV в sandbox
with open(csv_path, "rb") as f:
csv_content = f.read()
sbx.files.write("/home/user/data.csv", csv_content)
# Проверяем
result = sbx.run_code("""
import pandas as pd
df = pd.read_csv('/home/user/data.csv')
print(f"Загружено строк: {len(df)}")
print(f"Колонки: {list(df.columns)}")
print(df.dtypes)
""")
print("Данные в sandbox:")
print(result.logs.stdout)
return sbx # возвращаем для дальнейшей работыШаг 4: Агент анализирует данные
def run_ai_analysis(sbx, question: str) -> str:
client = anthropic.Anthropic()
# Получаем структуру данных
structure = sbx.run_code("""
import pandas as pd
df = pd.read_csv('/home/user/data.csv')
print(df.describe().to_string())
print("\\nПервые строки:")
print(df.head().to_string())
""")
data_info = "\n".join(structure.logs.stdout)
# Просим агента написать код анализа
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2048,
system="""Ты data analyst. Пиши чистый Python-код для анализа данных.
Данные уже загружены в /home/user/data.csv.
Используй pandas, matplotlib, seaborn.
Сохраняй графики как /home/user/plot.png.
В конце выводи краткие выводы в print().""",
messages=[{
"role": "user",
"content": f"Данные:\n{data_info}\n\nЗадача: {question}"
}]
)
# Извлекаем код из ответа (функция extract_code из первого примера)
code = extract_code("".join(b.text for b in response.content if b.type == "text"))
# Запускаем код агента в sandbox
execution = sbx.run_code(code)
analysis_output = "\n".join(execution.logs.stdout)
errors = "\n".join(execution.logs.stderr)
if errors:
print(f"Предупреждения: {errors}")
return analysis_outputШаг 5: Полный пайплайн с получением результатов
def full_analysis_pipeline(csv_path: str, question: str):
print(f"Запускаем анализ: {question}")
sbx = Sandbox.create(api_key=os.environ["E2B_API_KEY"])
try:
# Загружаем данные
with open(csv_path, "rb") as f:
sbx.files.write("/home/user/data.csv", f.read())
# Устанавливаем зависимости
sbx.run_code("import subprocess; subprocess.run(['pip', 'install', 'pandas', 'matplotlib', 'seaborn', '-q'], capture_output=True)")
# Агент анализирует
result = run_ai_analysis(sbx, question)
print("\n=== Результаты анализа ===")
print(result)
# Скачиваем график если есть
try:
plot_data = sbx.files.read("/home/user/plot.png")
with open("analysis_result.png", "wb") as f:
f.write(plot_data)
print("\nГрафик сохранён: analysis_result.png")
except Exception:
print("График не был создан")
finally:
sbx.kill()
print("Sandbox закрыт")
# Запуск
if __name__ == "__main__":
full_analysis_pipeline(
csv_path="sales_data.csv",
question="Найди топ-5 продуктов по выручке и покажи динамику продаж по месяцам"
)Инструменты и ресурсы
| Инструмент | Ссылка | Для чего |
|---|---|---|
| E2B | e2b.dev | AI sandbox для выполнения кода агентами |
| E2B Python SDK | pip install e2b-code-interpreter |
SDK для Python |
| E2B JS SDK | npm install @e2b/code-interpreter |
SDK для JavaScript/TypeScript |
| Modal | modal.com | Serverless для ML и heavy compute |
| Daytona | daytona.io | Open source self-hosted альтернатива E2B |
| Docker | docker.com | Базовая containerization, если нужен full control |
| Firecracker | AWS open source | Hypervisor под капотом E2B (для понимания как работает) |
| E2B Docs | docs.e2b.dev | Официальная документация с примерами |
Ключевые выводы
"Агент без sandbox — это хирург без перчаток. Может быть, обойдётся. Но зачем рисковать?"
"E2B решает одну задачу: дать агенту безопасное место для запуска кода. Это не overhead — это профессиональный стандарт для production AI-систем."
"Modal — это не sandbox, это суперкомпьютер по требованию. Если E2B — бардачок для экспериментов, то Modal — лаборатория с GPU. Для ML-агентов разница принципиальная."
Следующий урок
→ Браузерные агенты — Browserbase, Stagehand и автоматизация веба
Агенты не только пишут код — они могут управлять браузером. В следующем уроке разберём, как дать агенту возможность открывать сайты, заполнять формы, скрапить данные и автоматизировать веб-задачи через Browserbase и Stagehand.
Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс