От n8n нужны ровно две вещи:
base_url = "https://speshu.ai/api/v1" и API-ключ в Authorization: Bearer. Больше ничего менять не нужно — n8n говорит с /chat/completions обычным OpenAI-совместимым запросом. Ключ создаётся на speshu.ai/profile.Установка
n8n работает в двух видах: облачный n8n Cloud и self-hosted. Дальше по странице подразумевается self-hosted — только у него есть переменные окружения.cURL
http://localhost:5678. Разбор установки n8n целиком — в документации n8n.
Переменная
SPESHU_API_KEY попадает в контейнер, но не в базу n8n. Если вы предпочитаете править credentials вручную, объявите её на хосте и подставьте при запуске — так ключ не останется в слое образа.Конфигурация
Шаг 1 — идентификатор модели
Идентификатор текстовой модели берётся из каталогаGET /api/v1/models и кладётся в переменную окружения. Зашивать его в код нельзя: состав каталога меняется, а зашитый в конфиг идентификатор начинает падать с 404 model_not_found без предупреждения.
cURL
-e или запишите в .env рядом с ним. Дальше они используются только как $env.SPESHU_MODEL и $env.MEDIA_MODEL.
В n8n Cloud переменных окружения нет — там то же самое делается через Settings → Variables, а в выражениях пишется
$vars.SPESHU_MODEL. На self-hosted доступ $env в выражениях регулируется флагом N8N_BLOCK_ENV_ACCESS_IN_NODE; при значении true переменные в выражениях не читаются, и тогда идентификатор модели задают прямо в узле.Шаг 2 — credentials
Создайте credentials типа OpenAI account:
Ключ внедряйте через
{{ }} — тогда он не хранится открытым текстом в самой записи credentials, а подставляется из окружения при выполнении.
Первый работающий пример
Соберите три узла: Webhook → AI Agent → Respond to Webhook.1
Триггер
Узел Webhook, метод
POST, путь /support. Он отдаёт тело запроса в $json.body, а не в $json напрямую — обычное отличие n8n от REST-фреймворков.2
Модель
В узле AI Agent добавьте под-узел OpenAI Chat Model:
Если ваша версия n8n загружает список моделей по адресу из credentials, выпадающий список моделей заполнится сам из
GET /api/v1/models — можно выбрать нужную оттуда. Это надёжнее, чем вписывать идентификатор руками.3
Промпт
Поле Prompt агента — выражение:Маркер
{{ }} в поле вставляется как Expression — тип поля переключается переключателем слева, а не вводом текста вместе с фигурными скобками.cURL
usage.cost.total_cost — сумма, списанная с кошелька в рублях, в формате OpenAI-ответа. Подробности — в разделе Тарификация и оплата.
Дополнительные возможности
Инструменты агента
AI Agent вызывает инструменты через узлы Tools: Code Tool, HTTP Request Tool, Google Sheets Tool, подключённые к вашим сервисам. Схема каждого инструмента уходит в полеtools запроса, а выбранный инструмент возвращается в choices[0].message.tool_calls — это тот же протокол, что и в обычном чате. Полный цикл, разбор аргументов и обработка параллельных вызовов — в гайде Вызов функций.
Структурированный вывод
Под-узел Structured Output Parser в связке с параметром узла агента Format → Output Schema заставляет модель вернуть JSON по схеме. Формат совпадает сresponse_format вида json_schema, который поддерживает /chat/completions. Разбор того, что модель делает со схемой, и когда нужен парсер с починкой — в гайде Структурированный вывод.
Изображения во входе
Узел OpenAI Chat Model вместе с узлом AI Message умеет передавать изображение по ссылке — задайте у сообщения типimageUrl и укажите публичный адрес файла. Так проще всего отдать в модель скриншот из CRM или аватар из таблицы. Требования к ссылке и все четыре типа блоков контента разобраны в гайде Медиаввод.
Генерация медиа
Медиа-API не OpenAI-совместимый, поэтому для него нужен явный вызов через узел HTTP Request. Создайте задачу:
Точный состав запроса и формат конверта:
cURL
Потоковая передача
AI-узлы n8n ждут полного ответа и отдают его в следующий узел целиком — инкрементального вывода в редакторе не будет. Потоковая передача пригодится, если вы вызываете/chat/completions напрямую из узла HTTP Request и хотите отдавать текст в собственный интерфейс по мере генерации. Учтите, что сервер не пишет поле event: и заканчивает поток строкой data: [DONE] — клиент, который разбирает SSE по event:, покажет пустой результат. Формат кадров и кадр со списанием — в гайде Потоковая передача.
Про векторный поиск
Два честных варианта. Вариант A — отдельный провайдер эмбеддингов. Создайте вторые credentials типа OpenAI account с адресом и ключом другого сервиса и укажите их только в узлах эмбеддингов и векторного хранилища. Генерация остаётся на SpeShu.AI.cURL
usage.cost.total_cost из ответа генерации, и векторному шагу добавить свою метку с соответствующего сервиса.
Вариант B — без эмбеддингов. Уберите узлы эмбеддингов и vector store и соберите обычный пайплайн: узел HTTP Request или Postgres отдаёт релевантные строки по обычным условиям, AI Agent отвечает на их основе, результат уходит дальше по графу. Для коротких баз знаний и структурированных таблиц этого обычно хватает, и весь расход остаётся в одном месте.
Частые проблемы
404 на запросе, хотя ключ и модель верны
404 на запросе, хотя ключ и модель верны
Проверьте адрес в credentials: без завершающего слэша и без потерянного
/v1. https://speshu.ai/api и https://speshu.ai/api/v1/ — обе частые причины, обе дают 404. Подробнее — в разделе Введение в API.401 invalid_api_key на первом же выполнении
401 invalid_api_key на первом же выполнении
Ключ не подставился: в поле credentials стоит
$env.SPESHU_API_KEY без обрамляющих {{ }}, либо в контейнер не передан SPESHU_API_KEY через -e. Проверьте значение в логе узла и командой curl https://speshu.ai/api/v1/balance -H "Authorization: Bearer $SPESHU_API_KEY".404 model_not_found после обновления каталога
404 model_not_found после обновления каталога
В узле модели зашит идентификатор, которого больше нет в
GET /api/v1/models. Замените его на $env.SPESHU_MODEL и обновите переменную: без этого каждое выполнение workflow будет падать. Почему так — в разделе Модели и цены.AI-узел молчит, а HTTP Request с теми же данными отвечает
AI-узел молчит, а HTTP Request с теми же данными отвечает
Различия в двух местах. Первое: узел Webhook отдаёт тело в
$json.body, а не в $json — выражение промпта на пустом объекте даёт пустой запрос. Второе: в узле AI Agent подключите под-узел модели именно к полю модели агента, а не оставляйте его висеть рядом отдельным узлом.400 invalid_request на запросе с изображением
400 invalid_request на запросе с изображением
Выбранная модель не принимает зрение — такой запрос отвергается целиком, а не игнорируется. Возьмите другую модель из каталога. Разбор — в гайде Медиаввод.
Что дальше
Модели и цены
Как выбрать модель под задачу
Запрос чату
Поля запроса и формат ответа
Вызов функций
Как AI Agent вызывает инструменты
Создать задачу
Медиа-конверт и
Idempotency-Key