12 KiB
n8n-nodes-teamorouter
Кастомные узлы n8n для шлюза TeamoRouter (https://api.teamorouter.com/v1) — OpenAI-совместимого роутера к GPT, Claude, Gemini, DeepSeek, GLM, Grok, Kimi и другим моделям.
Пакет содержит два узла и один тип учётных данных:
| Узел | Тип | Назначение |
|---|---|---|
TeamoRouter Chat Model (lmChatTeamRouter) |
sub-node, ai_languageModel |
Подключается к AI Agent, Basic LLM Chain, Question and Answer Chain и любым другим узлам, которые принимают Language Model |
TeamoRouter (teamorouter) |
обычный узел | Три операции: Chat → Message a Model, Image → Generate an Image, Model → List Models |
TeamoRouter API (teamorouterApi) |
credentials | API-ключ + Base URL |
1. Установка
Вариант А. Через интерфейс n8n (рекомендуется)
Community nodes в n8n ставятся из npm, поэтому пакет должен быть опубликован:
-
Выгрузите папку в свой git-репозиторий.
-
Опубликуйте в npm:
npm install npm run build npm publish --access public -
В n8n: Settings → Community nodes → Install a community node, введите
n8n-nodes-teamorouter, подтвердите предупреждение. -
Перезапускать n8n не нужно — узлы появляются сразу.
Нужна роль Owner/Admin и включённые community nodes. Community nodes ставятся на весь инстанс.
Вариант Б. Копированием папки (если есть доступ к серверу n8n)
-
npm install && npm run build— на выходе нужна папкаdist/. -
Положите всю папку пакета (в ней обязателен
package.json) в каталог пользовательских расширений, например:- в Docker:
/home/node/.n8n/custom/n8n-nodes-teamorouter/ - через переменную окружения:
N8N_CUSTOM_EXTENSIONS=/path/to/custom-nodes, а внутри уже папка пакета
- в Docker:
-
Внутри папки пакета один раз выполните
npm install --omit=dev, чтобыn8n-workflow(peer-зависимость) был доступен из вашей папки. -
Перезапустите n8n.
Вариант В. Локальная разработка
npm install
npm run build:watch # tsc в режиме наблюдения
export N8N_CUSTOM_EXTENSIONS="$(pwd)"
npx n8n start
2. Учётные данные
Settings → Credentials → New → TeamoRouter API
| Поле | Значение |
|---|---|
| API Key | ключ из панели TeamoRouter, начинается с sk-teamo- |
| Base URL | https://api.teamorouter.com/v1 (по умолчанию; меняйте только для зеркала .cn или своего роутера) |
Кнопка проверки делает GET /v1/models с заголовком Authorization: Bearer <ключ>.
3. TeamoRouter Chat Model (для AI Agent)
- Добавьте AI Agent (или Basic LLM Chain).
- В слот Chat Model добавьте TeamoRouter Chat Model.
- Выберите модель из списка — он читается вживую из
GET /v1/models. В подписи к модели видны провайдер и цена за 1M токенов (если роутер их отдаёт).
Опции
| Опция | Что делает |
|---|---|
| Sampling Temperature | случайность ответа, 0…2 |
| Maximum Number of Tokens | лимит генерации; -1 = решает модель |
| Top P | nucleus sampling; меняйте либо temperature, либо topP |
| Force JSON Response | просит модель отвечать объектом JSON (в промпте должно быть слово JSON) |
| Service Tier → Fast | режим Fast у TeamoRouter: до 2,5× быстрее, тарифицируется ×2 |
| Extra Body | произвольные JSON-поля в тело запроса, например {"top_k": 40}; перекрывает всё выше |
| Timeout | по умолчанию 600000 мс (роутер допускает ответы до 600 с) |
| Max Retries | повторы при ошибке, по умолчанию 2 |
Модель, которой нет в списке
Поле Model можно переключить в режим выражения (переключатель Expression в правом верхнем углу поля) и вписать ID руками:
{{ 'some-new-model-id' }}
Это пригодится, если модель появилась у роутера, а список в UI ещё не перечитан.
4. Узел TeamoRouter (обычные операции)
Chat → Message a Model
Отправляет POST /v1/chat/completions и возвращает JSON-ответ как есть.
| Поле | Описание |
|---|---|
| Model | список читается из GET /v1/models (только текстовые модели; картинные скрыты) |
| Prompt | сообщение пользователя |
| Options → System Prompt | системная инструкция |
| Options → остальное | temperature, topP, max tokens, JSON-ответ, Service Tier Fast, Extra Body, Timeout |
Текст ответа доступен как {{ $json.choices[0].message.content }}, расход токенов — {{ $json.usage }}.
Image → Generate an Image
Отправляет POST /v1/images/generations и кладёт результат в бинарное поле (по умолчанию data, PNG).
| Поле | Описание |
|---|---|
| Model | по умолчанию gpt-image-2, список — только картинные модели; можно вписать ID выражением |
| Prompt | описание картинки |
| Put Output File in Field | имя бинарного свойства |
Дальше файл уходит в Write Binary File, в Telegram, в S3 и т. д. Долгие генерации узел ждёт до 5 минут.
Model → List Models
Возвращает модели роутера: по одному элементу на модель (id, object, owned_by, pricing и др.). Удобно, чтобы построить собственный справочник или посчитать цены.
5. Известные особенности и ограничения
- Ответы идут на
/v1/chat/completions. Исключение — модель из семействаgpt-5.6*и всё, что содержитcodex: LangChain внутри n8n сам переключает такие ID на/v1/responses(это поведение зашито в@langchain/openaiи не отключается настройками). TeamoRouter поддерживает/v1/responses, но только для GPT-моделей, поэтому схема рабочая. Для Claude/Gemini запросы идут обычным Chat Completions. - Claude через OpenAI-формат не отдаёт prompt caching. Это ограничение формата роутера, а не узла: кэширование промпта доступно только через нативный протокол Anthropic (в README TeamoRouter это указано отдельно).
max_tokens, а неmax_completion_tokens. Узел отправляет именноmax_tokens— как в примере из документации TeamoRouter. Если конкретная модель требуетmax_completion_tokens, добавьте его через Extra Body.- Формат ответа JSON передаётся через
response_format— это параметр Chat Completions. Для моделей, которые уходят на/v1/responses, он может игнорироваться. - Список картинных моделей определяется по имени:
*-image,gpt-image*,nano-banana*,dall-e*,imagen*. Если роутер назовёт модель иначе, она попадёт в список чата (или наоборот); при этом поле всегда можно заполнить вручную выражением. - Цены в списке моделей — подсказка. Роутер может отдавать цену за токен или уже за 1M токенов; узел считает значения меньше
0.005как «за токен». Это только отображение, на запросы не влияет. - У полей Model список загружается при открытии, кэша нет: если модель только что появилась, нажмите перезагрузить список или используйте выражение.
6. Разработка и проверки
npm install
npm run build # tsc + копирование иконок в dist/
npm test # проверка структуры пакета + тесты узлов на мок-сервере
npm run typecheck
npm run mock # мок TeamoRouter на http://127.0.0.1:4123/v1 (ключ test-key)
npm test запускает два набора:
test/validate-nodes.mjs— имитирует загрузку пакета n8n: проверяет описание узлов, наличие иконок, реализациюloadOptionsMethod, ссылки на credential, тип соединенияai_languageModelу саб-узла.test/run-node-tests.mjs— поднимает мок роутера (test/mock-server.mjs, без зависимостей) и прогоняет скомпилированные узлы с настоящим HTTP и настоящим@langchain/openai: список моделей и фильтрация картинных,supplyData+ реальный вызов модели, проброс опций (service_tier,extra_body, лимиты), обе операции у обычного узла, генерация изображения в бинарном виде, разбор ошибок 401/402/404,Continue On Failи таймаут.
Тесты не требуют ключа TeamoRouter. Модели fail-401, fail-402, fail-404, fail-500 в моке принудительно отдают ошибку, slow-model отвечает через 2,5 с.
7. Первый запуск и диагностика
- Пакет собран и проверен автотестами (см.
npm test), но в живом n8n ещё не запускался — первый запуск делайте на тестовом воркфлоу. - При установке через
Settings → Community nodesинтерфейс может показать предупреждение о сообщественном узле — это нормально. - Если n8n пишет, что узел не загрузился, проверьте
Help → About(версия n8n) и логи контейнера: чаще всего причина — недоступная peer-зависимостьn8n-workflow(Вариант Б, шаг 3).
Лицензия
MIT