Вложения файлов и импорт схем
Вложения файлов в AI-чат и импорт схем
Доступно в версиях после 6.6.6955.
К сообщению в AI-чате можно прикладывать файлы — кнопкой-скрепкой или перетаскиванием прямо в панель чата (до 3 файлов на одно сообщение). Дальше зависит от типа файла:
- Документы (txt, pdf, docx и др.) — Storm извлекает из них текст, и ассистент отвечает по содержимому: «сделай диаграмму по этому регламенту», «сравни процесс с этой инструкцией».
- Схемы (BPMN, draw.io, Visio) — на карточке вложения появляется кнопка, которая одним нажатием превращает схему в диаграмму Storm.
Функция по умолчанию выключена и включается тумблером в админ-панели (см. Шаг 3).
Два класса файлов
| Класс | Расширения | Кто обрабатывает | Лимит размера |
|---|---|---|---|
| Документы | .txt .md .markdown .csv .json .doc .docx .pdf | Сервис storm-media (см. Шаг 2) | настройка chatFileMaxBytes, по умолчанию 25 МБ |
| Схемы | .bpmn .drawio .vsdx | Бэкенд Storm сам, storm-media не нужен | фиксированно 10 МБ |
Как storm-media разбирает документы:
.txt/.csv/.json— как текст;.md/.markdown— как markdown;.docx— конвертация в markdown;.doc— конвертация через LibreOffice (headless, встроен в образ);.pdf— текстовый слой; страницы без текстового слоя (сканы) уходят в OCR (tesseract, русский + английский из коробки).
GPU для документов не нужен
Извлечение текста из документов работает на CPU — GPU в storm-media нужен только локальному распознаванию речи (Whisper). Если голосовой ввод вам не нужен, storm-media можно развернуть на обычной машине без видеокарты.
Как это работает
Браузер (скрепка / drag&drop, ≤3 файлов)
│ файл
▼
Бэкенд Storm ──► S3 (bucket uploads)
│
│ POST /v1/jobs/from-url { sourceUrl: <presigned-ссылка на S3, TTL 15 мин> }
▼
storm-media ──── скачивает файл из S3 сам ────► извлекает текст
▲ │
└────────── бэкенд поллит статус до READY ◄──────┘
Текст вложения подмешивается в контекст хода (бюджет символов настраивается)
Две важные детали этой схемы:
- Файл не проходит через бэкенд в storm-media. Бэкенд кладёт его в S3 и передаёт storm-media presigned-ссылку — storm-media скачивает файл самостоятельно. Поэтому S3 должен быть доступен с хоста storm-media (см. Шаг 1).
- Схемы (
.bpmn/.drawio/.vsdx) в storm-media не отправляются вовсе — бэкенд разбирает их сам. Импорт схем работает даже там, где storm-media не развёрнут (но тогда документы-вложения обрабатываться не будут).
Импорт схем в модели
На карточке приложенной схемы появляется кнопка — подпись зависит от формата и честно отражает, что произойдёт:
| Формат | Кнопка | Что происходит |
|---|---|---|
.bpmn | «Загрузить как модель» | Файл сохраняется тем же путём, что диалог «Загрузить BPMN»: раскладка один-в-один, версия №1, проверка качества, индексация поиска. Ничего не перерисовывается. |
.drawio | «Собрать модель по схеме» | Storm детерминированно разбирает фигуры и дорожки схемы; если уверенно опознал — LLM не участвует. Иначе схему восстанавливает LLM. |
.vsdx (Visio) | «Собрать модель по схеме» | Аналогично draw.io: сначала детерминированный разбор по фигурам-мастерам, LLM — только как запасной путь. |
Повторное нажатие кнопки не создаёт дубликат — возвращается уже созданная диаграмма; на карточке остаётся ссылка на неё.
Ограничения «Собрать модель по схеме»
- Если схему восстанавливала LLM, результат нужно проверить глазами: модель может ошибиться в количестве элементов или подписях. Дорожки (lanes) на LLM-пути теряются.
- Дорожки из Visio не переносятся: принадлежность фигуры полосе там задана геометрией, а не структурой файла.
- В детерминированном разборе draw.io и в прямой загрузке
.bpmnдорожки сохраняются.
Шаг 1. Требования
| Условие | Где | Комментарий |
|---|---|---|
MCP_ENABLED=true + AI-модуль в лицензии | ENV / лицензия | Вложения — часть AI-чата (см. Включение чата) |
| Подключённая LLM | Админ-панель | Нужна для чата вообще и для LLM-пути импорта схем |
| Сервис storm-media | Отдельный хост/контейнер | Только для документов. Схемы работают без него |
| S3 доступен с хоста storm-media | Ваша сеть | storm-media скачивает файлы по presigned-ссылкам |
S3 и переменная `S3_EXTERNAL_ENDPOINT`
Presigned-ссылки строятся от внешнего адреса S3 — property s3.externalEndpoint (ENV S3_EXTERNAL_ENDPOINT); если он не задан, используется основной s3.endpoint (ENV S3_ENDPOINT / MINIO_ENDPOINT). Проверьте, что именно этот адрес резолвится и открыт с машины storm-media — это самая частая причина «файл вечно обрабатывается».
Шаг 2. storm-media
Развёртывание сервиса описано в статье «Голосовой ввод (storm-media)» — это тот же контейнер: если голосовой ввод у вас уже работает, дополнительно разворачивать ничего не нужно, обработка документов уже внутри (tesseract и LibreOffice встроены в образ, отдельных секретов не требуется).
Подключение бэкенда к storm-media — те же две настройки админ-панели, что и у голосового ввода: stormMediaBaseUrl и stormMediaToken (раздел «🤖 AI-ассистент»). Если они не заполнены, документы-вложения обрабатываться не будут (пользователь увидит «Вложения в чате не настроены»); схемы продолжат работать.
Тонкая настройка документного конвейера — через ENV storm-media (дефолты разумные, менять обычно не нужно): OCR_LANGUAGES (по умолчанию rus+eng), MAX_PDF_PAGES, DOC_CONCURRENCY и др. — см. .env.example образа.
Порядок обновления: сначала storm-media, потом бэкенд
Поддержка .json и .csv появилась в storm-media одновременно с фичей вложений. Если обновить бэкенд, оставив старый storm-media, эти форматы будут получать ошибку «Неподдерживаемый формат». Обновляйте контейнер storm-media до (или вместе с) обновлением основного приложения.
Шаг 3. Включить в админ-панели
Раздел «🤖 AI-ассистент», подгруппа настроек файлов. Применяются на лету, без перезапуска.
| Настройка (ключ) | Тип | По умолчанию | Описание |
|---|---|---|---|
Файлы в чате (chatFileUploadEnabled) | тумблер | выключено | Показывает скрепку и включает приём вложений |
Максимальный размер (chatFileMaxBytes) | число | 26214400 (25 МБ) | Потолок размера одного файла в байтах. Для схем (.bpmn/.drawio/.vsdx) независимо действует свой потолок 10 МБ |
Бюджет символов на ход (chatFileContextCharBudget) | число | 150000 | Сколько символов из вложений суммарно подмешивается в один ход. Что не влезло — обрезается с явной пометкой в промпте, ассистент об этом знает |
Итоговый чек-лист:
- Чат работает (LLM подключена,
MCP_ENABLED=true, лицензия с AI-модулем); - storm-media запущен,
GET /readyотвечает успешно,stormMediaBaseUrlиstormMediaTokenзаполнены (для документов); - Адрес S3 из presigned-ссылок доступен с хоста storm-media;
- Включён тумблер «Файлы в чате» — в поле ввода появилась скрепка.
Устранение неполадок
| Симптом | Причина | Решение |
|---|---|---|
| Скрепки нет в чате | Тумблер chatFileUploadEnabled выключен или сам чат недоступен | Включите тумблер; проверьте условия работы чата |
| «Вложения в чате не настроены» | Пустые stormMediaBaseUrl / stormMediaToken | Заполните обе настройки (см. Голосовой ввод, Шаг 3–4) |
| Документ «вечно обрабатывается» или падает | storm-media не может скачать файл из S3 | Проверьте доступность адреса из S3_EXTERNAL_ENDPOINT (или S3_ENDPOINT) с хоста storm-media; смотрите логи storm-media |
.json / .csv → «Неподдерживаемый формат» | Старый образ storm-media | Обновите контейнер storm-media |
| «Файл слишком большой» | Превышен chatFileMaxBytes (документы) или 10 МБ (схемы) | Уменьшите файл или поднимите настройку (для документов) |
| Скан-PDF распознался с ошибками | Качество скана / язык вне rus+eng | Добавьте язык в OCR_LANGUAGES storm-media; для плохих сканов OCR не всесилен |
| Из схемы собралась «не та» диаграмма | Схему восстанавливала LLM (кнопка «Собрать модель по схеме») | Проверьте и поправьте результат в редакторе; это ожидаемое поведение LLM-пути |