Принимает сообщение с любым количеством прикреплённых файлов, загружает все в LangFlow параллельно и запускает workflow с передачей путей через tweaks.
- Неограниченное число файлов — 5, 10, 50 — всё загрузится
- Параллельная загрузка — все файки уходят одновременно (asyncio.gather + semaphore)
- Автообнаружение — сам находит File-компоненты в workflow
- Разумный маппинг — файлы распределяются по компонентам
- Streaming / blocking — потоковый или обычный вывод
1 компонент, N файлов → {"File-abc": {"path": ["f1.pdf", "f2.pdf", ...]}}
N компонентов, N файлов → {"File-abc": {"path": "f1.pdf"}, "File-def": {"path": "f2.pdf"}}
M компонентов, N файлов (N>M) → первые M-1 получают по 1, последний — остаток
docker compose up -dСервисы: OpenWebUI (3000), LangFlow (7860), Pipelines (9099)
Admin Panel → Settings → Pipelines → «+» → Install from URL
| Параметр | Обязательный | Описание |
|---|---|---|
LANGFLOW_BASE_URL |
✅ | http://langflow:7860 (Docker network) |
FLOW_ID |
✅ | UUID workflow из URL LangFlow |
FILE_COMPONENT_IDS |
❌ | ID компонентов через запятую. Если пусто — автоопределение |
LANGFLOW_API_KEY |
❌ | Ключ, если включена авторизация |
LANGFLOW_USER_ID |
❌ | Для /v2/files. Пусто = /v1 |
TIMEOUT |
❌ | Таймаут, сек (по умолч. 120) |
STREAM |
❌ | Потоковый вывод (по умолч. false) |
AUTO_DISCOVER_COMPONENTS |
❌ | Автоиск File-компонентов (по умолч. true) |
MAX_CONCURRENT_UPLOADS |
❌ | Параллельных загрузок (по умолч. 10) |
URL в браузере: http://localhost:7860/flow/<FLOW_ID>
Клик на компонент → правая панель → поле id
curl http://localhost:7860/api/v1/flows/<FLOW_ID> | python3 -m json.tool | grep -B2 -A2 '"File"'Просто оставьте FILE_COMPONENT_IDS пустым — pipeline сам найдёт все File-компоненты.
curl -X POST "http://langflow:7860/api/v1/files/upload/<FLOW_ID>" \
-F "file=@document.pdf"
# → {"file_path": "<FLOW_ID>/2025-01-01_12-00-00_document.pdf"}curl -X POST "http://langflow:7860/api/v1/run/<FLOW_ID>?stream=false" \
-H "Content-Type: application/json" \
-d '{
"input_value": "Analyze this",
"input_type": "chat",
"output_type": "chat",
"tweaks": {
"File-abc123": {"path": "<FLOW_ID>/2025-01-01_12-00-00_document.pdf"}
}
}'curl -X POST "http://langflow:7860/api/v1/run/<FLOW_ID>?stream=false" \
-H "Content-Type: application/json" \
-d '{
"input_value": "Compare these documents",
"tweaks": {
"File-abc123": {"path": ["path/to/f1.pdf", "path/to/f2.pdf", "path/to/f3.pdf"]}
}
}'curl -X POST "http://langflow:7860/api/v1/run/<FLOW_ID>?stream=false" \
-H "Content-Type: application/json" \
-d '{
"input_value": "Process these",
"tweaks": {
"File-abc123": {"path": "path/to/f1.pdf"},
"File-def456": {"path": "path/to/f2.pdf"}
}
}'- Проверь логи:
docker logs -f openwebui-pipelines - Убедись что
FILE_COMPONENT_IDSзаполнен илиAUTO_DISCOVER_COMPONENTS=true - Проверь что файлы реально прикреплены (в чате видны 📎)
- С
LANGFLOW_AUTO_LOGIN=true— не передавай пустойx-api-key - С авторизацией — создай API key в LangFlow → Settings → API
- Проверь
FLOW_ID— должен быть валидный UUID - Проверь что LangFlow жив:
curl http://langflow:7860/api/v1/version
- Убедись что File-компонент соединён с остальной цепочкой
- Попробуй запустить workflow вручную через LangFlow UI с файлом
- Увель
MAX_CONCURRENT_UPLOADS(по умолч. 10) - Увеличь
TIMEOUTдля больших файлов
# Логи
docker logs -f openwebui-pipelines
docker logs -f langflow
# Здоровье LangFlow
curl http://localhost:7860/api/v1/version
# Список файлов flow (v1)
curl http://localhost:7860/api/v1/files/<FLOW_ID>
# Структура flow (поиск File-компонентов)
curl -s http://localhost:7860/api/v1/flows/<FLOW_ID> | python3 -c "
import json, sys
d = json.load(sys.stdin)
nodes = d.get('data', {}).get('graph', {}).get('nodes', [])
for n in nodes:
nd = n.get('data', {})
if 'File' in nd.get('type', ''):
print(f' id={n.get(\"id\")}, type={nd.get(\"type\")}')
"