Библиотека · Автономные агенты и мультиагентные системы

AI Sandboxes — E2B и Modal для безопасного выполнения кода агентами

Инженер60 минОбновлено: октябрь 2026
72 из 105 в библиотеке

Модуль: 18. Advanced Orchestration | Время: ~25 мин теории + 35 мин практики


Суть урока

Когда агент пишет и запускает код — кто несёт ответственность за то, что этот код натворит? Если агент запустит rm -rf / или случайно удалит базу данных — последствия будут на твоей машине, у твоего клиента, в продакшне.

Sandboxes решают эту проблему радикально: агент получает изолированную среду — виртуальный контейнер — где он может запускать любой код, читать и писать файлы, делать сетевые запросы. Но всё это происходит внутри «клетки». Снаружи — нетронутый мир.

🎨 Образ: Sandbox — это как бардачок в машине, в котором ты держишь всё, что может протечь, рассыпаться или взорваться. Сам автомобиль остаётся чистым.

В этом уроке разберём два главных инструмента: 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 — без изоляции последствия мгновенно выйдут за пределы задуманного.

Три главных сценария, где нужна изоляция:

  1. Запуск ненадёжного кода. Агент-программист, который пишет и тестирует код по задаче пользователя. Код может быть корректным по логике, но опасным по побочным эффектам.

  2. Анализ данных без риска. Агент-аналитик, которому дают CSV, Excel, или базу данных для исследования. Лучше, чтобы он работал с копией в sandbox, а не с оригиналом.

  3. Тестирование перед продакшном. Агент-деплойер проверяет, что сборка работает, запускает тесты — и только потом даёт добро на реальный деплой.

🎨 Образ: Sandbox для агента — как лаборатория химика. Там можно смешивать что угодно, взрывы допустимы, и именно для этого там вытяжка, фартук и защитные очки. В жилую комнату с реактивами не заходят.

E2B — Sandboxes специально для AI-агентов

E2B (e2b.dev) — компания, которая сделала одну вещь и сделала её хорошо: микровиртуальные машины для выполнения кода агентами.

Ключевые характеристики E2B:

  • Быстрый старт: порядка секунды. Обычный Docker-контейнер обычно стартует заметно дольше. E2B использует облегчённые виртуальные машины на основе Firecracker (технология AWS), которые поднимают изолированную среду очень быстро.

  • Python и JavaScript SDK. Управляй sandbox через код: создал, запустил команду, получил результат, закрыл.

  • Persistent filesystem. Файлы, которые создал агент в sandbox, сохраняются на протяжении всей сессии. Можно скачать результат обратно после работы.

  • Сетевой доступ. По умолчанию sandbox имеет выход в интернет — агент может скачивать пакеты, делать API-запросы.

  • Кастомные шаблоны. Можно создать свой template с предустановленными зависимостями, чтобы не устанавливать их каждый раз.

Пример — агент-программист на Python с E2B:

python
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 (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. Постоянное хранилище для моделей, датасетов, результатов.

  • Параллельные задачи. Запускать тысячи задач параллельно без инфраструктуры.

🎨 Образ: Если E2B — это бардачок для опасных экспериментов агента, то Modal — это целый научный институт с суперкомпьютером, лабораториями и расписанием. Используешь только то, что нужно, платишь за реально потраченное время.

Пример — запуск ML-модели на GPU через Modal:

python
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.

🎨 Образ: Sandbox — это тюрьма с прогулочным двором. Заключённый не выйдет за стены, но с помощью нелегальной записки может попросить сообщника снаружи что-то сделать. Полная безопасность требует и мониторинга исходящих запросов.

Стоимость

Оба сервиса берут плату посекундно за реальное время работы, простой не оплачивается, и в обоих можно начать бесплатно. У 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: Установка и настройка

bash
# Установить 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

python
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

python
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: Агент анализирует данные

python
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: Полный пайплайн с получением результатов

python
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.

Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс