1. Архитектура связки
n8n — оркестратор, NormaHub — модельный бэкенд. Типовой workflow: триггер (webhook, расписание, сообщение) → HTTP Request к NormaHub → обработка ответа → действие (ответ пользователю, запись в таблицу, тикет). Ключ живёт в credentials n8n, модель и max_tokens — в теле запроса, лимит трат — на ключе в личном кабинете.
Под автоматизацию заводите отдельный ключ: фоновые workflow работают без присмотра, и зациклившаяся нода с общим ключом — самый быстрый способ обнулить баланс. VPN не нужен ни облачному, ни self-hosted n8n.
2. HTTP Request node
Создайте узел HTTP Request и настройте его так. Тип авторизации — Header Auth с заголовком Authorization: Bearer ВАШ_КЛЮЧ (значение храните в credentials, а не текстом в workflow). Тело — JSON с model, messages и max_tokens; текст из предыдущего узла подставляйте выражением {{ $json.text }}.
Метод: POST
URL: https://api.normahub.cc/v1/chat/completions
Auth: Header Auth → Authorization: Bearer YOUR_API_KEY
Body JSON:
{
"model": "MODEL_ID",
"messages": [
{ "role": "system", "content": "Отвечай коротко и по делу." },
{ "role": "user", "content": "={{ $json.text }}" }
],
"max_tokens": 512
}Model ID берите точным из каталога: для классификации и черновиков — младшие дешёвые модели, для сложных рассуждений — флагманы. System-промпт задаёт формат ответа и экономит токены лучше, чем длинные просьбы в каждом сообщении.
3. Чтение ответа и usage
Ответ лежит в choices[0].message.content, расход — в usage того же JSON. Сохраняйте usage в свою учётную таблицу (Google Sheets, Postgres, файл): это единственный способ увидеть, какой workflow сколько стоит, до счёта, а не после.
// Ответ модели в следующем узле:
{{ $json.choices[0].message.content }}
// Usage для учёта стоимости:
{{ $json.usage.prompt_tokens }} / {{ $json.usage.completion_tokens }}Для диалогов храните историю снаружи (таблица, Redis, память workflow) и передавайте в messages обрезанный контекст: n8n не сделает это за вас, а полный лог переписки при каждом вызове — главная статья расходов. Формула цены — в гайде по стоимости.
4. Ошибки и надёжность
Включите в настройках HTTP-узла обработку ошибок и повторы только для временных сбоев (429, 5xx): экспоненциальная пауза, максимум 3–4 попытки. Постоянные 400, 401, 402, 403 уводите в отдельную ветку с уведомлением вам, а не в бесконечный retry. Полная таблица кодов — в гайде по ошибкам.
Типовые причины падений: 401 — ключ в credentials протух или отозван; 402 — баланс или spend limit; 413 — в messages улетел огромный лог; 503 — модель временно недоступна, здесь уместен fallback на запасную модель вторым HTTP-узлом.
5. Self-hosted и безопасность
На своём сервере держите ключ в переменных окружения контейнера и ссылайтесь на него выражением — тогда экспорт workflow не унесёт секрет. Ограничьте доступ к редактору n8n (иначе любой редактор видит credentials), включите шифрование credentials ключом из env, бэкапьте workflows в git без секретов.
# Self-hosted n8n: ключ — в credentials n8n, не в код workflow
# Переменные окружения контейнера:
NORMAHUB_API_KEY=ваш_api_ключ
# В HTTP-node используйте Header Auth с выражением:
# Bearer {{ $env.NORMAHUB_API_KEY }}Итоговый чек-лист перед включением расписания: отдельный ключ с лимитом, max_tokens везде, дедупликация входов, ветка ошибок с алертом, учёт usage. Упавшие запуски разбирайте по коду: 401 — credentials, 402 — деньги или лимит, 413 — раздутый контекст.