Всем привет!

Оказалось, что после релиза инференса 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 и выполните следующие шаги:

  1. Создайте Credentials с вашим токеном из ЛК Amvera. Токен доступен на странице выбранной модели.

  2. Выберите используемую модель (gpt-4.1, gpt-5, llama-8b, llama-70b на данный момент) и создайте любое сообщение.

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

Релевантные статьи:

n8n – всё, что нужно знать о сервисе

n8n. Создаём AI Telegram-agent с установкой и настройкой

Комментарии (0)