-
Notifications
You must be signed in to change notification settings - Fork 5
Open
Labels
P3Low priority / BacklogLow priority / Backlogphase:5-techdebtPhase 5: Technical DebtPhase 5: Technical DebtrefactoringArchitectural refactoringArchitectural refactoring
Description
Parent
Sub-issue of #641 (Phase 7: Service facade migration)
Зависит от
- Фаза 6: Protocol interfaces — типизация контрактов между модулями #496 (Phase 6 — LLMService Protocol определён)
- Phase 7.2: KnowledgeService facade — объединить wiki_rag_service + knowledge/service.py #643 (Phase 7.2 — KnowledgeService, т.к. LLM использует RAG-контекст)
Цель
Извлечь логику LLM-генерации из orchestrator.py в LLMService фасад, соответствующий Protocol из modules/llm/protocols.py.
Текущее состояние
Генерация размазана между:
orchestrator.py(_process_llm_request, ~200 строк) — сборка промпта, RAG-контекст, FAQ, history, вызов провайдера, token accountingcloud_llm_service.py—BaseLLMProviderABC + конкретные провайдеры (Gemini, OpenAI, Claude, DeepSeek),generate_response(),generate_response_stream()modules/llm/service.py—CloudProviderService(CRUD провайдеров в БД)
Ключевая логика в оркестраторе:
- Resolve backend (vllm / cloud:provider-id)
- Собрать system prompt (persona + custom)
- Получить RAG-контекст из wiki_rag_service
- Получить FAQ-ответ
- Собрать messages (system + history + user)
- Вызвать провайдер (generate / stream)
- Token accounting
Что сделать
- Создать
LLMServiceImplвmodules/llm/facade.py, реализующий Protocol generate()/stream()инкапсулируют всю цепочку (промпт, RAG, FAQ, вызов, accounting)resolve_backend()делегирует к CloudProviderServicelist_providers()делегирует к CloudProviderService- Зависимость от KnowledgeService (для RAG-контекста) — через конструктор
- Возвраты типизированы через TypedDict из
modules/llm/schemas.py - Зарегистрировать в ServiceContainer
- Мигрировать оркестратор: заменить inline-логику на вызов
llm_service.generate()/stream()
Нюансы
- Самый большой blast radius — оркестратор, chat endpoint, widget endpoint, telegram bot, whatsapp bot — все используют LLM-генерацию
BaseLLMProviderостаётся — это internal implementation, не Protocol boundary- Streaming —
generate_response_stream()возвращает sync Generator, нужен async wrapper - Config resolution — сейчас хардкожен порядок (action button → segment → bot default → global), нужно сохранить
- Dependency на KnowledgeService — для RAG. Если 7.2 ещё не сделан, можно временно зависеть от wiki_rag_service напрямую
Критерии готовности
-
LLMServiceImplреализует Protocol - Вся логика генерации извлечена из orchestrator.py
- Оркестратор вызывает
llm_service.generate()/stream()вместо inline-кода - Streaming работает корректно (SSE, widget, telegram)
- Тесты, CI зелёный
Риск: высокий
Затрагивает ядро системы. Требует тщательного тестирования всех каналов (admin chat, widget, telegram, whatsapp).
Оценка: L-XL (1-2 PR)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
P3Low priority / BacklogLow priority / Backlogphase:5-techdebtPhase 5: Technical DebtPhase 5: Technical DebtrefactoringArchitectural refactoringArchitectural refactoring