Всем привет!
Оказалось, что после релиза инференса 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-запросов, и не думать об оплате иностранными картами и проксировании запросов.
Релевантные статьи: