Parent
Часть плана модульной декомпозиции: #489
Цель
Разобрать orchestrator.py (4170 строк) до ~100-200 строк. Вынести legacy endpoints, модулизировать startup/shutdown, перевести background tasks на TaskRegistry.
Sub-issues
Граф зависимостей
#545 (аудит)
├──→ #546 (StreamingTTSManager)
│ └──→ #550 (admin endpoints) ──┐
├──→ #547 (widget endpoints) ─────────┤
├──→ #548 (/v1/* + core) ────────────┤
├──→ #549 (finetune) ────────────────┤
└──→ #551 (background tasks) ────────┤
│
└──→ #552 (startup + shutdown)
└──→ #553 (документация)
#545 блокирует все extraction-задачи. Батчи #546–#551 независимы друг от друга (кроме #550 ← #546). #552 ждёт завершения всех extraction + tasks. #553 — после финальной сборки.
Подробности подэтапов
4a. Вынести legacy endpoints (~2600 строк)
Разбито на 5 sub-issues (#546–#550):
StreamingTTSManager (~224 строк) → modules/speech/streaming.py
- Widget public endpoints (~516 строк) →
modules/channels/widget/router_public.py
/v1/* + core endpoints (~511 строк) → modules/compat/router.py
- Admin finetune (~377 строк) →
modules/llm/router_finetune.py + modules/speech/router_finetune.py
- Admin LLM/voice/monitoring/models/auth (~1400 строк) → domain routers
4b+4d+4e. Модульный startup + shutdown + deployment modes (#552)
Заменить 394-строчный startup_event() на per-module init(). Graceful shutdown: tasks → bots → bridge → DB. Deployment modes через загрузку/не-загрузку модулей.
4c. Background tasks → TaskRegistry (#551)
6 задач из asyncio.create_task() → TaskRegistry.register():
| Задача |
Интервал |
Домен |
_cleanup_expired_sessions() |
1 час |
core |
_periodic_vacuum() |
7 дней |
core |
_periodic_kanban_sync() |
15 мин |
kanban |
_periodic_woocommerce_sync() |
ежедневно 23:00 UTC |
ecommerce |
_build_wiki_embeddings() |
one-shot |
knowledge |
_load_collection_indexes() |
one-shot |
knowledge |
Целевой orchestrator.py
~100-200 строк:
- Создание FastAPI app
- Middleware (CORS, rate limiter, security headers)
- Загрузка модулей по deployment mode
- Startup/shutdown lifecycle
- Точка входа uvicorn
Критерии готовности
Риск: высокий
Это самая сложная фаза. Затрагивает точку входа приложения, инициализацию всех сервисов и lifecycle. Каждый подэтап — отдельный PR с тщательным тестированием.
Зависимости
- Фазы 0-3 ✅ (все модули на месте)
Оценка: XL (9 sub-issues, 9 PR)
Parent
Часть плана модульной декомпозиции: #489
Цель
Разобрать
orchestrator.py(4170 строк) до ~100-200 строк. Вынести legacy endpoints, модулизировать startup/shutdown, перевести background tasks на TaskRegistry.Sub-issues
Граф зависимостей
#545 блокирует все extraction-задачи. Батчи #546–#551 независимы друг от друга (кроме #550 ← #546). #552 ждёт завершения всех extraction + tasks. #553 — после финальной сборки.
Подробности подэтапов
4a. Вынести legacy endpoints (~2600 строк)
Разбито на 5 sub-issues (#546–#550):
StreamingTTSManager(~224 строк) →modules/speech/streaming.pymodules/channels/widget/router_public.py/v1/*+ core endpoints (~511 строк) →modules/compat/router.pymodules/llm/router_finetune.py+modules/speech/router_finetune.py4b+4d+4e. Модульный startup + shutdown + deployment modes (#552)
Заменить 394-строчный
startup_event()на per-moduleinit(). Graceful shutdown: tasks → bots → bridge → DB. Deployment modes через загрузку/не-загрузку модулей.4c. Background tasks → TaskRegistry (#551)
6 задач из
asyncio.create_task()→TaskRegistry.register():_cleanup_expired_sessions()_periodic_vacuum()_periodic_kanban_sync()_periodic_woocommerce_sync()_build_wiki_embeddings()_load_collection_indexes()Целевой orchestrator.py
~100-200 строк:
Критерии готовности
orchestrator.py≤ 200 строк/v1/*endpoints вынесены в отдельный роутерinit()Риск: высокий
Это самая сложная фаза. Затрагивает точку входа приложения, инициализацию всех сервисов и lifecycle. Каждый подэтап — отдельный PR с тщательным тестированием.
Зависимости
Оценка: XL (9 sub-issues, 9 PR)