Включение и подключение модели
Настройка AI-ассистента (чат)
AI-ассистент StormBPMN — это чат, встроенный в приложение. Он умеет читать ваши диаграммы, процессы, роли и документы, отвечать на вопросы по базе знаний, создавать и редактировать BPMN-диаграммы, назначать роли и привязывать документы — всё реальными вызовами инструментов, а не выдумывая результат.
Чтобы ассистент заработал, нужно две вещи: подключить языковую модель (LLM) и включить чат. Обе настройки — в этой статье.
Что эта статья НЕ описывает
Здесь мы не разворачиваем собственную модель (vLLM, Ollama, llama.cpp и т.п.) — про развёртывание self-hosted LLM есть отдельный раздел: Self-hosted LLM. В этой статье мы подключаем Storm к уже работающему эндпоинту модели — облачному (OpenAI, Anthropic, ProxyAPI и пр.) или вашему собственному — и настраиваем поведение чата.
Два уровня настроек
Как и вся конфигурация StormBPMN (см. Конфигурация системы), настройка чата делится на:
Уровень 1 — включение на сервере: переменная окружения MCP_ENABLED и лицензия с AI-модулем (enableAiFeatures). ENV требует перезапуска приложения; AI-модуль — соответствующей лицензии.
Уровень 2 — Админ-панель (тонкая настройка): тумблер «Включение ИИ-Чата», модель, токен, температура, промпты, порог качества. Применяются на лету, без перезапуска.
Шаг 1. Включение чата
Чтобы кнопка чата появилась у пользователя, должны выполняться все условия ниже.
| Параметр | Где | Описание | По умолчанию |
|---|---|---|---|
| MCP_ENABLED | Переменная окружения (ENV) | Включает все сервисы чата на бэкенде. Без неё чат полностью выключен. | false |
| AI-модуль в лицензии | Лицензия (enableAiFeatures) | Чат, как и вся AI-функциональность, входит в AI-модуль. Без него API чата закрыто, кнопки нет. | — |
| Включение ИИ-Чата | Админ-панель → «🤖 AI-ассистент» | Тумблер показа кнопки чата. Позволяет включать/выключать чат без правки лицензии и ENV. | включён |
Итого, чтобы чат был доступен пользователю:
- На бэкенде задано
MCP_ENABLED=true(после изменения — перезапуск контейнера); - Лицензия включает AI-модуль (
enableAiFeatures); - В админ-панели включён тумблер «Включение ИИ-Чата» (по умолчанию включён);
- Пользователь авторизован.
Кнопки чата нет, хотя `MCP_ENABLED=true`?
Проверьте по порядку: (1) лицензия содержит AI-модуль (enableAiFeatures); (2) в админ-панели, раздел «🤖 AI-ассистент», включён тумблер «Включение ИИ-Чата»; (3) вы авторизованы. Тумблер — самый быстрый способ скрыть или показать чат без изменения лицензии или ENV.
Шаг 2. Где настраивается модель
Все остальные настройки — в админ-панели, в разделе «🤖 AI-ассистент». Ключевые блоки для чата:
- Включение ИИ-Чата — тумблер показа кнопки чата (см. Шаг 1);
- Основная модель — модель для чтения и обычных ответов;
- Отдельная модель для правок (write) — необязательно: можно направить ходы, меняющие данные, на более надёжную/мощную модель;
- Порог качества правок — авто-доработка диаграммы под линтер;
- Системные промпты — инструкции ассистенту (базовый + отдельный для правок).
В том же разделе ниже есть настройки «классических» AI-функций (автодополнение BPMN, анализ процессов, Assistants API) — они к чату напрямую не относятся.
Совет
Изменения в админ-панели применяются на следующем запросе в чат — перезапуск не нужен. Токен отображается как поле пароля (маскируется).
Основная модель
Минимально необходимый набор полей для работы чата.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
| Формат API | выбор | ✅ | OPENAI или ANTHROPIC — какой «диалект» API у эндпоинта. Должен совпадать с URL и моделью. |
| Базовый URL | строка | ✅ | Адрес эндпоинта модели без /v1 — путь дописывается автоматически. |
| Токен | пароль | ✅¹ | API-ключ провайдера. Маскируется в интерфейсе. |
| Модель | строка | ✅ | Идентификатор модели (например gpt-4.1, актуальный id Claude, или имя вашей self-hosted модели). |
| Температура | число (дробное) | — | Креативность ответа, 0.0–2.0. Пусто = параметр не отправляется (нужно для reasoning-моделей). |
| Лимит токенов | число (целое) | — | Максимум токенов в ответе. Пусто — модель использует свой дефолт (для ANTHROPIC применяется 4096). |
| Стриминг ответа | тумблер | — | Печатать ответ по мере генерации. Включён по умолчанию; выключайте, только если шлюз не принимает потоковые ответы (см. Стриминг ответа). |
¹ Токен может быть пустым только для self-hosted эндпоинта без авторизации.
Формат API: OPENAI или ANTHROPIC
Формат определяет, по какому контракту Storm общается с моделью:
OPENAI— OpenAI-совместимый API. Подходит для OpenAI, DeepSeek, OpenRouter, ProxyAPI, а также для большинства self-hosted решений (vLLM, Ollama, llama.cpp в режиме OpenAI-совместимости). Storm обращается по пути…/v1/chat/completions.ANTHROPIC— нативный API Anthropic (Claude). Storm обращается по пути…/v1/messages, авторизация через заголовокx-api-key.
Формат, URL и модель должны быть согласованы
Нельзя указать формат OPENAI с URL Anthropic, или модель Claude с форматом OPENAI. Несовпадение даёт ошибки 400/404 от провайдера.
Базовый URL — без /v1!
Указывайте корень эндпоинта, без /v1 и без /chat/completions. Storm сам дописывает нужный путь в зависимости от формата.
| Провайдер / случай | Базовый URL |
|---|---|
| OpenAI напрямую | https://api.openai.com |
| Anthropic напрямую | https://api.anthropic.com |
| ProxyAPI — OpenAI | https://api.proxyapi.ru/openai |
| ProxyAPI — DeepSeek / OpenRouter | https://api.proxyapi.ru/openrouter |
| ProxyAPI — Anthropic | https://api.proxyapi.ru/anthropic |
| Self-hosted (OpenAI-совместимый) | http://10.0.0.5:8000 (адрес вашего сервиса) |
Температура
Управляет «творческостью»: ниже — стабильнее и предсказуемее, выше — разнообразнее. Для рабочего ассистента рекомендуется 0.2.
Reasoning-модели и температура
Некоторые модели (o-серия OpenAI, deepseek-reasoner и подобные «думающие») не принимают параметр температуры и возвращают 400, если он передан. Для таких моделей оставьте поле температуры пустым — тогда Storm вообще не отправит этот параметр.
Лимит токенов
Максимальная длина ответа модели.
OPENAI: если поле пустое — параметр не отправляется, действует дефолт модели.ANTHROPIC: параметр обязателен; если поле пустое — Storm подставляет4096.
Увеличьте значение, если ответы обрываются на полуслове.
Стриминг ответа
По умолчанию ассистент печатает ответ по мере генерации: пользователь видит первые слова через секунду-полторы и читает текст, пока модель ещё работает. Так работает чат «из коробки», и менять это не нужно.
Тумблер «Стриминг ответа» (раздел «🤖 AI-ассистент») существует для одного случая: ваш LLM-шлюз не принимает потоковые ответы и отвечает ошибкой 400. Такое встречается у корпоративных шлюзов и части self-hosted-прокси, которые проксируют модель, но не поддерживают Server-Sent Events.
| Положение тумблера | Что уходит в запросе | Как выглядит ответ |
|---|---|---|
| Включён (по умолчанию) | "stream": true | Текст печатается постепенно, как в привычных чат-ботах. |
| Выключен | "stream": false | Ответ появляется целиком, одним блоком, после ожидания. |
Это ухудшает впечатление от чата
Без стриминга пользователь несколько десятков секунд смотрит на индикатор загрузки, а затем получает «простыню» текста разом. Выключайте тумблер, только если со включённым чат не работает вообще.
Что при этом не меняется:
- Вызовы инструментов работают одинаково в обоих режимах. Подсказки вида «Ищу диаграммы…», «Редактирую…» приходят как обычно — они не зависят от потока текста.
- Правки диаграмм, поиск, база знаний — без изменений.
- Режим общий для основной и для отдельной write-модели: настраивать его дважды не нужно.
Параметр `stream_options` Storm не отправляет
Некоторые шлюзы жалуются именно на stream_options: {"include_usage": true}. Storm этот параметр не передаёт ни в одном из режимов. Если ваш шлюз сообщает о нём, запрос почти наверняка приходит к нему не от Storm — стоит свериться с сырым телом запроса в логах шлюза.
Долгие ответы и таймаут
С выключенным стримингом на каждый HTTP-запрос к модели действует таймаут чтения 180 секунд (лимит на один запрос, а не на весь ход: при работе с инструментами Storm делает несколько запросов подряд, и у каждого свой таймаут). Если модель на вашем оборудовании отвечает медленнее, ход завершится ошибкой. Со включённым стримингом такого ограничения нет.
Размышления (thinking)
Доступно в версиях после 6.6.6955.
«Размышления» — режим, в котором модель думает перед ответом, а ход мыслей стримится пользователю живым сворачиваемым блоком «Ход мыслей» над ответом: видно, что ассистент делает на долгих ходах, и почему он пришёл именно к такому результату. С первым словом ответа блок сворачивается.
Управляется настройкой «Размышления AI (thinking)» (bpmnAiChatThinking) в разделе «🤖 AI-ассистент». Это выбор из трёх значений:
| Значение | Когда выбирать | Что уходит в запросе |
|---|---|---|
unsupported (по умолчанию) | Провайдер не понимает параметр chat_template_kwargs — облачный OpenAI, большинство прокси | Параметр не отправляется вовсе |
disabled | Модель на vLLM, но размышления не нужны | enable_thinking: false — важно для Qwen3 и новее: иначе модель «думает» по умолчанию и тратит токены впустую |
enabled | Модель на vLLM, размышления нужны | enable_thinking: true — ход мыслей стримится пользователю |
Для отдельной write-модели есть парная настройка bpmnAiWriteThinking с теми же значениями. Она не наследуется от основной — если используете write-модель, задайте значение явно.
Ограничения
- Работает только с форматом
OPENAIповерх vLLM: облачный OpenAI отвергаетchat_template_kwargsошибкой400— для него оставьтеunsupported. enabledтребует включённого тумблера «Стриминг ответа» (bpmnAiCompletionStream); в блокирующем режиме размышления игнорируются.- Цена: ответ становится дольше и дороже на reasoning-токены (порядка сотен токенов даже на простой вопрос). После включения понаблюдайте за латентностью вашего LLM-сервера.
Включайте после полного обновления
Включайте enabled только когда обновлены и бэкенд, и фронтенд до версии с поддержкой размышлений: старые сборки интерфейса не знают о потоке мыслей и могут показать его как часть обычного ответа. Значение по умолчанию (unsupported) это исключает.
Примеры подключения
ProxyAPI (российский прокси к зарубежным LLM)
ProxyAPI даёт доступ к OpenAI / Anthropic / DeepSeek из РФ. Базовый URL зависит от провайдера, путь — /openai, /openrouter или /anthropic.
Важно про `/v1` и ProxyAPI
В официальной документации ProxyAPI базовый URL указан как https://api.proxyapi.ru/openai/v1 (с /v1) — так его ждёт OpenAI-клиент. В Storm /v1 писать НЕ нужно — приложение дописывает /v1/chat/completions само. То есть в поле «Базовый URL» вводите https://api.proxyapi.ru/openai (без /v1). То же правило для любого OpenAI-совместимого эндпоинта (vLLM, Ollama и т.п.).
OpenAI через ProxyAPI:
| Поле | Значение |
|---|---|
| Формат API | OPENAI |
| Базовый URL | https://api.proxyapi.ru/openai |
| Модель | gpt-4.1 (или другая OpenAI) |
| Токен | ключ из личного кабинета ProxyAPI |
DeepSeek через ProxyAPI (идёт через /openrouter):
| Поле | Значение |
|---|---|
| Формат API | OPENAI |
| Базовый URL | https://api.proxyapi.ru/openrouter |
| Модель | deepseek/deepseek-chat-v3.1 |
| Токен | ключ ProxyAPI |
Anthropic (Claude) через ProxyAPI:
| Поле | Значение |
|---|---|
| Формат API | ANTHROPIC |
| Базовый URL | https://api.proxyapi.ru/anthropic |
| Модель | актуальный id Claude (см. док. Anthropic) |
| Токен | ключ ProxyAPI |
| Лимит токенов | например 4096 |
OpenAI напрямую:
| Поле | Значение |
|---|---|
| Формат API | OPENAI |
| Базовый URL | https://api.openai.com |
| Модель | gpt-4.1 |
| Токен | ключ OpenAI (sk-...) |
Self-hosted OpenAI-совместимый эндпоинт (например, ваша модель за vLLM или Ollama):
| Поле | Значение |
|---|---|
| Формат API | OPENAI |
| Базовый URL | http://10.0.0.5:8000 (ваш адрес) |
| Модель | имя модели как её отдаёт сервис |
| Токен | ваш ключ или пусто (если без авторизации) |
Развёртывание собственной модели — отдельная тема
Как поднять vLLM/Ollama, какие модели выбрать и как их обслуживать — см. отдельный раздел Self-hosted LLM. Здесь предполагается, что у вас уже есть рабочий OpenAI-совместимый эндпоинт, и мы лишь указываем на него Storm.
Отдельная модель для правок (write) — необязательно
Ходы, которые меняют данные (создать/изменить диаграмму, назначить роль, привязать документ), сложнее обычного чтения: слабые модели чаще ошибаются. Поэтому такие ходы можно направить на отдельную, более надёжную модель (например, облачную), оставив чтение на основной.
Блок «Отдельная модель для правок (write)» содержит те же поля, что и основная модель (Формат / Базовый URL / Токен / Модель / Температура / Лимит токенов), но все они необязательны.
Как работает наследование
- Поле «Модель» — ключ активации. Если оно пустое, весь блок write игнорируется, и правки идут на основную модель.
- Если «Модель» задана — write-ходы идут на write-модель, а любое пустое поле наследуется от основной (URL, токен, формат, температура, лимит — что не задали, берётся из основной модели).
Когда это полезно: основная модель — быстрая/дешёвая (в т.ч. self-hosted) для чтения, а правки — на более «умной» облачной модели для надёжности.
Порог качества правок
| Поле | Тип | По умолчанию | Диапазон |
|---|---|---|---|
| Порог качества | число (дробное) | 8.0 | 0.0–10.0 |
После того как ассистент отредактировал диаграмму, Storm прогоняет её через собственный линтер качества (детерминированную проверку BPMN). Если оценка ниже порога, ассистент скрыто переделывает диаграмму под линтер — и только потом показывает ответ пользователю.
- Выше порог (ближе к
10) — строже требования к качеству, чаще авто-доработка. - Ниже порог — мягче, реже вмешательство.
Системные промпты
Промпты — это инструкции, которые задают поведение ассистента. Их два, и они разделены по типу хода:
| Промпт | Когда применяется | Тип |
|---|---|---|
| Базовый системный промпт | Ходы чтения / вопросы / уточнения (read) | многострочный текст |
| Системный промпт для правок (write) | Ходы, меняющие данные (write) — необязательный | многострочный текст |
Как они взаимодействуют
- На read-ходах действует базовый промпт.
- На write-ходах базовый промпт полностью заменяется на write-промпт (он сфокусирован на исполнении правок и запрете «выдуманных» результатов).
- Если write-промпт пустой — на write-ходах используется базовый.
Оба промпта редактируются прямо в админ-панели (поле «многострочный текст»). Под полем показывается счётчик символов и кнопка сохранения.
Промпты поставляются оптимизированными — менять не рекомендуется
Системные промпты тщательно настроены под поведение ассистента (off-topic-фильтр, работа с инструментами, анти-фабрикация, правила BPMN). Мы рекомендуем не менять их без необходимости — неаккуратная правка легко ломает работу чата.
Промпты могут перезаписываться при обновлении
Системные промпты обновляются вместе со StormBPMN (через миграции). Если вы изменили промпт под себя — при обновлении версии ваша правка может быть перезаписана нашей новой версией промпта. Поэтому: сохраняйте свою версию промпта отдельно (например, в своём репозитории/документе), чтобы после обновления при необходимости вернуть её вручную.
Диагностика (FAQ)
Провайдер возвращает 400 / 404
- Базовый URL с
/v1на конце — уберите/v1, Storm дописывает путь сам. - Несовпадение формата — например
OPENAI-формат с URL Anthropic. Сверьте Формат ↔ URL ↔ Модель. - Температура на reasoning-модели — оставьте поле температуры пустым (o-серия,
deepseek-reasonerи др.). - Шлюз не принимает потоковый ответ — если в логах шлюза видно отказ на
"stream": true, выключите тумблер «Стриминг ответа» (см. раздел выше).
Чат не отвечает, шлюз ругается на `stream` / `stream_options`
Выключите тумблер «Стриминг ответа» — Storm будет отправлять "stream": false и забирать ответ одним запросом. Ответы начнут приходить целиком после ожидания, но чат заработает.
Параметр stream_options Storm не отправляет никогда, ни в потоковом режиме, ни в обычном.
Включил размышления — ничего не изменилось или ошибка 400
Проверьте по порядку: (1) формат API — OPENAI, модель работает на vLLM (облачный OpenAI отвечает 400 на chat_template_kwargs — верните unsupported); (2) включён тумблер «Стриминг ответа» — без него размышления игнорируются; (3) обе части приложения (бэкенд и фронтенд) обновлены до версии после 6.6.6955; (4) если правки идут через отдельную write-модель — у неё своя настройка bpmnAiWriteThinking, она не наследуется.
ANTHROPIC: ошибка про max_tokens
Для формата ANTHROPIC лимит токенов обязателен. Если поле пустое, Storm подставит 4096; при ошибке — задайте лимит явно (например 4096).
Ответы обрываются на середине
Увеличьте Лимит токенов в настройках модели.
Кнопки чата нет в интерфейсе
Проверьте: (1) MCP_ENABLED=true на бэкенде и контейнер перезапущен; (2) лицензия содержит AI-модуль (enableAiFeatures); (3) в админ-панели, раздел «🤖 AI-ассистент», включён тумблер «Включение ИИ-Чата»; (4) вы авторизованы.
Изменил настройки — не применилось
Настройки модели/промптов из админ-панели применяются на следующем запросе в чат, перезапуск не нужен. А вот MCP_ENABLED (ENV) требует перезапуска контейнера.