Мой блог
Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер
За последние месяцы профильные каналы и издания переполнены публикациями об автономных ИИ-агентах. Тема OpenClaw, Hermes и их многочисленных аналогов не сходит с уст разработчиков. Я внимательно изучил ключевые материалы, проверил решения на практике и хочу систематизировать накопленный опыт.
На первом этапе складывалось впечатление, что перед нами очередной технологический пузырь, разогретый громкими маркетинговыми обещаниями. Популяризаторы сулят каждому персонального цифрового ассистента, способного самостоятельно обрабатывать почту, управлять задачами и функционировать без остановки. Но при детальном погружении возникает логичный вопрос: где реальный практический прорыв в повседневных процессах? Большинство показушных сценариев либо с трудом окупают затраченную инфраструктуру, либо гораздо быстрее решаются прямым запросом в обычный чат с нейросетью.
Критиковать OpenClaw или аналогичные проекты как готовые пользовательские приложения вполне оправданно. Однако рассматривать их исключительно в таком ключе — фундаментальное заблуждение. Как только меняется угол зрения, становится очевидным: главная трансформация произошла не в интерфейсах для конечного пользователя, а в инженерных подходах к интеграции языковых моделей с внешним миром.












В этом руководстве мы подробно разберем, почему агентный подход переживает второе рождение, изучим внутреннее устройство автономных циклов и с нуля соберем, настроим и развернем собственного ИИ-агента на удаленном сервере.
От AutoGPT к современным агентам: почему концепция заработала только сейчас
Предшественники современных фреймворков появились еще весной 2023 года, когда индустрию всколыхнул релиз AutoGPT. Логика работы была аналогичной: зацикленные обращения к LLM, интерпретация ответов и последовательный вызов внешних скриптов. Репозиторий мгновенно набрал рекордное количество звезд на GitHub, но первоначальный ажиотаж быстро сменился разочарованием.
Причина кроется в ограничениях действовавших тогда нейросетей. Модели уровня GPT-4 с трудом удерживали длительный контекст в многошаговых сценариях: они сбивались с алгоритма, циклились на одних и тех же действиях, ошибались при формировании аргументов для функций и теряли итоговую цель. Сама программная обвязка была работоспособной, но управляющему ядру не хватало точности мышления.
Качественный перелом произошел с выходом нового поколения флагманских моделей — Claude 4.5, GPT-5.1, DeepSeek V3.2/v4 и их аналогов. Имея высокий уровень рассуждений и работы с инструментами, они позволили ранее созданной архитектуре раскрыться в полной мере. Теперь автономный цикл способен доводить сложные многоходовые поручения до логического финала.

При этом бутылочное горлышко переместилось из области возможностей LLM в плоскость инфраструктуры и прав доступа. Автономным системам по-прежнему не хватает безопасных платежных шлюзов, методов авторизации в закрытых сервисах и стандартизированных API. Попросить бота узнать погоду не имеет смысла — это быстрее сделать вручную. А вот сценарий «заказать продукты по кулинарному рецепту с оплатой и доставкой» упирается в отсутствие готовых интерфейсов взаимодействия между ИИ и торговыми площадками.
Поэтому OpenClaw, Hermes и подобные фреймворки стоит воспринимать не как коробочные продукты, а как инженерную обвязку — каркас, обеспечивающий запуск циклов, хранение контекста и связь нейросети с внешним миром. Понимание этих механизмов становится базовым требованием для современного разработчика.
Архитектура и принципы работы ИИ-агента
В основе любого автономного ИИ-агента лежит управляющий цикл, опирающийся на три ключевых элемента: внешнее событие для старта, итеративный процесс принятия решений и критерий завершения работы.

Триггер и стартовый импульс
Автономный процесс не возникает самопроизвольно. Входной точкой служит внешний сигнал: входящее сообщение в Telegram, команда планировщика cron, вебхук от стороннего сервиса или системное событие в операционной системе.
Формирование запроса к нейросети
При получении триггера управляющая программа формирует структурированный запрос в формате JSON. Он содержит два основных блока:
- Контекст: системные инструкции (правила поведения), история предыдущих итераций и новые входные данные.
- Спецификация инструментов (Tools): перечень доступных функций с их текстовым описанием и строгой схемой параметров в формате JSON Schema.
Ответ модели и структура служебных данных
Нейросеть обрабатывает сформированный контекст и возвращает JSON-ответ. В нем зафиксированы текстовое сообщение для пользователя и/или указание на запуск конкретного инструмента с подготовленными аргументами. Также ответ включает служебные флаги (например, finish_reason), определяющие состояние задачи.
Диспетчер вызовов и запуск инструментов
Локальный скрипт-диспетчер принимает ответ от LLM. Если модель сформировала запрос на вызов функции, программа запускает соответствующий локальный код, считывает результат выполнения и добавляет его обратно в исторический контекст. После этого итерация повторяется: модель получает удлиненную историю, содержащую фактический результат работы инструмента.
Завершение цикла и возврат ответа
Когда в очередном ответе нейросети отсутствуют новые вызовы инструментов и решение сформировано, цикл останавливается. Отправка итогового сообщения пользователю в мессенджер также оформляется как вызов специальной функции внутри цикла.
Важно подчеркнуть: языковая модель сама по себе не исполняет код на вашем сервере. Она лишь генерирует текстовые инструкции. Запуск команд и работу с файлами осуществляет ваш локальный диспетчер. Следовательно, безопасность всей системы полностью зависит от архитектуры вашего кода.
Безопасность и роль текстовых инструкций
В традиционном программировании ветвление логики задается жесткими условиями if/else. В агентных системах выбор пути делегирован нейросети, а разработчик направляет этот выбор через описание инструментов.
Например, инструкция вида Never exec sleep/poll as timer в описании планировщика задач представляет собой мягкое текстовое ограничение. Она снижает риск ошибочных действий модели, но не является аппаратным запретом. Все критические ограничения безопасности должны дублироваться строгими проверками на уровне JS-кода.
Устройство памяти в агентных системах
Продвинутые фреймворки вроде Hermes используют многоуровневую структуру хранения данных:

- Локальные профили: файлы с описанием проекта и предпочтений пользователя, загружаемые при старте.
- Архив диалогов: база данных с поддержкой семантического поиска для извлечения релевантных контекстов.
- Репозиторий навыков: каталог успешных сценариев, сохраненных для повторного использования.
Из чего складывается кодовая база фреймворков
Хотя концептуальный цикл агента занимает не более сотни строк кода, развитые фреймворки содержат масштабные репозитории. Основной объем кода приходится на инженерную обвязку: обработку сетевых ошибок, повторные запросы, интеграции с внешними API, разграничение прав и интерфейсы взаимодействия.

Сравнение OpenClaw и Hermes
OpenClaw спроектирован как централизованный узел управления с обширной экосистемой расширений. Hermes делает упор на динамическое накопление опыта и формирование навыков. При разнице в интерфейсах и механизмах памяти оба решения базируются на едином итеративном цикле общения с LLM.

Векторы атак и риски Prompt Injection
Поскольку в контекст нейросети попадают внешние данные (содержимое веб-страниц, писем, файлов), существует риск атак типа Prompt Injection. Вредоносный текст во внешнем источнике может перехватить управление моделью. По этой причине категорически не рекомендуется запускать агента в окружении с конфиденциальными данными и боевыми API-ключами без изоляции.
Пошаговое создание собственного ИИ-агента
Создадим практического бота для формирования утреннего новостного дайджеста по искусственному интеллекту в Telegram. Бот будет собирать свежие материалы по расписанию, а в остальное время — отвечать на вопросы по найденным новостям в режиме диалога.

Постановка задачи и разработка архитектурного промпта
Для генерации базового каркаса на Node.js сформируем подробный технический промпт. В нем зафиксируем структуру файлов, параметры подключения к API через единый шлюз Selectel AI Router, набор инструментов и логику работы цикла:

Напиши ИИ-агента на Node.js (ESM, чистый JS, без сторонних фреймворков).
Структура проекта:
- agent.js — ядро, управляющий цикл loop() и точка входа main().
- tools.js — описание инструментов в TOOLS и диспетчер execute().
- .env — переменные окружения (BASE_URL, MODEL, API_KEY, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID).
Требования к API:
- Запросы к модели отправлять по OpenAI-совместимому протоколу на {BASE_URL}/chat/completions.
- Использовать BASE_URL=https://api.selectel.ru/aig/v1 и MODEL=deepseek/deepseek-v4-flash-0731.
Инструменты в tools.js:
1. search_web(query) — поиск информации в сети.
2. fetch_url(url) — скачивание и очистка содержимого веб-страницы.
3. remember(note) — запись заметок в файл notes.md.
4. schedule(cron, task) — добавление задачи в cron сервера.
5. list_schedules() — просмотр активных задач cron.
6. unschedule(task) — удаление задачи из cron.
Логика agent.js:
- Функция loop(task) формирует массив сообщений и доступных tools, отправляет запрос к LLM в цикле (максимум 25 итераций).
- Если модель возвращает tool_calls, выполняем их через execute(), добавляем результаты в историю и повторяем итерацию.
- Функция main() поддерживает два режима: long polling для сообщений Telegram и разовое выполнение задачи из аргументов CLI для cron.
Безопасное управление секретами и ключами
Создаем файл .env для хранения токенов. Обязательно добавляем .env в файл .gitignore, чтобы исключить утечку секретов в публичные репозитории.
Получим токен Telegram-бота у BotFather, а API-ключ для доступа к моделям сгенерируем в панели управления Selectel в разделе «ИИ-роутер».
Разбор архитектуры ядра: agent.js
Ниже представлена реализация ключевой функции цикла loop из файла agent.js:
export async function loop(task, notes = '') {
const messages = [
{ role: 'system', content: systemPrompt(notes) },
{ role: 'user', content: task },
];
const tools = TOOLS.map((t) => ({
type: 'function',
function: { name: t.name, description: t.description, parameters: t.parameters },
}));
for (let round = 0; round < MAX_ROUNDS; round++) {
const data = await callModel(messages, tools);
const choice = data.choices?.[0] || {};
const msg = choice.message || {};
messages.push(msg);
if (msg.tool_calls?.length) {
for (const tc of msg.tool_calls) {
let args = {};
try { args = JSON.parse(tc.function.arguments || '{}'); } catch {}
const result = await execute(tc.function.name, args);
messages.push({ role: 'tool', tool_call_id: tc.id, content: String(result) });
}
continue;
}
const text = (msg.content || '').trim();
if (!text || choice.finish_reason === 'length') {
messages.push({ role: 'user', content: 'Ответ пуст или обрезан. Заверши задачу текстом.' });
continue;
}
return text;
}
throw new Error('Превышен лимит итераций цикла');
}
Реализация инструментов и диспетчера: tools.js
В файле tools.js функция execute сопоставляет запрошенное имя инструмента с соответствующей обработкой, а функция fetch_url очищает запрашиваемый HTML от лишних тегов для экономии токенов:

export async function execute(name, args) {
const fn = IMPL[name];
if (!fn) return `Неизвестный инструмент: ${name}`;
try {
return await fn(args || {});
} catch (e) {
return `Ошибка инструмента ${name}: ${e.message}`;
}
}
async function fetch_url({ url }) {
const res = await fetchWithRetry(url, { headers: { 'user-agent': 'Mozilla/5.0' } });
const html = await res.text();
const text = html
.replace(/
Конфигурационный файл .env
Структура конфигурации имеет следующий вид:
BASE_URL=https://api.selectel.ru/aig/v1
MODEL=deepseek/deepseek-v4-flash-0731
API_KEY=YOUR_SELECTEL_API_KEY
TELEGRAM_TOKEN=YOUR_TELEGRAM_BOT_TOKEN
TELEGRAM_CHAT_ID=
Запуск локального тестирования выполняется командой node agent.js. При отправке сообщения боту в консоли отображается статус прослушивания Telegram, и агент оперативно выдает ответ.
Развертывание и запуск на облачном сервере
Оставлять агента на персональном компьютере неудобно из-за необходимости постоянной работы устройства и рисков безопасности. Оптимальный шаг — развертывание в изолированном облачном окружении.
Подготовка серверной инфраструктуры
В панели управления Selectel создаем новый облачный сервер со следующими характеристиками:
- ОС: Ubuntu 22.04 LTS 64-bit;
- Конфигурация: 1 vCPU, 1 ГБ RAM, SSD 5 ГБ (подходит тариф Shared Line или прерываемая виртуальная машина для дополнительной экономии);
- Регион: Выбираем ближайшую локацию (например, Санкт-Петербург).
Подключение по SSH и настройка Node.js
После создания сервера копируем его публичный IP-адрес из раздела «Порты» и подключаемся через терминал:

ssh root@178.72.165.12
Подтверждаем добавление ключа хоста (вводим yes) и вводим пароль. Затем обновляем пакеты и устанавливаем актуальную версию Node.js 22:

apt update && apt upgrade -y && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt install -y nodejs
Перенос проекта и проверка работоспособности
С локального компьютера копируем директорию проекта на сервер с помощью утилиты scp:
scp -r ./custom-agent-6 root@178.72.165.12:~/
Переходим в каталог проекта на сервере и выполняем тестовый запуск:
cd ~/custom-agent-6 && node agent.js
Отправляем боту в Telegram задание на формирование ежедневного утреннего дайджеста в 07:00. Агент зарегистрирует расписание в cron и подготовит тестовую подборку новостей.
Автоматизация работы через системную службу systemd
Чтобы бот работал автономно в фоновом режиме и автоматически перезапускался при сбоях, создадим сервис systemd:
nano /etc/systemd/system/agent.service
Вставляем следующий конфигурационный блок:

[Unit]
Description=AI News Agent Service
After=network.target
[Service]
WorkingDirectory=/root/custom-agent-6
ExecStart=/usr/bin/node /root/custom-agent-6/agent.js
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Сохраняем файл и активируем службу:
systemctl daemon-reload && systemctl enable --now agent
Проверяем состояние службы командой systemctl status agent. Зеленый статус active (running) подтверждает, что агент успешно работает в фоновом режиме.
Перспективы и идеи для самостоятельного развития
Собрать прототип автономного агента — отличный шаг для понимания современной архитектуры ИИ-систем. В качестве самостоятельной практики рекомендую добавить следующие функции:
- Поддержку разметки Markdown и интерактивных ссылок в Telegram;
- Модуль распознавания и голосовых ответов;
- Векторную базу данных для долговременной памяти;
- Инструмент безопасного редактирования собственного конфигурационного файла.
Главная задача разработчика сегодня — проектирование надежной инфраструктуры, в которой нейросеть сможет безопасно и эффективно решать поставленные задачи.
Источник: habr.com
