docs: README.md с примерами вызова, установкой и настройкой
This commit is contained in:
1 parent
0875fdee69
commit
1dd5be68dd
1 file changed
+161
@@ -0,0 +1,161 @@
|
|||||||
|
# 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 автоматически — ставьте их в своё окружение:
|
||||||
|
|
||||||
|
```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://<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}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Несколько листов:
|
||||||
|
|
||||||
|
```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/<id>/content`.
|
||||||
|
|
||||||
|
## Структура репозитория
|
||||||
|
|
||||||
|
```
|
||||||
|
document-generator/
|
||||||
|
├── document_generator.py # сам инструмент (Open WebUI function)
|
||||||
|
├── requirements.txt # Python-зависимости
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
Reference in new issue
Block a user