# Document Generator (Open WebUI Tool) Инструмент для Open WebUI: генерация файлов **Word (.docx)**, **Excel (.xlsx)** и **PowerPoint (.pptx)** из ответов LLM с последующей загрузкой в файловое хранилище Open WebUI. - **Версия:** 3.7 - **Автор:** Ngo Tan Tai (https://newnol.io.vn) - **Лицензия:** MIT - **Требуемая версия Open WebUI:** ≥ 0.4.0 ## Возможности | Функция | Формат входа | Особенности | |---|---|---| | `generate_word_doc` | Markdown | Заголовки, bold/italic, `code`, списки, таблицы, блоки кода, ``, номера страниц | | `generate_excel_file` | JSON / CSV / Markdown-таблица | Автопоиск таблиц в nested JSON, несколько листов, защита от formula injection, автоширина колонок, автофильтр и закреплённая шапка | | `generate_pptx_file` | JSON / простой текст | Титульный слайд, спикер-ноуты, вставка картинок (URL, `/api/v1/files/...`, data URI), авто-разбиение «длинных» слайдов, 16:9, свой шаблон `.pptx` | ## Установка ### 1. Зависимости (важно!) Open WebUI **не устанавливает** пакеты из `requirements` в docstring автоматически — ставьте их в своё окружение: ```bash pip install -r requirements.txt # или по одному: pip install python-docx openpyxl python-pptx aiohttp pillow ``` Если инструмент работает в Docker-контейнере — добавьте эти пакеты в образ или смонтируйте их в `site-packages`. Без пакетов функция вернёт понятную ошибку вида `Не установлен пакет python-docx`, а не упадёт с `NameError`. ### 2. Регистрация инструмента Вариант A — через UI: **Settings → Tools → Create Tool**, вставьте содержимое `document_generator.py`. Вариант B — API: ```bash curl -X POST http://:8080/api/v1/tools/ \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "document-generator", "description": "Генерация Word, Excel и PowerPoint файлов", "function": "<содержимое document_generator.py>", "manifest": { "api_version": "v1", "required_open_webui_version": "0.4.0" } } EOF ``` ### 3. Настройка **Valves (админ):** | Валв | Значение по умолчанию | Назначение | |---|---|---| | `public_domain` | `https://your-openwebui-domain.com` | Публичный домен Open WebUI (без `/` в конце) — для ссылки «Скачать». Если не задан, берётся из запроса | | `internal_api_url` | `http://127.0.0.1:8080` | Внутренний URL API Open WebUI (для загрузки файлов) | | `max_rows` | 50000 | Excel: максимум строк на лист | | `max_slides` | 60 | PPTX: максимум слайдов | | `max_content_chars` | 200000 | Максимальная длина входного текста/JSON | | `allow_formulas` | false | Excel: разрешать строки, начинающиеся с `=` (как формулы) | | `convert_numeric_strings` | false | Excel: превращать `'123'`, `'1 234,5'` в числа | | `pptx_widescreen` | true | PPTX: формат 16:9 | | `pptx_template_path` | — | Путь к собственному `.pptx`-шаблону на сервере | **UserValves (каждый пользователь):** | Валв | Назначение | |---|---| | `openwebui_api_key` | **Обязательно.** API Key пользователя (Settings → Account → API Keys). Без него функция вернёт предупреждение | ## Примеры вызова ### Word ``` Сгенерируй Word-документ: title: "Отчёт за 2025" content: # Обзор За год выручка выросла на **23%**. ## Детали - Q1: 12 млн - Q2: 15 млн | Показатель | Значение | |---|---| | Выручка | 62 млн | ## Приложение Код: `select * from sales;` ``` ### Excel ``` Создай Excel-файл: filename: "quarterly_sales" data_json: [ {"Месяц": "Январь", "Продажи": 1250000, "Возвраты": 45000}, {"Месяц": "Февраль", "Продажи": 1380000, "Возвраты": 62000}, {"Месяц": "Март", "Продажи": 1510000, "Возвраты": 51000} ] ``` Несколько листов: ```json { "Сводка": [["Показатель", "Значение"], ["Выручка", 6200000]], "Детализация": [["Артикул", "Название", "Кол-во"], ["A-100", "Видеокарта", 12]] } ``` ### PowerPoint ``` Сделай презентацию: filename: "company_pitch" title: "Наше предложение" slides_content: [ {"title": "Кто мы", "content": "10 лет на рынке\n50+ корпоративных клиентов", "notes": "Начать с истории компании"}, {"title": "Продукт", "content": "Модульная платформа\nБыстрый старт за 1 день", "image": "/api/v1/files/abc123/content"} ] ``` Текстовый формат (без JSON) тоже работает: ``` Slide 1: Введение - Первый пункт - Подпункт - Второй пункт Slide 2: Результаты - Выручка +23% ``` ## Безопасность - **SSRF-защита:** внешние URL картинок резолвятся и проверяются — приватные адреса (loopback, 10/8, RFC1918 и т.п.) блокируются; редиректы запрещены (`allow_redirects=False`). - **Formula injection в Excel:** строки, начинающиеся с `=`, пишутся как обычный текст, пока `allow_formulas=true`. - **Имена файлов:** санитизация (`basename`, спецсимволы → `_`), лимит 100 символов. - **Лимиты:** размер входных данных, строк в Excel, слайдов, размера изображений — настраиваются через Valves. - **Внутренние пути:** из картинок разрешена только загрузка через `/api/v1/files//content`. ## Структура репозитория ``` document-generator/ ├── document_generator.py # сам инструмент (Open WebUI function) ├── requirements.txt # Python-зависимости └── README.md ```