Типичный сценарий использования n8n — связать «триггер — обработку — вывод» в один автоматический процесс: новое письмо превращается в краткое резюме, отправка формы — в классификацию лида, новая строка таблицы — в черновик текста. Если подключить OpenAI, в этих процессах появляется шаг обработки естественного языка, но вместе с ним приходят новые вопросы: как хранить ключ, что писать в Base URL и почему при пакетном запуске счёт внезапно вырастает.
Разберём всё в порядке реальной сборки: сначала выбор способа подключения, затем настройка учётных данных, запуск первого сценария и, наконец, обработка ошибок и контроль расходов. Названия узлов и полей могут отличаться в зависимости от вашей версии n8n.
Примечание: n8n и OpenAI — товарные знаки соответствующих правообладателей; статья не подразумевает аффилированности с этими компаниями. Названия моделей и цены смотрите в разделе тарифов.
1. Как выбрать способ подключения
В n8n есть два распространённых пути к OpenAI:
| Способ | Когда подходит | Плюсы | Ограничения |
|---|---|---|---|
| Узел OpenAI | Диалог, резюме, классификация, изображения, транскрипция | Параметры видны в интерфейсе, учётные данные хранятся централизованно | Ограничен набором операций, реализованных в узле |
| Узел HTTP Request | Нужны нестандартные параметры, пакетные запросы или особые поля | Гибкость, прямой вызов /v1/chat/completions |
Тело запроса, авторизацию и обработку ошибок пишете сами |
Начните с узла OpenAI, а к HTTP Request переходите по мере необходимости. Не пишите запросы вручную с самого начала, если только вам действительно не нужны параметры, которых нет в узле.
2. Настройка учётных данных и Base URL
В разделе учётных данных n8n создайте запись типа OpenAI и укажите API-ключ. Если используется собственный шлюз, в той же записи заполните Base URL — обычно до /v1. Названия полей и наличие отдельного поля для Base URL зависят от текущей версии.
Несколько практических рекомендаций:
- Храните ключ только в учётных данных, не вставляйте его в узел Code или JSON сценария.
- Для продакшена и тестов используйте разные ключи — так проще раздельно задавать лимиты и отзывать доступ.
- При самостоятельном развёртывании берегите
N8N_ENCRYPTION_KEY: после его смены существующие учётные данные не расшифруются. - В Base URL не добавляйте
/chat/completions— узел сам допишет путь. - Если экземпляром пользуется команда, разделяйте учётные данные по проектам или используйте виртуальные ключи шлюза.
После настройки проверьте подключение минимальным запросом:
curl https://your-gateway.example.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"your-model-id","messages":[{"role":"user","content":"Ответь только OK"}]}'
3. Запуск первого сценария
Рассмотрим пример «после отправки формы создать черновик ответа»:
- Добавьте узел Form Trigger или Webhook, который принимает данные формы.
- Добавьте узел OpenAI и выберите операцию отправки сообщения (Message a Model).
- Выберите учётные данные и модель, передайте поля формы в промпт через выражение, например
{{ $json.message }}. - Добавьте узел Set и оставьте только те поля ответа, которые понадобятся дальше.
- Добавьте узел Gmail, Slack или таблицы, чтобы записать результат в нужное место.
- Запустите сценарий вручную, проверьте вход и выход каждого узла, затем включите его.
Если используете узел HTTP Request, тело запроса может выглядеть так:
{
"model": "your-model-id",
"messages": [
{"role": "system", "content": "Ты помощник службы поддержки. Отвечай только на основе предоставленных данных."},
{"role": "user", "content": "{{ $json.message }}"}
],
"temperature": 0.3,
"max_tokens": 500
}
Обратите внимание на два момента: имена полей в выражении должны совпадать с фактическим выводом предыдущего шага, а ключ передаётся в заголовке Authorization: Bearer <key>, не в JSON.
4. Четыре типа задач, которые стоит автоматизировать
Не каждую задачу имеет смысл отдавать модели. Вот несколько направлений с понятной отдачей:
- Обработка текста: резюме писем, классификация комментариев, теги для тикетов, перевод.
- Структурированное извлечение: имя, сумма, дата из заявок, резюме и счетов — с выводом в JSON.
- Генерация контента: заголовки, преимущества и черновики ответов по строке таблицы с последующей проверкой человеком.
- Маршрутизация: распределение обращений по ответственным в зависимости от срочности.
Для структурированного извлечения явно задавайте формат вывода и добавляйте после модели узел проверки. Иногда модель дописывает пояснения, и JSON перестаёт разбираться. Помогает промпт «выведи только JSON, без блоков Markdown» и одна повторная попытка.
5. Обработка ошибок: самое недооценённое место
В сценариях без присмотра сбои — норма. Настройте в параметрах узлов следующее:
- Retry On Fail: повторять при 429, 5xx и сетевых тайм-аутах, не более 2–3 раз.
- Интервал повтора: используйте экспоненциальную задержку, чтобы не усиливать нагрузку при лимитах.
- On Error: различайте «остановить сценарий» и «продолжить с записью ошибки» — одна плохая запись не должна обрушивать весь пакет.
- Тайм-аут: задайте разумный лимит для HTTP-запросов; для длинных текстов его можно увеличить, но не делать бесконечным.
- Сценарий ошибок: собирайте сбои в Slack или почту с ID выполнения и кратким описанием входа.
- Идемпотентность: перед повтором проверяйте, не записан ли результат в целевую систему, чтобы не отправить письмо и не провести платёж дважды.
Типовые ошибки удобно разбирать в таком порядке:
| Симптом | Вероятная причина | Что делать |
|---|---|---|
| 401 | Неверный ключ или не выбраны учётные данные | Выберите запись заново, проверьте лишние пробелы |
| 404 | Неверный путь Base URL | Убедитесь, что адрес указан до /v1, без полного пути интерфейса |
| 429 | Слишком высокая параллельность или исчерпана квота | Снизьте параллельность, включите повтор с задержкой |
| 400 | Параметр не поддерживается провайдером | Уберите несовместимое поле, сверьте имя модели |
| Пустой ответ | Вывод обрезан или сработал фильтр | Увеличьте лимит вывода, проверьте промпт и политику фильтрации |
| Ошибка разбора JSON | Модель добавила лишний текст | Ограничьте вывод JSON, повторите запрос один раз |
6. Контроль расходов: не позволяйте циклам раздувать счёт
Пакетная обработка в n8n легко превращает один вызов в сотни. Экономить нужно на уровне структуры сценария:
| Мера | Как реализовать | Эффект |
|---|---|---|
| Уровни моделей | Небольшие модели для классификации и очистки, сильные — для генерации | Снижает среднюю стоимость запроса |
| Ограничение вывода | Задайте максимум токенов, просите отвечать кратко | Длинные ответы не увеличивают счёт |
| Объединение запросов | Тексты, которые можно обработать пакетно, отправляйте одним запросом | Меньше запросов и повторяющегося контекста |
| Дедупликация | Пропускайте уже обработанные записи через базу или кэш | Нет повторных вызовов |
| Усечение контекста | Передавайте только нужные поля, длинные тексты сначала сокращайте | Меньше входных токенов |
| Учёт расхода | Сохраняйте поле usage из ответа и считайте по сценариям | Видно аномальное потребление |
Ещё две детали: в цикле каждый вызов тарифицируется отдельно, поэтому всё, что можно объединить, лучше объединить; при отладке не запускайте сценарий на всём массиве — сначала проверьте на одной записи. Конкретные цены смотрите в разделе тарифов.
7. Данные и права доступа
Автоматизация часто соприкасается с клиентскими данными, поэтому заранее определите:
- какие поля можно отправлять модели, а какие нужно обезличивать или обрабатывать локально;
- сохраняет ли провайдер запросы и использует ли их для обучения;
- сколько хранится история выполнений сценария с входными и выходными данными;
- кто имеет право экспортировать учётные данные и JSON сценариев;
- на каких этапах, связанных с договорами и персональными данными, нужен ручной контроль.
Самостоятельный хостинг n8n даёт больше контроля над маршрутом данных, но не означает автоматического соответствия требованиям: условия обработки данных у провайдера модели нужно проверять отдельно.
Частые вопросы
Поддерживает ли узел OpenAI в n8n собственный Base URL?
В большинстве версий в учётных данных OpenAI есть поле Base URL для прокси или собственного шлюза. Если в вашей версии такого поля нет, используйте узел HTTP Request и обращайтесь напрямую к /v1/chat/completions.
Почему в редакторе сценарий работает, а по расписанию падает?
Чаще всего различаются область действия учётных данных, переменные окружения или сетевой выход. Посмотрите конкретный узел и код ошибки в истории выполнений, затем проверьте, доступен ли адрес из экземпляра, где запускается расписание.
На что обратить внимание при пакетной обработке сотен записей?
Ограничьте параллельность и число повторов, присвойте каждой записи уникальный идентификатор, сохраняйте исходные данные при сбое. Лучше выполнять обработку партиями с паузами между ними, чтобы не упираться в лимиты.
Как оценить стоимость одного сценария?
Берите поле usage из ответов, суммируйте входные и выходные токены, умножьте на цену модели и добавьте повторы и неудачные запросы. Сначала прогоните 20–50 реальных примеров и усредните результат — это надёжнее оценки на глаз.
Что делать, если модель возвращает нестабильный JSON?
Зафиксируйте в промпте поля и типы, запретите лишние пояснения; добавьте вниз по потоку узел проверки JSON. При ошибке разбора повторите один раз, затем переведите запись в ручную обработку или очередь исключений.
Что дальше
Главное при подключении OpenAI к n8n — не красота схемы, а безопасность ключей, обработка ошибок и понятные границы расходов. Начните с одного реального бизнес-процесса и небольшого трафика, затем расширяйте. Если нужен единый OpenAI-совместимый вход и управление расходом, можно зарегистрироваться в ZSQH AI Gateway; модели и цены смотрите в разделе тарифов.
Читайте также:
