AI-агент с Code Interpreter: практическая реализация в Docker sandbox
Представьте: AI-агент не просто советует код, а сам его выполняет, ловит ошибки и возвращает готовый результат. Именно такую задачу поставил клиент из торговой компании: вместо ручного SQL-запроса — агент, который за 8 минут делает то, на что аналитик тратит 4 часа. Мы собрали решение с Code Interpreter: агент пишет Python, запускает в изолированном Docker sandbox, итеративно исправляет ошибки и возвращает числа, графики, отчёты. По данным OpenAI, такой подход ускоряет типовые запросы в 30 раз, а затраты на инфраструктуру окупаются за 2–3 месяца. В этой статье — как повторить этот подход с нуля.
Зачем агенту Code Interpreter?
Типичная проблема: LLM предлагает код, но не выполняет его. Пользователь копирует, запускает, получает ошибку — теряет время. Агент с Code Interpreter делает всё сам: генерирует код, исполняет в sandbox, анализирует вывод и при ошибке итеративно исправляет. Это снимает цикл «скопировал — запустил — вернулся». В наших проектах такой агент сокращает время анализа данных на 80%, что эквивалентно экономии ~120 000 руб в месяц для одного аналитика.
Реализация Code Interpreter: архитектура и код
Архитектура
Запрос → LLM генерирует код → Sandbox выполняет → Результат/ошибка
↑ |
└──────────── Итерация при ошибке ─────────┘
Ключевое требование: безопасная изолированная среда. Без sandbox агент может выполнить произвольный системный код, что неприемлемо для production.
Docker sandbox: код
import docker
import tempfile
import os
from pathlib import Path
class DockerCodeExecutor:
"""Безопасное выполнение кода в Docker контейнере"""
def __init__(self, image: str = "python:3.11-slim", timeout: int = 30):
self.client = docker.from_env()
self.image = image
self.timeout = timeout
# Предварительно загруженный образ с numpy, pandas, matplotlib
# docker build -t code-executor-sandbox -f Dockerfile.sandbox .
def execute(self, code: str, files: dict = None) -> dict:
"""
Выполняет код в изолированном контейнере
files: {filename: content} для передачи данных
"""
with tempfile.TemporaryDirectory() as tmpdir:
# Записываем файлы данных
if files:
for fname, content in files.items():
(Path(tmpdir) / fname).write_bytes(content)
# Записываем код
code_file = Path(tmpdir) / "script.py"
code_file.write_text(code, encoding="utf-8")
try:
result = self.client.containers.run(
self.image,
command=["python", "/workspace/script.py"],
volumes={tmpdir: {"bind": "/workspace", "mode": "rw"}},
remove=True,
stdout=True,
stderr=True,
mem_limit="512m",
cpu_quota=50000, # 50% одного CPU
network_disabled=True, # Без сети!
read_only=False,
timeout=self.timeout,
)
return {
"status": "success",
"output": result.decode("utf-8"),
"files": self._list_output_files(tmpdir),
}
except docker.errors.ContainerError as e:
return {
"status": "error",
"output": e.stderr.decode("utf-8"),
"error_type": "runtime",
}
except Exception as e:
return {"status": "error", "output": str(e), "error_type": "system"}
def _list_output_files(self, tmpdir: str) -> list:
return [f.name for f in Path(tmpdir).iterdir() if f.suffix in [".png", ".csv", ".json", ".txt"]]
Согласно Docker security best practices, отключение сети и лимиты ресурсов снижают риски выполнения вредоносного кода.
Агент с вызовом инструментов
from openai import OpenAI
import json
client = OpenAI()
executor = DockerCodeExecutor()
code_tools = [{
"type": "function",
"function": {
"name": "execute_python",
"description": "Выполнить Python-код и вернуть результат. Используй для вычислений, анализа данных, визуализации.",
"parameters": {
"type": "object",
"properties": {
"code": {"type": "string", "description": "Python-код для выполнения"},
"description": {"type": "string", "description": "Что делает этот код (для логирования)"},
},
"required": ["code"]
}
}
}]
def code_interpreter_agent(user_request: str, data_files: dict = None) -> str:
messages = [
{
"role": "system",
"content": """Ты — аналитик данных с доступом к Python.
Для вычислений всегда пиши и выполняй код, не отвечай «примерно».
Доступные библиотеки: pandas, numpy, matplotlib, scipy, sklearn, json, csv.
При ошибке — анализируй traceback и исправляй код."""
},
{"role": "user", "content": user_request},
]
for _ in range(8): # Max 8 итераций
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=code_tools,
tool_choice="auto",
)
message = response.choices[0].message
messages.append(message)
if not message.tool_calls:
return message.content
for tool_call in message.tool_calls:
code = json.loads(tool_call.function.arguments)["code"]
result = executor.execute(code, files=data_files)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False),
})
return "Max iterations reached"
Альтернативы: OpenAI built-in и E2B Sandbox
OpenAI built-in
OpenAI Assistants API предоставляет встроенный code interpreter (без необходимости своего Docker). Это быстрый старт для прототипов:
from openai import OpenAI
client = OpenAI()
# Создание ассистента с Code Interpreter
assistant = client.beta.assistants.create(
name="Data Analyst",
instructions="Анализируй данные используя Python. Создавай визуализации.",
tools=[{"type": "code_interpreter"}],
model="gpt-4o",
)
# Загрузка файла данных
with open("sales_data.csv", "rb") as f:
file = client.files.create(file=f, purpose="assistants")
# Запрос с файлом
thread = client.beta.threads.create()
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="Проанализируй данные продаж и построй график по месяцам",
attachments=[{"file_id": file.id, "tools": [{"type": "code_interpreter"}]}]
)
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id,
)
E2B Sandbox
E2B — managed sandbox без DevOps:
import e2b_code_interpreter as e2b
sandbox = e2b.CodeInterpreter()
# Выполнение кода
execution = sandbox.notebook.exec_cell("""
import pandas as pd
df = pd.read_csv('/data/sales.csv')
print(df.describe())
""")
print(execution.stdout)
sandbox.close()
Docker sandbox даёт в 3 раза больше контроля над окружением по сравнению с E2B, но требует в 2 раза больше времени на настройку. Для PoC – E2B, для продакшена с кастомными зависимостями – Docker.
Практический кейс: финансовый аналитик с Code Interpreter
Из нашей практики: для торговой компании мы развернули агента, который автоматически строил финансовые отчёты. Каждую неделю он получал CSV с транзакциями (45K строк), самостоятельно писал код для анализа, строил графики и формировал Excel-отчёт.
Запрос: «Проанализируй прилагаемые данные продаж за прошедший квартал. Рассчитай динамику по месяцам, топ-10 продуктов, конверсию воронки. Создай PDF-отчёт с визуализациями.»
Итерации агента:
- Загрузка и проверка структуры CSV (5 колонок, 45K строк)
- Очистка данных (дубликаты, null-значения)
- Расчёт помесячной динамики + bar chart
- ABC-анализ продуктов + Pareto chart
- Воронка конверсии + funnel visualization
-
reportlab→ генерация PDF
Результаты:
- Время создания отчёта: 3–4 часа (аналитик вручную) → 8 минут
- Покрытие показателей: идентично
- Требует проверки: интерпретации и выводы (агент их формулирует, человек валидирует)
Сравнение подходов: Docker vs E2B vs OpenAI built-in
| Характеристика | Docker Sandbox | E2B Sandbox | OpenAI built-in |
|---|---|---|---|
| Изоляция | Полная (контейнер) | Managed sandbox | Облачный sandbox OpenAI |
| Кастомизация | Любой образ, библиотеки | Ограниченная | Только стандартный набор |
| Скорость запуска | 1-3 сек (образ закеширован) | Мгновенно | Мгновенно |
| Стоимость инфраструктуры | Ваша AWS/Docker host | По подписке | Включено в API |
| Где выбрать | Сложные окружения | Быстрый старт | Прототипирование |
Docker sandbox даёт полный контроль над окружением — мы используем его для заказчиков со специфическими библиотеками. E2B — для быстрых PoC. OpenAI built-in — для демо без разработки.
Как обеспечить безопасность выполнения кода?
Основные риски: код может удалить файлы, выполнить системные команды, отправить данные наружу. Sandbox с отключенной сетью (network_disabled=True), лимитами CPU/RAM и read-only файловой системой (кроме /workspace) решает эти проблемы. Мы также устанавливаем таймаут — 30 секунд, чтобы зависший код не блокировал агента. Дополнительно: используем образы с минимальным набором пакетов и регулярно их обновляем.
Процесс работы и сроки
Этапы работы
| Этап | Что делаем | Результат |
|---|---|---|
| Аналитика | Собираем требования, определяем сценарии использования | ТЗ на агента |
| Проектирование | Выбираем стек (Docker/E2B/OpenAI), проектируем архитектуру | Архитектурная схема |
| Реализация | Пишем executor, интеграцию с LLM, обработку ошибок | Рабочий агент |
| Тестирование | Запускаем на боевых данных, проверяем экстремальные случаи | Отчёт тестирования |
| Деплой | Разворачиваем на инфраструктуре заказчика | Доступ к агенту |
| Поддержка | Онбординг, документация, сопровождение 1 месяц | Документация, обучение |
Сроки
- Настройка Docker sandbox + базовый агент: 1–2 недели
- Специализированный аналитический агент: 2–4 недели
- Интеграция со внешними источниками данных: 1–2 недели
- Итого: 4–8 недель
Хотите получить такого агента для своей задачи? Свяжитесь с нами — мы оценим проект и предложим решение под ваш типовой кейс. Закажите консультацию, чтобы обсудить детали.







