Создание AI-агента с Code Interpreter: выполнение кода в sandbox

AI-агент с Code Interpreter: практическая реализация в Docker sandbox

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

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%, что эквивалентно экономии ~$1.1k–1.6k в месяц для одного аналитика.

Реализация 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-отчёт с визуализациями.»

Итерации агента:

  1. Загрузка и проверка структуры CSV (5 колонок, 45K строк)
  2. Очистка данных (дубликаты, null-значения)
  3. Расчёт помесячной динамики + bar chart
  4. ABC-анализ продуктов + Pareto chart
  5. Воронка конверсии + funnel visualization
  6. 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 недель

Хотите получить такого агента для своей задачи? Свяжитесь с нами — мы оценим проект и предложим решение под ваш типовой кейс. Закажите консультацию, чтобы обсудить детали.