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