ИИ-песочница: изоляция, выполнение кода и цены

ИИ-песочница (AI sandbox) — это изолированная среда, где ИИ-агент может выполнять код, устанавливать пакеты и работать с файлами. Ее задача — ограничить доступ этого кода к хост-машине, данным других пользователей, учетным данным и внешним сервисам.
Прежде чем выбрать среду выполнения для агента, проверьте, как она изолирует код, поддерживает ли вашу нагрузку и сколько стоит время ее работы. В этом руководстве описаны эти варианты и показан небольшой процесс выполнения с помощью Lizard SDK.
Что такое ИИ-песочница
В агентном приложении модель предлагает действие, а ваше приложение решает, где и как его выполнить. Песочница предоставляет вычислительные ресурсы для действий, требующих выполнения кода. Модель может написать там Python-скрипт, отредактировать репозиторий или запустить веб-приложение.
Этот термин также описывает бизнес-программы для тестирования ИИ-продуктов. Здесь он означает среду выполнения кода агента.
Среде выполнения нужно больше, чем просто папка для каждого пользователя. Полезная архитектура разделяет процессы и файлы, ограничивает процессор и память, а также дает приложению способ остановить работу. Для учетных данных, доступа к сети и постоянного хранилища нужны свои правила.
Например, агент, анализирующий загруженный CSV-файл, должен получить этот файл и достаточно вычислительных ресурсов для его обработки. У него нет причин читать переменные окружения веб-сервера или файлы других клиентов.
Как работает ИИ-песочница
Типичный запрос проходит следующий путь:
- Ваш бэкенд получает задачу и просит модель сгенерировать код или вызовы инструментов.
- Ваш бэкенд создает песочницу и копирует туда нужные для задачи файлы.
- Песочница выполняет код. Ваш бэкенд собирает stdout, stderr, файлы и код возврата.
- Ваш бэкенд проверяет результат перед показом пользователю или отправкой в другой сервис.
- Ваш бэкенд сохраняет нужный результат и останавливает песочницу.
Храните ключ провайдера модели и ключ управления песочницей на бэкенде. Если дать сгенерированному коду ключ управления, он сможет запрашивать дополнительные ресурсы через ваш аккаунт.
Сеансу программирования может понадобиться одна и та же песочница на несколько ходов. Для разовых вычислений можно использовать новую песочницу на каждую задачу. Решите, как долго хранить состояние и какому пользователю оно принадлежит, прежде чем добавлять повторное использование.
Docker, gVisor и Firecracker: в чем разница
Эти технологии предлагают разные границы изоляции. Остальная часть системы по-прежнему определяет, к каким файлам, сетям и учетным данным код имеет доступ.
| Подход | Где проходит граница | Что проверять |
|---|---|---|
| Стандартный контейнер Docker | Пространства имен Linux и контроль ресурсов разделяют процессы; контейнеры делят ядро хоста. | Capabilities, привилегированный режим, монтирование хоста, доступ к демону и обновления хоста. |
| gVisor | Ядро приложения в пространстве пользователя обрабатывает системные вызовы, снижая прямое воздействие на ядро хоста. | Совместимость системных вызовов и производительность для вашей нагрузки. |
| Firecracker microVM | Виртуальная машина имеет собственное гостевое ядро и использует KVM для аппаратной виртуализации. | Обновления гостя и хоста, сетевые политики, смонтированные данные и управление жизненным циклом. |
Docker может подойти для нагрузок с известным уровнем доверия и тщательно настроенным хостом. Его безопасность зависит от того, как вы его запускаете; открытие сокета Docker или широкое монтирование хоста меняет то, чем может управлять нагрузка. См. документацию по безопасности Docker.
gVisor добавляет границу ядра в пространстве пользователя, что влияет на совместимость. Firecracker использует небольшой монитор виртуальных машин и ограниченную модель устройств. Ни один из них не отменяет необходимости защищать секреты или ограничивать доступ к важным сервисам.
Lizard Sandboxes используют Firecracker. Старые тома или снапшоты, а также резервный вариант после неудачного запуска Firecracker, могут использовать среду выполнения контейнеров. Проверяйте getInfo().runtime, если вашему приложению требуется microVM. Пример ниже отклоняет любую другую среду выполнения. См. документацию Lizard Sandboxes.
Что защищает и не защищает изоляция
Песочница ограничивает последствия выполнения кода. Ваше приложение все равно должно решать, какие действия может предпринять пользователь или агент.
Учетные данные и доступ к сети
Все, что вы копируете в песочницу, становится доступным для нагрузки с заданными вами правами. Не копируйте весь .env, каталог SSH или облачные учетные данные. Если задаче нужен внешний API, дайте ей краткосрочные учетные данные с узкими правами или маршрутизируйте операцию через инструмент бэкенда, который проверяет каждый запрос.
Изоляция не означает блокировку доступа в интернет. Если код может прочитать секрет и сделать исходящие запросы, он может отправить этот секрет куда-то еще. Выберите провайдера и конфигурацию, которые соответствуют вашим требованиям к исходящей сети. Не предполагайте наличие белого списка сети без проверки настроек продукта.
Пользователи и сохраненные файлы
Назначайте каждую песочницу аутентифицированному пользователю или задаче. Проверяйте владельца при каждом запросе на выполнение кода, скачивание файла или возобновление сеанса. Угаданный ID песочницы не должен давать доступ.
Храните постоянные файлы раздельно для каждого пользователя. Повторное использование доступного для записи рабочего пространства для разных клиентов может раскрыть данные, даже если каждое выполнение получает новую виртуальную машину.
Ограничения по времени и возвращаемые результаты
Установите таймаут выполнения и время жизни песочницы. Таймаут в клиенте может остановить ожидание без остановки удаленного процесса. Очистка и истечение срока действия на стороне сервера защищают от различных сбоев.
Относитесь к возвращаемым файлам и тексту как к ненадежному вводу. Проверяйте JSON на соответствие структуре, которую ожидает ваше приложение. Экранируйте текст при его рендеринге и избегайте отдачи сгенерированного HTML на том же домене, что и панель управления аккаунтом.
Для агентов, пропускающих интерактивные подтверждения, эти меры важны еще до запуска первой команды. Наше руководство по разрешениям Claude Code описывает этот процесс.
Запуск задачи Python в Lizard Sandboxes
В этом примере Node.js используется как контроллер бэкенда, а Python — внутри песочницы. Он выполняет фиксированное вычисление, чтобы вы могли проверить путь выполнения до добавления модели. Он не вызывает LLM.
Используйте Node.js 22 или новее, проект Lizard и API-ключ Lizard. Задайте LIZARD_API_KEY и LIZARD_PROJECT_ID в окружении бэкенда. Не добавляйте их в код браузера; API-ключ должен находиться в хранилище секретов.
Установите JavaScript-клиент:
npm install @lizard-build/sdk@0.1.69Сохраните это как run-task.mjs:
import { Lizard } from "@lizard-build/sdk";
const project = process.env.LIZARD_PROJECT_ID;
if (!project || !process.env.LIZARD_API_KEY) {
throw new Error("Set LIZARD_PROJECT_ID and LIZARD_API_KEY");
}
const lizard = new Lizard({ project });
const sandbox = await lizard.create("base", {
size: "small",
timeoutMs: 120_000,
});
try {
const info = await sandbox.getInfo();
if (info.runtime !== "firecracker") {
throw new Error("This task requires the Firecracker runtime");
}
const script = [
"import json",
"values = [12, 8, 5]",
"print(json.dumps({'total': sum(values)}))",
].join("\n");
await sandbox.fs.write("/tmp/task.py", script);
const result = await sandbox.process.exec(
["python3", "/tmp/task.py"],
{ user: "user", timeoutMs: 30_000 },
);
if (result.exitCode !== 0 || result.truncated) {
throw new Error("Task failed or returned incomplete output");
}
if (Buffer.byteLength(result.stdout, "utf8") > 4096) {
throw new Error("Task output exceeds the application limit");
}
const output = JSON.parse(result.stdout);
if (
output === null ||
typeof output !== "object" ||
Array.isArray(output) ||
Object.keys(output).length !== 1 ||
output.total !== 25
) {
throw new Error("Unexpected task output");
}
console.log(output);
} finally {
await sandbox.kill();
}Запустите это с вашей машины бэкенда:
node run-task.mjs17 октября 2026 года мы запустили этот скрипт из песочницы Lizard, используя шаблон codex и Node.js 22.23.2. Он создал песочницу Small Firecracker из шаблона base, запустил Python от имени user, вывел { total: 25 } и завершил очистку с кодом возврата 0.
SDK читает LIZARD_API_KEY из окружения контроллера. Этот код не передает его в песочницу, которая выполняет Python.
Массив аргументов выполняет Python без интерполяции оболочки. Python все равно может выполнять любые операции, разрешенные песочницей. Таймаут команды в 30 секунд ограничивает время ожидания клиента; двухминутное время жизни песочницы устанавливает отдельный срок действия. Блок finally запрашивает очистку, даже если проверка вывода не удалась. См. справочник Lizard SDK.
Чтобы превратить это в инструмент агента, замените фиксированный скрипт кодом, который возвращает ваша модель, и определите схему результата для этой задачи. Оставьте авторизацию, лимиты ресурсов и проверки вывода на бэкенде. Успешный код возврата сам по себе не доказывает правильность ответа.
Что можно создать с помощью ИИ-песочницы
Анализ данных: обработайте загруженный пользователем файл, запустите Python и верните график или небольшой JSON-результат. Ограничьте размер файла и время выполнения, затем сохраните только нужный пользователю вывод.
Агенты-программисты: извлеките копию репозитория для конкретной задачи, отредактируйте файлы и запустите тесты. Проверьте изменения и результаты тестов до того, как отдельный процесс сольет или развернет изменения.
Конструкторы приложений: установите зависимости, запустите сервер разработки и предоставьте приватный предпросмотр. Держите предпросмотр отдельно от домена и аутентификации вашей панели управления. Наше руководство по созданию конструктора приложений в стиле Lovable показывает более широкий процесс работы приложения.
Браузерные агенты: используйте среду выполнения с браузером и рабочим столом, когда задаче нужно взаимодействие с интерфейсом. Относитесь к любой авторизованной сессии как к учетным данным с доступом к этому аккаунту.
Lizard Sandboxes предлагают команды оболочки, доступ к файлам и приватные HTTPS-превью. Для работы с браузером и рабочим столом используется шаблон desktop. Превью для разработки и развернутое приложение имеют разное время жизни; выберите то, что нужно вашему пользователю. См. Lizard Sandboxes.
Сколько стоит ИИ-песочница
Начните с общего времени работы, включая время между командами. Затем добавьте хранилище, вызовы моделей и любые другие сервисы, которые использует ваше приложение.
Lizard указывает следующие тарифы на вычисления по состоянию на октябрь 17 года, 2026:
| Размер | vCPU | RAM | Вычисления в час |
|---|---|---|---|
| Small | 2 | 4 ГБ | $0.0162 |
| Medium | 4 | 8 ГБ | $0.0324 |
| Large | 8 | 16 ГБ | $0.0648 |
Lizard тарифицирует вычисления посекундно во время работы песочницы, включая время простоя. Lizard Pro стоит $19 в месяц и включает использование на $19; превышение оплачивается по модели pay as you go. Persistent Volumes стоят $0.14 за ГБ в месяц. Проверьте текущие цены перед планированием бюджета.
Для 1,000 задач размера Small, каждая из которых держит песочницу запущенной пять минут:
1,000 × (5 / 60 hours) × $0.0162 = $1.35 in compute usageЭто вычислительная часть нагрузки. Ваш общий счет по-прежнему включает подписку Pro и любое использование сверх ее лимита. Токены модели оплачиваются отдельно.
Если каждая из этих задач оставит песочницу работать на лишний час, они добавят $16.20 к использованию вычислений. Явное время жизни и надежная очистка могут быть важнее небольшой разницы в почасовых ставках.
Как выбрать ИИ-песочницу
Тестируйте на задачах, которые будут запускать ваши пользователи. Быстрая команда оболочки мало что скажет о сборке репозитория или сеансе браузера.
Записывайте время запуска, время установки зависимостей, общее время задачи, сбои и общее время работы в секундах. Проверяйте самые медленные запросы, а не только медианные. Наше сравнение E2B, Daytona и Modal дает отправную точку для сравнения процессов выполнения.
Прежде чем внедрять среду выполнения, ответьте на эти вопросы:
- Что отделяет код и файлы одного клиента от другого?
- К каким секретам и внешним сервисам может получить доступ сгенерированный код?
- Может ли среда выполнять языки, пакеты и браузерные инструменты, нужные для задачи?
- Что происходит при сбое контроллера или потере соединения?
- Какие файлы сохраняются после выключения и как их резервировать?
- Сколько будет стоить полная нагрузка с учетом времени простоя, хранилища и вызовов модели?
Для первой реализации начните с одной задачи, одной временной песочницы и небольшого проверенного результата. Создайте Lizard Sandboxes, измерьте этот процесс, а затем добавьте постоянное хранение или более длинные сеансы, когда они понадобятся приложению.
Разрабатывайте с ИИ. Развёртывайте с Lizard.
Вам не нужна платформенная команда, чтобы выйти в продакшн. Весь ваш облак — в одной команде CLI.
- Сервисы
- —
- Аддоны
- —
- Развёртывания
- —
- Запуски Sandboxes
- —