agentOS запуск ИИ-агентов в защищённой песочнице Linux

Я израсходовал половину своего бюджета на тестовую среду E2B всего за две недели, запуская контейнеры для ИИ-агентов, которые зачастую работали всего восемь секунд. Я занимался интеграцией ИИ-агентов по написанию кода в несколько скриптов автоматизации на бэкенде TecMints. Эти агенты генерировали черновик, запускали команду, проверяли результат и повторяли процесс до завершения задачи.

Поскольку я не хотел, чтобы агент ИИ запускал произвольные команды оболочки непосредственно на моём боевом сервере, для каждой задачи требовалась собственная изолированная среда. Как и многие, я начал с Docker, а позже перешёл на хостируемый сервис тестовой среды, когда время запуска Docker стало узким местом.

Сначала всё работало хорошо, но со временем и стоимость, и задержка при запуске стали слишком заметными.

Однако когда ИИ-агент создаёт новую песочницу для каждой задачи, повторной попытки или небольшого шага, эта задержка быстро накапливается. К тому же я платил за виртуальную машину объёмом 1 ГБ даже в тех случаях, когда она использовалась лишь для выполнения простой двухстрочной команды оболочки.

Именно тогда я наткнулся на agentOS — проект с открытым исходным кодом от команды Rivet.

Прежде чем продолжить, важно понять, что на самом деле представляет собой agentOS, поскольку его название может ввести в заблуждение. Это не инструмент командной строки, который устанавливается с помощью менеджера пакетов и используется так же, как eza или bat.

На самом деле это библиотека Node.js, позволяющая запускать изолированную виртуальную машину, похожую на Linux, непосредственно внутри вашего бэкенд-приложения. Она включает версии многих знакомых утилит GNU на основе WebAssembly, таких как coreutils, grep, sed, gawk, findutils, tar, gzip и других.

Это различие важно, поэтому я подробно расскажу, как именно я его настроил.

Что на самом деле делает agentOS

agentOS — это ядро операционной системы, работающее внутри процесса, написанное на языке Rust и распространяемое в виде пакета npm. Когда вы вызываете AgentOs.create() в своём приложении Node.js, оно создаёт виртуальную среду, похожую на Linux, внутри вашего существующего процесса. Эта среда включает виртуальную файловую систему, таблицу процессов, каналы, PTY (псевдотерминалы) и виртуальный сетевой стек.

Важно то, что на вашей хост-системе ничего не запускается. Он не создает контейнер Docker, не загружает виртуальную машину и не скачивает образ контейнера.

Всё работает внутри вашего процесса Node.js, поэтому agentOS может запускаться всего за несколько миллисекунд вместо сотен миллисекунд, которые часто требуются контейнерам.

Внутри этой виртуальной среды agentOS запускает программные пакеты, скомпилированные в виде бинарных файлов WebAssembly (WASM). Эти пакеты предоставляют команды Linux, которые ведут себя очень похоже на те, которыми вы уже пользуетесь каждый день.

В рамках проекта ведётся реестр пакетов, включающий такие знакомые инструменты, как coreutils, grep, sed, gawk, findutils, diffutils, tar, gzip, curl, jq, ripgrep, fd, tree, file, yq, zip и unzip.

По умолчанию эти инструменты запускаются со строгими ограничениями безопасности. Они не могут получить доступ к вашим файлам хостов, сети или процессам, если вы явно не разрешите это. Это делает среду гораздо более безопасной для выполнения команд, сгенерированных ИИ.

Помимо виртуальной машины, agentOS также включает три встроенных агента для программирования:

  1. Pi,
  2. Claude Code,
  3. OpenCode.

Эти агенты взаимодействуют с помощью протокола Agent Communication Protocol (ACP).

Ваше приложение Node.js создает сессию, отправляет запрос агенту, и агент выполняет свою работу полностью внутри песочницы. Он может читать и записывать файлы, выполнять команды Linux с помощью встроенных утилит WASM и решать задачи по программированию без прямого доступа к вашей хост-системе.

Если вы хотите, чтобы агент работал с файлами на вашем сервере, вам необходимо явно смонтировать эти каталоги в виртуальную среду.

Прежде чем приступить к работе, убедитесь, что у вас есть следующее:

  • Сервер Linux под управлением Ubuntu 22.04 или более поздней версии, Debian 12 или более поздней версии, либо RHEL 9 / Rocky Linux 9 или более поздней версии с доступом к терминалу.
  • Node.js 18 или более поздней версии, а также npm.
  • Базовые знания JavaScript, поскольку agentOS используется в качестве библиотеки Node.js, а не как отдельный инструмент командной строки.
  • Ключ API Anthropic, если вы планируете использовать встроенные агенты Pi или Claude Code. Его можно создать в консоли Anthropic. Если вы хотите только поэкспериментировать с песочницей и запускать команды Linux с помощью vm.exec(), ключ API вам не понадобится.

Примечание: Я выполнял всю эту инструкцию на VPS с Rocky Linux 9, имеющем 2 виртуальных процессора (vCPU) и 2 ГБ оперативной памяти. agentOS потребляет очень мало памяти, что является одним из его главных преимуществ по сравнению с запуском отдельного контейнера или виртуальной машины для каждой задачи.

Шаг 1: Установка Node.js

agentOS требует Node.js 18 или более поздней версии. Сначала установите Node.js и npm с помощью менеджера пакетов вашего дистрибутива.

В Ubuntu/Debian

sudo apt update
sudo apt install -y nodejs npm

В RHEL/Rocky Linux

sudo dnf install -y nodejs npm

После установки проверьте версии:

node -v
npm -v

Пример вывода:

v24.18.0
11.16.0

Для поддержки своих API agentOS требует Node.js 18 или более поздней версии. Если ваш дистрибутив предоставляет более старую версию, установите более новую версию из репозитория NodeSource вместо использования пакета по умолчанию.

Шаг 2: Создание проекта и установка agentOS

В отличие от Docker или других системных служб, agentOS работает полностью внутри проекта Node.js. Не требуется устанавливать системный пакет или запускать службу.

Создайте новый каталог проекта и инициализируйте его с помощью npm:

mkdir ~/agentos-demo
cd ~/agentos-demo
npm init -y

Вы должны увидеть вывод, похожий на следующий:

Wrote to /home/ravi/agentos-demo/package.json:
{
  "name": "agentos-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "commonjs"
}

Затем установите основную библиотеку agentOS вместе с общим программным пакетом и агентом программирования для Pi:

npm install rivet-dev/agentos-core \
            agentos-software/common \
            @agentos-software/pi

Установка может занять несколько минут в зависимости от вашего интернет-соединения. Вы также можете увидеть вывод, похожий на следующий:

npm WARN deprecated mariozechner/pi-ai0.60.0: please use earendil-works/pi-ai instead going forward
npm WARN deprecated mariozechner/pi-coding-agent@0.60.0: please use @earendil-works/pi-coding-agent instead going forward
added 359 packages, and audited 360 packages in 3m
69 packages are looking for funding
  run `npm fund` for details
8 vulnerabilities (2 low, 5 moderate, 1 high)
To address issues that do not require attention, run:
  npm audit fix
Some issues need review and may require choosing
a different dependency.
Run `npm audit` for details.

Не беспокойтесь, если во время установки появятся предупреждения об устаревших компонентах или уязвимостях. Они связаны с некоторыми зависимостями проекта и являются обычным явлением во многих проектах Node.js.

Пакеты всё равно установлены успешно, поэтому вы можете переходить к следующему шагу. Если вы планируете использовать agentOS в производственной среде, рекомендуется ознакомиться с отчётом npm audit и поддерживать зависимости в актуальном состоянии.

Каждый из трёх установленных вами пакетов выполняет свою роль:

  • @rivet-dev/agentos-core предоставляет основной движок agentOS, который создаёт виртуальную файловую систему, таблицу процессов, сетевой стек и управляет сессиями агентов.
  • @agentos-software/common устанавливает набор утилит Linux на основе WebAssembly, включая coreutils, grep, sed, gawk, findutils, diffutils, tar и gzip.
  • @agentos-software/pi устанавливает Pi — одного из встроенных агентов по программированию, доступных в agentOS, наряду с Claude Code и OpenCode.

Шаг 3: Запустите свой первый сеанс агента

Если вы хотите использовать встроенный агент Pi, вам сначала необходимо указать свой ключ API Anthropic. Проще всего экспортировать его в качестве переменной среды в текущем сеансе терминала, чтобы не пришлось вписывать его напрямую в скрипт.

export ANTHROPIC_API_KEY="your-api-key-here"

Теперь создайте файл с именем index.mjs, содержащий следующий код:

cat > index.mjs  {
  console.log(event);
});
await vm.prompt(sessionId, "Write a hello world script to /home/agentos/hello.js");
const content = await vm.readFile("/home/agentos/hello.js");
console.log(new TextDecoder().decode(content));
vm.closeSession(sessionId);
await vm.dispose();
EOF

Этот скрипт выполняет следующие задачи:

  • Создает новую виртуальную машину agentOS.
  • Загружает общие утилиты Linux и агент программирования Pi.
  • Запускает новую сессию агента Pi.
  • Передает вашему агенту ключ API Anthropic.
  • Запрашивает у агента создание простой программы на JavaScript Hello World.
  • Считывает сгенерированный файл из виртуальной файловой системы и выводит его содержимое.
  • Закрывает сессию и удаляет виртуальную машину.

Запустите скрипт с помощью команды:

node index.mjs

Если всё работает правильно, вы увидите вывод, похожий на следующий:

{ type: 'session_start', sessionId: 'sess_8f2a1c' }
{ type: 'agent_message', text: 'Writing hello.js now.' }
{ type: 'tool_call', name: 'write_file', path: '/home/agentos/hello.js' }
{ type: 'session_end', sessionId: 'sess_8f2a1c' }
console.log("Hello, World!");

Последняя строка — это содержимое файла hello.js, созданного агентом. Скрипт считывает файл из виртуальной файловой системы с помощью vm.readFile() и выводит его в ваш терминал.

Обратите внимание, что файл существует только внутри виртуальной среды agentOS. Он не записывается в реальную файловую систему вашего сервера. Как только скрипт вызывает vm.dispose(), Виртуальная машина уничтожается вместе со всем, что в ней хранится. Если вы хотите, чтобы файлы сохранялись, вам необходимо явно смонтировать каталог из вашей хост-системы в виртуальную среду.

Совет: Обратите внимание на то, как быстро запускается сессия после запуска node index.mjs. На моём VPS с Rocky Linux 9 первое событие session_start произошло менее чем через 10 миллисекунд. Это одно из главных преимуществ agentOS: он запускается практически мгновенно, поскольку не требуется ни загрузка образа контейнера, ни запуск виртуальной машины.

Шаг 4: Запуск команд Linux без ИИ-агента

Одно из преимуществ agentOS заключается в том, что вам не обязательно использовать ИИ-агент. Вы можете использовать его в качестве облегчённой песочницы для выполнения команд Linux, вызывая vm.exec() напрямую.

Создайте новый файл с именем shell-test.mjs:

cat > shell-test.mjs

Теперь запустите скрипт:

node shell-test.mjs

Если команда выполнится успешно, вы увидите вывод, похожий на этот:

{
  stdout: 'tecmint rocks\n',
  stderr: '',
  exitCode: 0
}

Вот что происходит «за кулисами»:

  • echo 'tecmint rocks' выводит текст внутри виртуальной среды.
  • Труба (|) отправляет этот вывод напрямую в следующую команду, точно так же, как это происходило бы в обычной оболочке Linux.
  • grep -i tecmint ищет слово tecmint без учёта регистра букв и возвращает строку, соответствующую поисковому запросу.

Хотя команды выглядят как обычные Linux-команды, на самом деле это версии на WebAssembly, выполняющиеся внутри виртуальной среды agentOS. Они не выполняются в вашей хост-системе и не взаимодействуют с вашей реальной оболочкой.

Я также проверил, что происходит, если попытаться запустить недоступную команду или забыть загрузить необходимый пакет программного обеспечения. Вместо сбоя agentOS возвращает структурированную ошибку с ненулевым кодом завершения. Это значительно упрощает обнаружение сбоев и их обработку в вашем приложении, особенно когда команды генерируются ИИ-агентом.

Совет: Если вам нужна только безопасная среда для выполнения команд Linux, vm.exec() зачастую будет достаточным. Вы можете добавить ИИ-агента позже, когда вашему приложению понадобится автоматически генерировать или изменять команды.

Шаг 5: Почему важна быстрая загрузка

Одним из главных преимуществ agentOS является скорость запуска новой виртуальной среды.

Согласно тестам, опубликованным разработчиками проекта, типичный экземпляр agentOS запускается примерно за 5 миллисекунд, тогда как запуск традиционной хостируемой песочницы может занять около 440 миллисекунд. При более интенсивных нагрузках эта разница становится ещё больше.

Потребление памяти также значительно ниже. Типичная сессия программирования в agentOS использует около 130 МБ памяти, тогда как многие хостируемые сервисы песочниц выделяют виртуальную машину объёмом 1 ГБ для каждой сессии, поскольку им приходится загружать целую операционную систему.

Для приложений, создающих большое количество кратковременных сеансов агента, эти различия могут иметь значительное влияние. Более быстрый запуск сокращает время ожидания, а меньшее потребление памяти позволяет запускать больше сеансов агента на одном и том же сервере.

Тем не менее, agentOS не предназначена для замены всех типов песочниц. Если вашей рабочей нагрузке требуется запускать веб-браузер, компилировать нативные приложения или запускать программное обеспечение, недоступное в виде пакета WebAssembly, вам по-прежнему понадобится полноценная виртуальная машина или контейнер.

В таких ситуациях agentOS может работать совместно с внешними поставщиками песочниц, подключаясь к реальной песочнице только тогда, когда это действительно необходимо.

Предупреждение: По умолчанию виртуальная среда agentOS не имеет доступа к файлам вашего хоста или к сети, если вы явно не разрешите это. Однако приложение Node.js, на котором запущен agentOS, по-прежнему обладает всеми правами, которые вы ему предоставили, включая доступ к переменным среды, таким как ваш ключ API Anthropic. Всегда рассматривайте ваше приложение Node.js как часть доверенной среды и следуйте стандартным рекомендациям по безопасности.

Обновление agentOS

Как и большинство пакетов npm, agentOS регулярно обновляется. Вы можете проверить, доступна ли более новая версия, выполнив команду:

npm outdated @rivet-dev/agentos-core

Пример вывода:

Package                   Current  Wanted  Latest  Location
@rivet-dev/agentos-core     0.2.5   0.2.7   0.2.7  agentos-demo

Если обновления доступны, установите их с помощью команды:

npm update rivet-dev/agentos-core \
           agentos-software/common \
           @agentos-software/pi

Также рекомендуется следить за релизами проекта на github. Новые версии основной библиотеки и программных пакетов часто выпускаются независимо друг от друга, поэтому вы можете увидеть добавленные новые утилиты для Linux на основе WebAssembly, даже если основной пакет не изменился.

Если вы используете agentOS в производственной среде, рекомендуется зафиксировать версии пакетов в файле package.json и тестировать новые релизы перед их развертыванием на серверах.

Заключение

Теперь у вас есть рабочий проект agentOS, который создаёт изолированную среду, похожую на Linux, запускает привычные команды Linux с помощью инструментов на основе WebAssembly и может безопасно передавать эту среду агенту по программированию на базе ИИ. Поскольку agentOS запускает всё внутри лёгкой виртуальной среды, нет необходимости запускать контейнер или виртуальную машину для каждой задачи.

Отличительной чертой agentOS является его направленность. Вместо того чтобы заменять традиционные решения для создания песочниц, он предлагает быструю и лёгкую среду для выполнения кратковременных задач агентов и команд Linux. Для многих рабочих процессов автоматизации это может означать сокращение времени запуска, снижение потребления памяти и уменьшение затрат на инфраструктуру.

Прежде чем добавлять ИИ-агента в своё приложение, попробуйте немного поработать с vm.exec() самостоятельно. Попробуйте запустить несколько распространённых команд Linux, построить простые конвейеры и намеренно выполнить недопустимую команду, чтобы увидеть, как agentOS сообщает об ошибках. Это поможет вам понять, на что способны встроенные инструменты WebAssembly и где пролегают их ограничения.

Если вашему приложению в конечном итоге понадобятся такие функции, как запуск браузера, компиляция нативного кода или выполнение программного обеспечения, выходящего за рамки доступных пакетов WASM, вы всегда можете объединить agentOS с традиционным решением на основе песочницы для этих конкретных рабочих нагрузок.

По мере развития проекта стоит поэкспериментировать с реальными рабочими нагрузками, чтобы понять, где он лучше всего впишется в ваш собственный конвейер автоматизации. Легкая архитектура делает его интересным вариантом для автоматизации Linux на базе ИИ, особенно когда важны быстрый запуск и эффективное использование ресурсов.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Похожие статьи

Комментарии (0)

Автар по умолчанию