Как мы делали свою ноду для n8n

в 8:15, , рубрики: n8n, n8n community, n8n community nodes, n8n gpt, n8n llm, n8n nodes, n8n openai, n8n ноды, как сделать n8n ноду, комьюнити нода

Всем привет!

Оказалось, что после релиза инференса 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. Подтверждаем и ждём установки.

Как мы делали свою ноду для n8n - 1

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

Как мы делали свою ноду для n8n - 2

Работа с нодой

Для начала убедитесь, что у вас приобретён пакет токенов нужной вам модели, после чего откройте ноду 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 с установкой и настройкой

Автор: kirillkosolapov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js