Всем привет!
Оказалось, что после релиза инференса LLM моделей (LLaMA, GPT) в Amvera, у многих пользователей появилась необходимость использования LLM Inference API в n8n.
Для этого нужно было создавать ноду HTTP Request, самостоятельно искать и указывать эндпоинт, прописывать body для запроса и проставлять нестандартный заголовок авторизации, что совершенно неудобно и сложно для многих пользователей. Простыми словами: нет удобного способа работы с Amvera LLM Inference API в n8n.
По вышеописанной причине мы решили разобраться в этой проблеме, и опубликовать собственную комьюнити-ноду n8n-nodes-amvera-inference, которая сможет помочь пользователям, без сложностей, работать с Inference API нужной модели.
В статье мы расскажем и про саму разработку комьюнити-ноды, и про её установку с настройкой.
Установка ноды
Установить ноду можно буквально за 5 минут. Для этого открываем интерфейс n8n, переходим во вкладку Settings (появляется при клике по аватарке или трём точкам рядом с аватаркой) — Community Nodes.
Если такого раздела нет — убедитесь, что ваша версия поддерживает Community Nodes, или попробуйте добавить переменную окружения N8N_COMMUNITY_NODES_ENABLED в значении true
В этом разделе прожимаем Install в правом верхнем углу и в поле вводе пишем n8n-nodes-amvera-inference. Подтверждаем и ждём установки.

После установки Amvera LLM появится в списке доступных нод в вашем воркфлоу.

Работа с нодой
Для начала убедитесь, что у вас приобретён пакет токенов нужной вам модели, после чего откройте ноду Amvera LLM и выполните следующие шаги:
Создайте
Credentialsс вашим токеном из ЛК Amvera. Токен доступен на странице выбранной модели.Выберите используемую модель (
gpt-4.1,gpt-5,llama-8b,llama-70bна данный момент) и создайте любое сообщение.Выберите режим вывода. Всего поддерживается два режима:
Ответ моделииJSON. Первый возвращает только сообщение от модели, тогда как второй - весь JSON ответа Inference API.
И всё — можно запускать воркфлоу и работать с Amvera LLM Inference API без каких-либо проблем и сложных настроек.
Как мы разрабатывали ноду
Когда начинаешь писать свою ноду для n8n, кажется, что это что-то сложное. На самом же деле в этом нет ничего магического, достаточно лишь описать логику и вид ноды на TypeScript.
n8n использует простую структуру для нод: каждая нода - это TypeScript-класс, который описывает внешний вид (inputs, outputs, другие свойства) и поведение (метод execute).
Мы начали с базового шаблона:
n8n-nodes-amvera-inference/
├── nodes/
│ └── AmveraLlm.node.ts
├── credentials/
│ └── AmveraLlmApi.credentials.ts
├── tsconfig.json
└── package.json
Разберём код:
credentials/AmveraLlmApi.credentials.ts
Этот файл описывает, как нода получается доступ к API — в нашем случае через токен авторизации.
import { ICredentialType, INodeProperties } from 'n8n-workflow';
export class AmveraLlmApi implements ICredentialType {
name = 'amveraLlmApi';
displayName = 'Amvera LLM API';
properties: INodeProperties[] = [
{
displayName: 'API Token',
name: 'apiToken',
type: 'string',
typeOptions: { password: true },
default: '',
required: true,
description: 'Токен от модели LLM',
},
];
}
Теперь в интерфейсе n8n появится возможность создать «учётку» с токеном Amvera. Все параметры можно заполнять по шаблону.
nodes/AmveraLlm.node.ts -основной файл, где расписана вся логика ноды.
Нода принимает на вход список сообщений, модель и тип вывода, а дальше делает запрос к API Inference и возвращает результат в зависимости от выбранного режима.
import {
IExecuteFunctions,
INodeExecutionData,
INodeType,
INodeTypeDescription,
} from 'n8n-workflow';
export class AmveraLlm implements INodeType {
description: INodeTypeDescription = {
displayName: 'Amvera LLM',
name: 'amveraLlm',
group: ['transform'],
version: 1,
description: 'Работа с Amvera LLM API',
defaults: { name: 'Amvera LLM' },
inputs: ['main'],
outputs: ['main'],
credentials: [{ name: 'amveraLlmApi', required: true }],
properties: [
{
displayName: 'Model',
name: 'model',
type: 'options',
options: [
{ name: 'llama8b', value: 'llama8b' },
{ name: 'llama70b', value: 'llama70b' },
{ name: 'gpt-4.1', value: 'gpt-4.1' },
{ name: 'gpt-5', value: 'gpt-5' },
],
default: 'llama8b',
},
{
displayName: 'Messages',
name: 'messages',
type: 'fixedCollection',
typeOptions: { multipleValues: true },
default: {},
options: [
{
name: 'message',
displayName: 'Message',
values: [
{
displayName: 'Role',
name: 'role',
type: 'options',
options: [
{ name: 'system', value: 'system' },
{ name: 'user', value: 'user' },
{ name: 'assistant', value: 'assistant' },
],
default: 'user',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
},
],
},
],
},
{
displayName: 'Режим вывода',
name: 'returnMode',
type: 'options',
options: [
{ name: 'Ответ модели', value: 'first' },
{ name: 'JSON', value: 'raw' },
],
default: 'first',
},
],
};
async execute(this: IExecuteFunctions): Promise {
const items = this.getInputData();
const output: INodeExecutionData[] = [];
const creds = await this.getCredentials('amveraLlmApi');
const token = creds.apiToken as string;
for (let i = 0; i < items.length; i++) {
const model = this.getNodeParameter('model', i) as string;
const messages = this.getNodeParameter('messages.message', i, []) as Array<{ role: string; text: string }>;
const mode = this.getNodeParameter('returnMode', i) as string;
const endpoint = model.startsWith('llama') ? 'llama' : 'gpt';
const body = { model, messages };
const res = await this.helpers.httpRequest({
method: 'POST',
url: `https://kong-proxy.yc.amvera.ru/api/v1/models/${endpoint}`,
headers: {
'X-Auth-Token': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body,
json: true,
});
let answer = '';
if (model.startsWith('llama')) {
const result = res?.result;
if (result?.alternatives?.length) {
answer = result.alternatives[0]?.message?.text ?? '';
}
} else {
if (res?.choices?.length) {
answer = res.choices[0]?.message?.content ?? '';
}
}
if (mode === 'first') {
output.push({ json: { text: answer } });
} else {
output.push({ json: res });
}
}
return [output];
}
}
Сборка и публикация
Компиляция в JavaScript:
npm run build
Публикация:
# Предварительно логинимся в аккаунт npm
npm login
# Публикуем пакет
npm publish --access public
После этого пакет будет доступен на странице вашего профиля npm. По имени пакета можно будет установить его в n8n. Самое главное, чтобы он начинался с n8n-nodes-. Так n8n определяет пакеты, предназначенные для установки в n8n.
Итог
Теперь пользователи могут подключать LLaMA и GPT к n8n буквально в пару кликов, без ручной настройки HTTP-запросов, и не думать об оплате иностранными картами и проксировании запросов.
Релевантные статьи:
juDge
Покупаем видяшку. Запускаем локальную версию llama. Подключаем ее к n8n и пользуемся без необходимости и гемора с оплатой облачных ИИ
kirillkosolapov Автор
Это достаточно дорого. Для запуска минимально объемной по параметрам LLM нужна дорогая карта. И почти все хорошие нейронки проприетарные. Разница между LLaMA и GPT/Gemini/Claude очень большая. И что делать если надо в параллель запросы обрабатывать, локально их не раскидать. Плюс работа 24/7 локально сложно осуществима. Просто тратить сотни тысяч/несколько миллионов (здесь от нейронки и требований зависит) на то, что работает хуже, оправданно только при особых требованиях безопасности.
neroxt
Он возможно про ollama. Она работает даже на пользовательских gpu. Но использует fp8 что кратно режет качество ии
juDge
5070 + llama.cpp + gpt-oss
kirillkosolapov Автор
И это дорого, плюс карта не серверная. Подойдет только если не нужна постоянная работа и масштабирование. Если уже есть, для локального тестирования, почему нет, но для остального проще токены купить по мере надобности.
juDge
1) Прекрасно работает на сервере, на постоянной работе ... раз в несколько часов задействована для обработки информации. В рамках условно мелкого предприятия которому нужна некая автоматизация ... о маштабировании говорить смешно. Если будет нужна более мощная, то просто купят более мощную карту.
2) Работает, выполняет задачи за которые пришлось бы платить в виде абонентской платы. Тут карта куплена ... работает ... в любой момент можно взять её продать и вернуть её остаточную стоимость. У абонентской платы нет остаточной стоимости. Больше пуха нагоняете на себя. В рамках простых задач автоматизации процессов не нужнен доступ к большим и мощным ИИ моделям. Задачи автоматизации достаточно просты ... и gpt-oss-20b-F16.gguf + 5070 справляются как с обработкой данных в других задачах ... так и обработкой запросов от n8n. При чем мощности хватает. При этом скорость генерации токенов порядка 120-140 токенов в секунду.