busya 3133e50645 perf: fix translate deadlock, speed, trace_id, UI bugs — fullstack patch
## Backend (7 production files + 6 test files)

### P0-2: LLM output truncation cascade fix
- _token_budget.py: OUTPUT_PER_ROW_PER_LANG 120→200, OUTPUT_SAFETY_FACTOR 0.70→0.55
- Prevents finish_reason=length → split → retry cascade (3 calls → 1 call per batch)
- P2-8: added qwen-flash/qwen-plus/qwen-max/qwen-coder to PROVIDER_DEFAULTS

### P1-4/P1-5: EncryptionManager singleton
- encryption.py: get_encryption_manager() process-wide singleton
- llm_provider.py: use singleton instead of new EncryptionManager() per batch
- Eliminates ~90 redundant Fernet key validations per translation run

### P1-6: Cache-hit log aggregation
- _batch_proc.py: one log per batch (batch_rows + cache_hits) instead of per-row
- 1076 log lines → ~30 per run

### P1-7: Timezone-aware datetime fix
- scheduler.py: _ensure_aware() helper for naive DB datetime → UTC-aware
- Fixes TypeError in scheduled translation concurrency check

### P2-9: Connection test timeout
- connection_service.py: asyncio.wait_for(15s) on all dialect tests
- Prevents 2-minute UI hangs from DNS/TCP stalls

### Trace ID propagation
- middleware/trace.py: inject x-trace-id response header via ASGI send wrapper

### Test fixes & integration tests
- test_scheduler.py: AsyncMock for execute_run, mock get_async_job_runner
- test_sql_insert_service.py: AsyncMock for execute_sql
- test_token_budget.py: batch_size 50→45 for new OUTPUT_PER_ROW_PER_LANG=200
- test_encryption.py: +2 singleton tests
- test_scheduler_ensure_aware.py: +4 (naive→aware, passthrough, None, subtraction)
- test_batch_classify_persist.py: +2 cache-hit aggregation tests
- test_connection_service_edge.py: +2 timeout tests
- test_trace_middleware.py: +4 x-trace-id header tests
- test_token_budget.py: +4 qwen-flash/O200 tests

## Frontend (7 production files + 5 test files)

### Trace ID propagation
- api.ts: _captureTraceId() reads x-trace-id → setTraceId() in fetchApi/requestApi/postApi/deleteApi

### Duplicate datasource columns fetch
- ConfigTabForm.svelte: guard availableColumns.length === 0 before fetch

### Admin pages Svelte 5 runes fix
- admin/users/+page.svelte: plain let → () for all template-bound vars
- admin/roles/+page.svelte: same fix
- Both pages were stuck on «Загрузка...» due to mixed reactivity models

### Validation popover positioning
- +page.svelte: pass trigger HTMLElement instead of event
- DashboardHubModel.svelte.ts: toggleValidationPopover(HTMLElement), closeValidationPopover()
- Added X close button + click-outside overlay + i18n

### Test fixes & integration tests
- api.test.ts: mock setTraceId/getTraceId, +3 _captureTraceId tests
- provider_config.integration.test.ts: handleDelete→promptDeleteProvider
- DatasetPreview.test.ts: dashboards/ → ROUTES.dashboards
- test_config_tab_form.svelte.js: +2 columns fetch guard tests (NEW)
- admin-users.test.ts: +3 loading→table tests (NEW)
- admin-roles.test.ts: +2 loading→table tests (NEW)

## Semantic curation
- Removed @COMPLEXITY N from 6 route files + metrics.py (duplicate of [C:N])
- Added [C:N] to 2 orphan child contracts in metrics.py
- Added [C:N] + @BRIEF to 4 frontend anchors
- Fixed #region → # #region consistency in validation_tasks.py

## Verification
- Backend: 608 pytest passed (0 failures)
- Frontend: 2472 vitest passed (128 files, 0 failures)
- Frontend build: ✓ built in 18s
- Browser: dashboards, admin/users, admin/roles, validation popover — all green
2026-06-18 23:54:57 +03:00
2026-06-08 15:08:02 +03:00
2026-03-27 21:27:31 +03:00
2026-03-10 12:00:18 +03:00
2026-05-08 10:07:05 +03:00
2026-06-09 09:43:34 +03:00
2026-03-09 14:18:34 +03:00
2026-05-27 10:49:06 +03:00

superset-tools

Python 3.9+ Node 18+ License: MIT Docker

Инструменты автоматизации для Apache Superset: миграция, версионирование, аналитика и управление данными

📋 Содержание

📖 О проекте

superset-tools — комплексная платформа для автоматизации работы с Apache Superset, предоставляющая инструменты для LLM-перевода контента баз данных, миграции дашбордов, управления версиями через Git, LLM-аналитики и многопользовательского контроля доступа. Система построена на модульной архитектуре с плагинной системой расширений.

Возможности

🌐 LLM-перевод контента баз данных — главная фича

superset-tools умеет переводить данные прямо в вашей БД: сотни тысяч строк номенклатуры, спецификаций, паспортов изделий — за один прогон. Никакой ручной работы, никаких копипаст в Google Translate.

Как это работает: выбираете таблицу-источник, указываете колонки, задаёте целевые языки и LLM-провайдера. superset-tools читает данные, отправляет в LLM и пишет перевод обратно — напрямую в целевую таблицу или через Superset SQL Lab.

Ключевые возможности модуля:

  • Multi-language одной LLM-сессией — одна строка переводится сразу на несколько языков (ru, en, de, fr, zh, kk и любые другие) в одном запросе к LLM. Экономия токенов и времени.
  • Любой LLM-провайдер — Qwen, DeepSeek, GPT-4o, Claude, YandexGPT, GigaChat — всё, что совместимо с OpenAI API. Меняете модель в конфигурации джобы.
  • Preview-воркфлоу — перед полноценным прогоном superset-tools показывает сэмпл перевода. Вы просматриваете строки, правите неудачные варианты, подтверждаете — и только потом запускаете полный прогон.
  • Словари терминологии — загрузите CSV/TSV с правильными переводами ваших доменных терминов: «плавка → melt», «сортопрокат → bar stock», «ТУ → technical specifications». Словари автоматически подмешиваются в промпт, LLM использует именно вашу терминологию.
  • Inline-коррекция — увидели плохой перевод в результатах? Правите прямо в UI, исправление улетает обратно в словарь. Каждый прогон делает систему умнее.
  • Инкрементальный перевод — повторный прогон переводит только новые и изменившиеся строки (сравнение по хешу ключа). Уже переведённое не трогается.
  • Автоопределение языка источника — не нужно указывать, на каком языке исходные данные. superset-tools определяет язык сам (через lingua-language-detector, без LLM — быстро и дёшево).
  • Планировщик по cron — настроили джобу на еженочный прогон? Она будет запускаться автоматически. APScheduler под капотом.
  • Cache-механизм — повторный перевод уже переведённого контента не тратит токены — результаты берутся из кэша.
  • Аудит и метрики — каждый прогон логируется: сколько строк переведено, сколько пропущено, упало, сколько токенов потрачено, сколько результата взято из кэша. Всё в структурированных событиях.
  • Bulk-замена — нашли, что LLM перевёл термин неконсистентно? Bulk find-and-replace по всем записям прогона.

Техническая справка: модуль перевода — это ~120+ файлов backend на Python, собственная оркестрация (планировщик → executor → batch processor → LLM call), 4 уровня ретраев с адаптивным batch-sizer'ом, async HTTP-клиент для OpenAI API, поддержка Direct SQL (INSERT/UPSERT) и Superset SQL Lab, система промптов с Jaccard-семантикой для подбора словарных статей. Frontend — 5 страниц (джобы, прогоны, словари), 15+ Svelte-компонентов, real-time WebSocket-прогресс.

🔄 Миграция данных без страха

Перенос дашбордов и датасетов между dev, staging и production — рутинная операция, которая обычно отнимает часы и чревата ошибками. superset-tools делает её предсказуемой:

  • Dry-run режим — перед реальными изменениями вы получаете детальный отчёт: какие объекты будут затронуты, какие риски обнаружены, что изменится в целевой среде. Никаких сюрпризов.
  • Автоматический маппинг БД — базы данных, ресурсы и идентификаторы сопоставляются между окружениями автоматически. Никакого ручного поиска и замены.
  • Миграция legacy-данных — встроенная поддержка переноса из SQLite в PostgreSQL. Устаревшие хранилища не помеха.

🌿 Git-интеграция: дашборды как код

Хватит копировать дашборды через export/import. Включите их в свой Git-процесс:

  • Версионирование — каждый дашборд — это файл в репозитории. Полная история изменений, откат на любую версию, diff любой сложности.
  • LLM-управление ветками — создавайте ветки, коммитьте и сливайте изменения через natural language команды. «Создай ветку для эксперимента с отчётом по энергопотреблению и закоммить текущие дашборды».
  • Деплой из Git — push в целевую ветку автоматически применяет изменения на нужном окружении. CI/CD для дашбордов.
  • Интеллектуальные сообщения коммитов — LLM анализирует изменения и сам предлагает осмысленный заголовок коммита.

🤖 LLM-аналитика: ИИ присматривает за дашбордами

Не просто инструмент, а ваш ассистент по данным:

  • Автовалидация дашбордов — LLM проверяет корректность метрик, источников данных и визуализаций. Нашёл подозрительный SQL в фильтре? Сообщит до того, как дашборд попадёт к пользователям.
  • Генерация документации — для любого датасета создаётся человекочитаемое описание: какие поля, откуда данные, какие есть зависимости.
  • Assistant API — управляйте superset-tools голосом или текстом на естественном языке. «Перенеси дашборд производства на staging», «Покажи историю изменений по датасету качества продукции».
  • Умный коммитинг — LLM анализирует изменения и генерирует сообщение коммита, отражающее суть. Никаких «fix» и «update».

📊 Управление и мониторинг: полный контроль

Одна консоль, чтобы править всеми:

  • RBAC — гибкая ролевая модель: admin, analyst, viewer. Каждый видит и делает только то, что ему разрешено.
  • Фоновые задачи с WebSocket — запустили миграцию на час? Откройте Task Drawer и наблюдайте прогресс в реальном времени. Никаких логов, к которым нужно подключаться по SSH.
  • Unified Reports — единый формат отчётов для всех типов задач. Один эндпоинт — любые данные.
  • Аудит — каждое действие логируется. Кто, когда и что сделал — всегда можно выяснить.
  • Retention-политики — артефакты автоматически очищаются по расписанию. Диски не забиваются.

🔌 Плагинная архитектура: расширяйте без границ

superset-tools спроектирован как платформа. Хотите свою логику миграции? Свой источник данных? Свой триггер?

Каждый модуль — это изолированный плагин:

Плагин Назначение
TranslatePlugin LLM-перевод контента БД
MigrationPlugin Миграция дашбордов между окружениями
BackupPlugin Резервное копирование и восстановление
GitPlugin Полный цикл Git-операций
LLMAnalysisPlugin AI-валидация и генерация документации
MapperPlugin Маппинг колонок и ресурсов
DebugPlugin Диагностика и профилирование системы
SearchPlugin Полнотекстовый поиск по датасетам

Пишите свои плагины, подключайте через простой Python API. Никакой магии — только чёткий контракт.

🏗️ Архитектура

Технологический стек

Backend: Python 3.9+ (FastAPI, SQLAlchemy, APScheduler), PostgreSQL, GitPython, OpenAI API, Playwright

Frontend: SvelteKit (Svelte 5.x), Vite, Tailwind CSS, WebSocket

DevOps: Docker & Docker Compose, PostgreSQL 16

Модульная структура

superset-tools/
├── backend/                    # Backend API
│   ├── src/
│   │   ├── api/                # API маршруты
│   │   ├── core/               # Ядро системы
│   │   │   ├── task_manager/   # Управление задачами
│   │   │   ├── auth/           # Авторизация
│   │   │   ├── migration/      # Миграция данных
│   │   │   └── plugins/        # Плагины
│   │   ├── models/             # Модели данных
│   │   ├── services/           # Бизнес-логика
│   │   └── schemas/            # Pydantic схемы
│   └── tests/
├── frontend/                   # SvelteKit приложение
│   ├── src/
│   │   ├── routes/             # Страницы
│   │   ├── lib/
│   │   │   ├── components/     # UI компоненты
│   │   │   ├── stores/         # Svelte stores
│   │   │   └── api/            # API клиент
│   │   └── i18n/               # Мультиязычность
│   └── tests/
├── docker/                     # Docker конфигурация
├── docs/                       # Документация
└── specs/                      # Спецификации

🚀 Быстрый старт

Требования

  • Docker (рекомендуется): Docker Engine 24+, Docker Compose v2, 4 GB RAM
  • Локальная разработка: Python 3.9+, Node.js 18+, npm, 2 GB RAM, 5 GB диска

Docker (рекомендуется)

git clone <repository-url>
cd superset-tools
docker compose up --build

После запуска:

Локальная разработка

# Backend
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python3 -m uvicorn src.app:app --reload --port 8000

# Frontend (в новом терминале)
cd frontend
npm install
npm run dev -- --port 5173

Начальная настройка

# Переменные окружения
cp .env.example backend/.env

# Инициализация БД
cd backend && source .venv/bin/activate
python src/scripts/init_auth_db.py

# Создание администратора
python src/scripts/create_admin.py --username admin --password '<temporary-secret>'

Полный каталог переменных окружения — в .env.example.

Offline-бандл

# Загрузка образа
xz -dc dist/docker/superset-tools.20260517.tar.xz | docker load
export POSTGRES_PASSWORD="my-strong-password"
docker compose -f dist/docker/docker-compose.light.yml up -d

Сборка бандла: ./build.sh bundle:light v1.0.0 (light, ~104 MB) или ./build.sh bundle v1.0.0 (full).

📖 Документация

🧪 Тестирование

Запуск тестов

# Backend тесты
cd backend && source .venv/bin/activate && pytest

# Frontend тесты
cd frontend && npm run test

# Конкретный тест
pytest tests/test_auth.py::test_create_user

📊 Покрытие кода

Сводный отчёт о покрытии генерируется скриптом scripts/coverage-summary.sh:

# Полный запуск (backend integration + frontend)
./scripts/coverage-summary.sh

# Backend unit-тесты (SQLite) + frontend (быстрее, не требует Docker)
./scripts/coverage-summary.sh --unit

# Только frontend
./scripts/coverage-summary.sh --frontend-only

# Только backend unit
./scripts/coverage-summary.sh --backend-only --unit

# Указать директорию для отчёта
./scripts/coverage-summary.sh --output-dir ./reports/coverage

Скрипт выполняет:

  1. Запуск backend-тестов (pytest) с --cov=src — unit (--unit) или integration (--run-integration)
  2. Запуск frontend-тестов (vitest) с --coverage
  3. Парсинг результатов тестов и процентов покрытия
  4. Генерацию единого HTML-отчёта в coverage-summary/index.html со сводкой по обоим стекам

Текущие показатели:

Стек Тип тестов Процент Покрытие (Stmts)
Backend (unit) 1723 1721/2 48%
Backend (integration) 167 167/0 12%
Frontend 2443 2442/1 99.25%

HTML-отчёты coverage по каждому стеку открываются из сводного отчёта по ссылкам.

🏢 Enterprise Clean Deployment

Для разворота в корпоративной сети с очищенным дистрибутивом (без тестовых данных, с запретом внешних источников и обязательной compliance-проверкой) используется профиль enterprise clean.

Поддерживаются CLI, API и TUI flows. Подробная документация — в docs/enterprise-clean.md.

🔐 Авторизация

Система поддерживает два метода аутентификации:

  1. Локальная (username/password)
  2. ADFS SSO (Active Directory Federation Services)

Управление пользователями и ролями — через POST /api/admin/users и POST /api/admin/roles. Документация — docs/installation.md.

📊 Мониторинг

  • Dashboard Hub — управление дашбордами с Git-статусом
  • Dataset Hub — управление датасетами с прогрессом маппинга
  • Task Drawer — мониторинг выполнения фоновых задач
  • Unified Reports — унифицированные отчеты по всем типам задач

API: GET /api/reports?page=1&page_size=20 (фильтры по статусу, типу, дате).

💻 Примеры скриптов

Примеры интеграции с внешними системами (Airflow, CI/CD, cron) — в examples/:

Скрипты демонстрируют аутентификацию через API Key (X-API-Key), запуск и завершение maintenance-событий, обработку ошибок.

🤝 Вклад в проект

Мы приветствуем contributions! См. CONTRIBUTING.md.

📄 Лицензия

Проект распространяется под лицензией MIT.

Description
Superset Tools
Readme 178 MiB
Languages
Python 71.4%
TypeScript 13.6%
Svelte 11.8%
JavaScript 1.8%
Shell 1.3%