7.0 KiB
7.0 KiB
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, списки, таблицы, блоки кода, <pagebreak>, номера страниц |
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 автоматически — ставьте их в своё окружение:
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:
curl -X POST http://<open-webui>:8080/api/v1/tools/ \
-H "Authorization: Bearer <ADMIN_API_KEY>" \
-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 млн |
<pagebreak>
## Приложение
Код: `select * from sales;`
Excel
Создай Excel-файл:
filename: "quarterly_sales"
data_json:
[
{"Месяц": "Январь", "Продажи": 1250000, "Возвраты": 45000},
{"Месяц": "Февраль", "Продажи": 1380000, "Возвраты": 62000},
{"Месяц": "Март", "Продажи": 1510000, "Возвраты": 51000}
]
Несколько листов:
{
"Сводка": [["Показатель", "Значение"], ["Выручка", 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/<id>/content.
Структура репозитория
document-generator/
├── document_generator.py # сам инструмент (Open WebUI function)
├── requirements.txt # Python-зависимости
└── README.md