Как создать AI-агента n8n на своем VPS
Пошагово соберите AI-агента n8n: узел AI Agent, Claude, HTTP Request, память и триггер. Настройте лимиты вызовов и расходов на своем VPS.
Что такое AI-агент n8n и чем он отличается от цепочки
AI-агент n8n — это один узел AI Agent с подключенными к нему подузлами: одной чат-моделью, одним или несколькими инструментами и дополнительной памятью. Вы задаете цель обычным языком, а модель решает, какие инструменты вызывать и в каком порядке, пока не сможет ответить. Все дальнейшие настройки относятся к этой схеме.
Цепочка работает иначе. В узле Basic LLM Chain вы задаете шаги, а модель только формирует текст. В агенте шаги определяет модель, поэтому один и тот же вопрос сегодня может потребовать одного вызова модели, а завтра — девяти. Это различие определяет все настройки в данном руководстве.
Предполагается, что n8n уже работает через HTTPS на управляемой вами машине. Если это не так, начните с материала самостоятельная установка n8n в Docker с действительным сертификатом, поскольку для сохраняемого API-ключа требуется резервная копия ключа шифрования, описанная в этом материале. Сведения о сценариях без агентов, включая обработчики вебхуков для создания сводок и планировщики классификации, см. в материале шаблоны рабочих процессов Claude и n8n.
Перед использованием названий полей проверьте свою версию, поскольку n8n часто изменяет узлы AI.
docker compose exec n8n n8n --versionНазвания в этом руководстве соответствуют текущей стабильной версии n8n по состоянию на July 2026. Начиная с версии 1.82.0 каждый узел AI Agent работает как Tools Agent, поэтому старого раскрывающегося списка типа агента больше нет.
Шаг 1: выберите триггер
Для разговорного агента добавьте узел Chat Trigger. Оставьте параметр Make Chat Publicly Available отключенным на время разработки, чтобы доступ к нему имела только панель чата редактора. Включите его после завершения настройки агента и выбора способа аутентификации.
Узел Chat Trigger передает агенту поле chatInput. Это имя важно на шаге 3. Ошибка в нем чаще всего становится первой причиной сбоя.
Для агента без оператора используйте узел Schedule Trigger или Webhook. Ни один из них не создает chatInput, поэтому текст запроса придется написать самостоятельно.
Шаг 2: учетные данные модели
Добавьте на холст узел AI Agent. n8n сразу отобразит под ним пустой коннектор Chat Model. Подключите к нему подузел Anthropic Chat Model.
Создайте учетные данные в Anthropic Console на сайте platform.claude.com: откройте Settings, затем API Keys. Ключ отображается только один раз. Использование API оплачивается за токены отдельно от любой подписки Claude.ai, поэтому до первого запуска для учетной записи необходимо настроить оплату.
Выбирайте модель для каждого агента, а не для всей компании. Агент с одним инструментом, который выполняет поиск и сообщает результат, нормально работает на Haiku. По состоянию на July 2026 стоимость Haiku составляет $1 за миллион входных токенов и $5 за миллион выходных токенов. Если у агента несколько инструментов и ему нужно планировать их последовательное использование, перейдите на Sonnet. Вы избегаете ситуации, когда дешевая модель четыре раза вызывает неправильный инструмент. Это обходится дороже, чем один вызов правильного инструмента дорогой моделью.
Задайте параметр Maximum Number of Tokens в настройках подузла. Он ограничивает длину каждого ответа модели. Если оставить большое значение по умолчанию, один ошибочный запуск может создать очень длинный ответ и увеличить расходы.
Есть важное ограничение из документации n8n, о котором часто забывают: выражения внутри подузла всегда вычисляются относительно первого входного элемента, а не отдельно для каждого элемента. Размещайте выражения для отдельных элементов в полях запроса корневого узла.
Шаг 3: запрос, который получает агент
Откройте узел AI Agent. Параметр Prompt имеет две настройки.
- Take from previous node automatically ожидает входное поле с именем
chatInput. Это правильный выбор при использовании Chat Trigger. - Define below открывает поле Prompt (User Message), в котором можно указать статический текст или выражение. Это правильный выбор при использовании Schedule Trigger или узла Webhook.
Если перед AI Agent расположен узел Webhook, тело запроса POST будет доступно в поле $json.body. В этом случае поле запроса выглядит так.
Check the current status of {{ $json.body.service }} and tell me
whether it is up. If it is down, say for how long. No preamble.Шаг 4: предоставьте агенту один инструмент
У узла AI Agent без дочернего узла инструмента запуск завершается ошибкой. Начните с одного инструмента. Один рабочий инструмент даст больше информации, чем четыре частично настроенных.
Подключите узел HTTP Request к разъёму Tool агента. Настройте его так же, как обычный узел HTTP Request, затем сначала проверьте эту конечную точку из shell.
curl -s -H 'Accept: application/json' \
https://status.example.com/api/status/database | head -c 400Если эта команда curl возвращает ошибку или HTML-страницу входа, агент также завершится ошибкой. При этом причина будет выглядеть как проблема модели, хотя на самом деле проблема связана с URL или аутентификацией. Исправьте её в shell, а не в узле.
Поле Description инструмента предназначено не для документации коллег. Это единственная информация, которую модель читает при определении релевантности инструмента. Сформулируйте описание как простое утверждение о возвращаемых данных: «Возвращает текущее состояние одного мониторируемого сервиса — работает он или недоступен, — и длительность простоя в формате JSON».
Чтобы модель могла подставлять часть запроса, используйте выражение $fromAI(). Оно работает только в инструментах, подключённых к узлу AI Agent, и не работает в инструменте Code.
{{ $fromAI('service', 'The name of the service to look up', 'string') }}Аргументы: key, затем необязательные description, type и defaultValue. Ключ должен содержать от 1 до 64 символов: буквы, цифры, символы подчёркивания и дефисы. Типом должно быть одно из значений string, number, boolean или json. По умолчанию используется string. Более полный вызов выглядит так.
{{ $fromAI('limit', 'How many records to return', 'number', 20) }}Ключ является подсказкой, а не ссылкой на существующие данные. $fromAI('service') не считывает поле с именем service откуда-либо. Он сообщает модели: «получи значение и назови его service». Затем модель ищет это значение в переписке, входных данных и результатах других инструментов. В рабочем процессе чата она может просто запросить его у пользователя.
Шаг 5: память и причина, по которой агент забывает
Без узла Simple Memory каждое сообщение начинается с нуля. Подключите подузел Simple Memory, чтобы хранить недавнюю историю диалога.
У него есть два параметра. Session Key определяет, к какому диалогу относится сообщение. Поэтому пользователи с разными ключами получают отдельные истории. Context Window Length задаёт количество предыдущих взаимодействий, которые повторно передаются в prompt.
Context Window Length влияет не только на качество, но и на стоимость. При каждом последующем вызове все сохранённые сообщения снова отправляются как входные токены. Для разговорчивого агента окно размером 20 означает, что за одни и те же ранние сообщения вы платите двадцать раз.
Simple Memory не работает в активном рабочем процессе в production, если n8n работает в queue mode. История хранится в собственных данных workflow, а не в общем хранилище. В инстансе, работающем в queue mode, используйте вместо него подузел Postgres Chat Memory и укажите базу данных, доступную как основному процессу, так и workers.
Шаг 6: системное сообщение
Откройте Options агента и добавьте System Message. Здесь указывается описание задачи. Это самый важный текст во всем процессе.
You are an infrastructure status assistant. Always call the status
tool before answering a question about whether something is running.
Never guess. If the tool returns an error, say so and stop.Фраза «Always call the status tool before answering» действительно важна. Без нее модель, которая считает, что уже знает ответ, пропустит вызов инструмента и ответит по памяти. При первом же изменении вашей инфраструктуры такой ответ будет уверенно неверным.
Почему агент зацикливается и что это останавливает
В разделе Options также есть параметр Max Iterations. По умолчанию он равен 10. Одна итерация — это один вызов модели и один результат инструмента, переданный обратно в контекст. Поэтому один запуск агента — это не один вызов API, а до десяти вызовов. Каждый из них передаёт в качестве входных данных всю накопившуюся переписку.
Уменьшите это значение. Большинство агентов с одним инструментом завершают работу за две итерации. Ограничение в 3 или 4 итерации превращает бесконечный цикл в явную ошибку, которую можно увидеть в списке запусков.
Во время отладки включите Return Intermediate Steps. В итоговый вывод будут добавлены вызовы инструментов, выполненные агентом. Так можно отличить ситуацию «модель не вызвала инструмент» от ситуации «инструмент вернул бесполезный результат». Перед запуском в рабочей среде отключите этот параметр. Для конечного пользователя эти шаги являются лишней информацией.
Наблюдайте за выполнением запуска из shell.
docker compose logs -f n8nКак не допустить незаметного расходования средств автономным агентом
У агента за Chat Trigger есть человек, который останавливает его, если ответ выглядит неверным. За агентом с Schedule Trigger никто не наблюдает. Подробное описание приведено в разделе Контроль расходов AI-агента на постоянно работающем VPS. Здесь основную роль играют 4 настройки.
- Ограничьте параметр Maximum Number of Tokens в подузле модели, чтобы один ответ не выполнялся слишком долго.
- Установите Max Iterations на минимальное значение, при котором задача всё ещё выполняется.
- Ограничьте размер ответов инструментов. Инструмент, возвращающий JSON-объект из 4,000 строк, передаёт его целиком в следующий вызов модели, а затем — в каждый последующий вызов в рамках того же запуска.
- Определите, действительно ли агенту нужен график запуска. Задача, выполняемая каждые 5 минут, запускается 288 раз в день. Умножьте стоимость одного запуска на это число.
Отключайте workflow на время итераций. Активный workflow с Schedule Trigger продолжает выполняться на основе версии, сохранённой n8n. Это не всегда версия, отображаемая на экране.
FAQ
Почему мой узел AI Agent отказывается выполнять операцию?
Для узла AI Agent требуется дочерний узел chat model и как минимум один дочерний узел tool. Узел с моделью, но без инструмента завершает работу с ошибкой до выполнения вызова API. Подключите любой инструмент, даже простой, и запустите узел снова.
Агент отвечает, но никогда не вызывает мой инструмент. В чем проблема?
Почти всегда проблема связана с полем Description инструмента. Модель выбирает инструменты, анализируя их описания. Поэтому описание вроде «HTTP Request» не объясняет, когда применять инструмент. Перепишите описание так, чтобы в нем были указаны возвращаемые данные и условия, при которых инструмент полезен. Затем добавьте в System Message инструкцию вызывать этот инструмент перед формированием ответа.
Почему один и тот же вопрос каждый раз стоит по-разному?
Потому что модель выбирает количество шагов. На каждой итерации повторно отправляется вся история диалога, включая результаты предыдущих вызовов инструментов. Поэтому выполнение в четыре итерации стоит значительно дороже, чем четыре отдельных вызова. Параметр Max Iterations задает максимальное число итераций. Параметр Return Intermediate Steps показывает, сколько шагов фактически использовал конкретный запуск.
В редакторе память работает, а в production — нет. Что изменилось?
Проверьте, работает ли экземпляр в режиме queue. Simple Memory сохраняет историю в собственных данных выполнения workflow. Эти данные не сохраняются при передаче выполнения отдельному рабочему процессу. Поэтому активный workflow в production теряет историю. Замените этот узел дочерним узлом Postgres Chat Memory. Он сохраняет историю в базе данных, общей для всех рабочих процессов.