11 KiB
📋 ТЕХНИЧЕСКОЕ ЗАДАНИЕ: ИНТЕГРАЦИЯ MIXED-INITIATIVE LLM-АГЕНТА
Ветка: 027-dataset-llm-orchestration
Контекст: Архитектура автоматического ревью датасетов (US1) и подготовки к запуску (US3) реализована отлично. Требуется переработать процесс "Clarification" (US2) из жесткого модального опросника в полноценный контекстно-зависимый диалог с LLM-агентом (Смешанная инициатива / Mixed-Initiative), а также закрыть архитектурные риски (PII, Concurrency).
Тебе необходимо выполнить задачу в два этапа.
ЭТАП 1: Обновление спецификаций (Директория specs/027-dataset-llm-orchestration/)
Твоя первая задача — актуализировать проектную документацию, чтобы она отражала новую парадигму взаимодействия пользователя и агента, а также закрывала дыры в безопасности.
1. Обновить ux_reference.md:
- Отказ от модалок: Заменить концепцию
ClarificationDialogна интеграцию диалога в выдвижную правую панельAssistantChatPanel. - Mixed-Initiative: Описать, что диалог может быть инициирован как системой (очередь
Clarification Queue), так и пользователем (свободные вопросы агенту по контексту датасета, например: "Почему этот фильтр помечен как partial?"). - Inline-взаимодействие (Context Actions): Дописать появление микро-кнопок
[✨ Спросить ИИ]/[✨ Улучшить]рядом с неразрешенными фильтрами (unresolved), предупреждениями валидации и полем Бизнес-summary в основном Workspace. - Визуальный фокус: Зафиксировать правило: когда агент задает вопрос по конкретному фильтру/полю в чате, карточка этого элемента в центральной колонке UI подсвечивается (highlight/glow).
- Confirmation Cards: Описать интерактивные виджеты внутри ленты чата для опасных операций (например, подтверждение запуска датасета в SQL Lab), опирающиеся на
AssistantConfirmationRecord.
2. Обновить spec.md (Functional Requirements):
- Добавить FR-045: Система должна позволять пользователю задавать свободные вопросы по контексту загруженного датасета (профиль, фильтры, маппинги, SQL).
- Добавить FR-046: Агент должен уметь принимать команды на естественном языке для изменения состояния сессии (например: "Одобри все маппинги", "Сгенерируй превью SQL").
- Изменить FR-013: Уточняющие вопросы должны задаваться не в изолированном окне, а в контексте глобального чата ассистента.
3. Обновить contracts/api.yaml и data-model.md:
- Связь чата и сессии: В
AssistantMessageRequestдобавить опциональное полеdataset_review_session_id: string. - Оптимистичные блокировки: В сущность
DatasetReviewSession(и DTOSessionDetail) добавить полеversion: integerдля предотвращения состояния гонки (Race Condition) при совместном редактировании сессии коллабораторами (пользователь + агент). - PII Masking: В
data-model.mdдляImportedFilterявно указать требование маскирования чувствительных данных (raw_value) перед отправкой контекста в LLM.
4. Обновить contracts/modules.md:
- В
DatasetReviewOrchestratorдобавить связь@RELATION: [EXPOSES_STATE_TO] -> [AssistantApi]. - В описание
ClarificationEngineдобавить, что он маршрутизирует свои запросы черезAssistantChatPanel.
ЭТАП 2: Реализация доработок в кодовой базе (Frontend & Backend)
На основе обновленных спеков реализуй архитектурные и UI/UX изменения в коде.
🛠️ 2.1 Backend: Архитектура, Безопасность и Инструменты Агента
- PII Data Masking:
- Где:
backend/src/core/utils/superset_context_extractor.pyили слой подготовки промпта. - Что: Реализовать фильтрацию/маскирование значений фильтров (например, email, SSN), извлеченных из Superset, до того, как они попадут в контекст LLM. Агенту нужны только ключи и структура для маппинга, а не сырые PII-данные.
- Где:
- Optimistic Locking (Борьба с Race Conditions):
- Где:
backend/src/services/dataset_review/repositories/session_repository.py. - Что: Реализовать проверку поля
versionпри сохраненииDatasetReviewSession. В случае конфликта (кто-то другой, включая агента, уже изменил сессию) выбрасыватьStaleDataError-> HTTP 409 Conflict.
- Где:
- Интеграция контекста датасета в Ассистента:
- Где:
backend/src/api/routes/assistant.py(_plan_intent_with_llm,_build_tool_catalog). - Что: Если в запросе передан
dataset_review_session_id, подгружатьDatasetProfile,ImportedFiltersиValidationFindingsв системный промпт (System Prompt) ассистента, чтобы он мог отвечать на вопросы по датасету.
- Где:
- Новые Tools (Интенты) для Агента:
- Где:
backend/src/api/routes/assistant.py->_dispatch_intent. - Что: Научить агента вызывать методы
DatasetReviewOrchestrator. Добавить инструменты:APPROVE_MAPPINGS(одобрить ворнинги),SET_FIELD_SEMANTICS(переписать описание колонки),GENERATE_SQL_PREVIEW(триггер компиляции).
- Где:
- Garbage Collection сессий:
- Где:
backend/src/core/task_manager/cleanup.py(или аналог). - Что: Написать scheduled-таску для жесткого удаления (hard delete) брошенных/архивированных сессий обзора (например, старше 30 дней), чтобы БД не переполнялась снепшотами SQL и графами контекста.
- Где:
🎨 2.2 Frontend: Реактивный Workspace и Чат
- Интеграция AssistantChatPanel (Slide-out Drawer):
- Где:
frontend/src/routes/datasets/review/[id]/+page.svelte(DatasetReviewWorkspace). - Что: Внедрить вызов боковой панели ассистента
AssistantChatPanel. Убедиться, что при её открытии контент Workspace сдвигается или корректно перекрывается, не теряя контекста SQL-превью и фильтров. Удалить старыйClarificationDialog(модалку).
- Где:
- Контекстные кнопки (Inline Triggers ✨):
- Что: В компоненты
ValidationFindingsPanel.svelte,ExecutionMappingReview.svelteи карточки фильтров добавить микро-кнопки[✨ Спросить ИИ]. - Действие: По клику открывать
assistantChatstore и отправлять предзаполненный скрытый контекстный промпт (например, "Объясни проблему с фильтром X и предложи решение").
- Что: В компоненты
- Визуальная синхронизация (State Reactivity):
- Что: Когда агент через чат задает вопрос по
field_idилиfilter_id(Clarification Queue), соответствующий элемент в Workspace должен получать CSS-класс подсветки (glow/highlight). - Как: Связать
ClarificationStateResultиз стора сессии с рендером строк вSemanticLayerReview.svelteи списках фильтров.
- Что: Когда агент через чат задает вопрос по
- Confirmation Cards в ленте чата:
- Где:
frontend/src/lib/components/assistant/AssistantChatPanel.svelte. - Что: Для команд, требующих
AssistantConfirmationRecord(например, запуск в SQL Lab), рендерить внутри чата специальный виджет: "Вы уверены, что хотите запустить этот контекст? [Отменить][Запустить]".
- Где:
- Debounce для SQL Preview:
- Где:
frontend/src/lib/components/dataset-review/CompiledSQLPreview.svelte. - Что: Предотвратить спам запросами к Superset API. Если пользователь или агент быстро меняют маппинги, статус превью становится
stale. Запрос на перегенерацию должен отправляться либо по явной кнопке, либо с debounce-задержкой 2-3 секунды после окончания потока изменений.
- Где:
⚙️ Правила выполнения для Агента:
- Не ломать инварианты: Сохранить принцип WYSIWWR (What You See Is What Will Run). LLM никогда не должна генерировать финальный SQL-код сама. LLM собирает параметры, а SQL компилирует только Superset (
SupersetCompilationAdapter). - Семантическое логирование: Любые изменения состояния сессий на бэкенде оборачивать в
belief_scope(logger.reason(),logger.reflect()), как указано в системных контрактах. - По завершении этапа 1, дождись утверждения (или переходи к Этапу 2 автономно, если находишься в режиме Auto-Execute), строго следуя обновленным контрактам
api.yaml.