feat(sprint8a): регрессия роутера в UI с выбором кейсов и кэшем
Оператор-настройщик после правки промпта _router нажимает «Прогнать выбранное»
на странице «Регрессия» и видит, что сломалось. Не CLI, не в обход
интерфейса — встроено в верхнюю навигацию рядом с Настройками.
Backend:
- Таблицы eval_runs / eval_run_cases (с is_pass) / eval_router_predictions
(кэш text_hash + router_config_id → predicted_intent). Миграции
k7e9d5c67h34 и l8f0e6d78i45.
- services/eval_run_service.py: start_router_run(text_hashes) запускает
фоновую корутину через asyncio.create_task, фиксирует активную версию
_router. Кэш привязан к версии: повторный прогон на той же версии —
мгновенный, на новой — пересчитывается. compute_diff_vs_previous
сравнивает с предыдущим прогоном на той же версии (новые fail / pass).
- API: POST /eval/runs (фон, body text_hashes), GET /eval/runs,
GET /eval/runs/{id}, GET /eval/router-cases-with-status (все 1573 кейса
+ кэш на активной версии).
Frontend (static/regression.html — новая страница, ссылка добавлена в
шапки index/sandbox/settings/docs):
- Сворачиваемый блок «Выбор кейсов»: фильтр по intent, ввод диапазона
(1-50, 200-300), кнопки «Все видимые», «Снять все», «Только без кэша»,
«Только FAIL в кэше», «Снять кэшированные». Чекбокс в шапке.
- Таблица 1573 кейсов отсортирована по count desc: #, чекбокс, запрос,
intent, частота, кэш (PASS / FAIL → predicted / —). Цветной фон строки
по статусу кэша.
- Счётчик «выбрано N (новых: X, в кэше: Y)»; кнопка
«Прогнать выбранное (X новых + Y из кэша)» — сразу видно реальный
объём LLM-работы.
- Polling /eval/runs/{id} раз в 2 секунды, прогресс-бар, drill-down:
все кейсы прогона + фильтр pass/fail + поиск + diff vs предыдущий
(новые fail / новые pass).
docs/SPRINTS.md: Спринт 8 разбит на 8a (✅ закрыт), 8b (регрессия ответов
веток, ждёт базу кейсов от пользователя), 8c (handoff/resumable/loop/
guard/rag — позже).
docs/BACKLOG.md: новый файл для идей на потом. Записаны: просмотр
архивного графа без активации (из 7.7), варианты C (LLM-judge) и D
(эталон + embeddings) для регрессии веток в 8b.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -262,3 +262,46 @@ class IntentStepGraphListResponse(BaseModel):
|
||||
graphs: list[IntentStepGraphInfo]
|
||||
active_graph_id: int | None
|
||||
total: int
|
||||
|
||||
|
||||
# ---------- Прогоны регрессии (Спринт 8a) ----------
|
||||
|
||||
class EvalRunInfo(BaseModel):
|
||||
id: int
|
||||
suite: str
|
||||
router_config_id: int | None
|
||||
router_config_version: int | None
|
||||
min_count: int
|
||||
status: str
|
||||
total: int
|
||||
passed: int
|
||||
failed: int
|
||||
cache_hits: int
|
||||
error_text: str | None
|
||||
started_at: str
|
||||
finished_at: str | None
|
||||
|
||||
|
||||
class EvalRunCaseInfo(BaseModel):
|
||||
text: str
|
||||
expected_intent: str
|
||||
predicted_intent: str
|
||||
count_weight: int
|
||||
is_pass: bool = True
|
||||
|
||||
|
||||
class EvalRunDiffInfo(BaseModel):
|
||||
prev_run_id: int | None
|
||||
new_fails: list[EvalRunCaseInfo]
|
||||
new_passes: list[EvalRunCaseInfo]
|
||||
|
||||
|
||||
class EvalRunDetailResponse(BaseModel):
|
||||
run: EvalRunInfo
|
||||
cases: list[EvalRunCaseInfo]
|
||||
diff: EvalRunDiffInfo
|
||||
|
||||
|
||||
class EvalRunListResponse(BaseModel):
|
||||
runs: list[EvalRunInfo]
|
||||
total: int
|
||||
|
||||
Reference in New Issue
Block a user