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

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

Сначала всё работало хорошо, но со временем и стоимость, и задержка запуска стали слишком заметны. Сама по себе песочница, запускающаяся за 400-900 миллисекунд, не кажется медленной.

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

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

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

На самом деле это Node.js-библиотека, позволяющая запускать изолированную Linux-подобную виртуальную машину прямо внутри вашего бэкенд-приложения. Она включает WebAssembly-версии многих привычных утилит GNU, таких как 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 включает три встроенных агента для написания кода: Pi, Claude Code и OpenCode. Эти агенты общаются по протоколу Agent Communication Protocol (ACP).

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

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

Совет: Если вы создаёте автоматизацию на базе ИИ на Linux-сервере и хотите сначала разобраться в основах, курс AI for Linux на Pro TecMint охватывает весь процесс от настройки до развёртывания.

Предварительные требования

Перед началом убедитесь, что у вас есть:

  • 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 Console. Если вы хотите только поэкспериментировать с песочницей и выполнять 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

agentOS нужна версия Node.js 18 или выше для поддержки своих API. Если ваш дистрибутив предлагает более старую версию, установите актуальный выпуск из репозитория 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/[[email protected]](/cdn-cgi/l/email-protection): please use @earendil-works/pi-ai instead going forward
npm WARN deprecated @mariozechner/[[email protected]](/cdn-cgi/l/email-protection): 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 в production, стоит просмотреть отчёт 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 << 'EOF' import { AgentOs } from "@rivet-dev/agentos-core"; import common from "@agentos-software/common"; import pi from "@agentos-software/pi"; const vm = await AgentOs.create({ software: [common, pi] }); const { sessionId } = await vm.createSession("pi", { env: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY }, }); vm.onSessionEvent(sessionId, (event) => {
  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.

  • Передаёт агенту ваш ключ 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. На нашем Rocky Linux 9 VPS первое событие session_start появлялось менее чем через 10 миллисекунд. Это одно из главных преимуществ agentOS — он запускается практически мгновенно, потому что не нужно скачивать образ контейнера или загружать виртуальную машину.

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

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

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

cat > shell-test.mjs << 'EOF'
import { AgentOs } from "@rivet-dev/agentos-core";
import common from "@agentos-software/common";

const vm = await AgentOs.create({ software: [common] });

const result = await vm.exec("echo 'tecmint rocks' | grep -i tecmint");

console.log(result);

await vm.dispose();
EOF

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

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

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

Заключение

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

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

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

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

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