pytest -m p0).
search_knowledge)
— маршрут, grounding и цитаты воспроизводимы без реального
инференса в авто-прогоне
@pytest.mark.unit / @pytest.mark.integration —
по типу; @pytest.mark.p0 / p1 — по
приоритету, ортогонально типу
tokens_used = весь оборот реплики (вход + выход); только assistant; сырьё расхода чата по людям (Расходы AI)GET /conversations/{id} своей беседы → 200; тело несёт сообщения user+assistant в порядке следования, цитаты привязаны к своим assistant-сообщениям{id} → 404, не 500: отсутствие ресурса — штатный ответ, не сбой404, не 403: существование не раскрываем (anti-IDOR), согласовано с test_acl_passthrough; запрос без сессии → 401conversations серверно и возвращает её id; отдельного POST /conversations для пустого чата не требуется — контракт закреплён здесь
Разделение по типу: unit/ — чистая логика без СУБД и без
живой LLM (маршрутизация, RRF-слияние, сборка цитат, access-signal,
кэш-гейт, бюджет окна, выбор модели, feedback), идёт на каждом PR. integration/ — против фейковой модели и
застабленного Knowledge Store, отдельным, более редким шагом. Приоритет
(P0–P1) ортогонален каталогам и задаётся маркерами
(pytest -m p0).
tests/query_engine/каталог модуля
conftest.pyфейковая chat-модель (управляемое решение о поиске) · застабленный KS-клиент (фиксирует identity) · фейковый кэш кандидатов (ключ запрос+identity) · фабрики сессии и истории диалогаunit/чистая логика без СУБД и живой LLM
test_route · test_rerank_rrf · test_source_attribution · test_access_signal · test_cache_gateрешение о поиске (мульти-инструмент одним раундом), слияние RRF, сборка цитат, сигнал обращения, кэш-гейт по ключу запрос+identitytest_context_budget · test_model_selection · test_feedbackобщий бюджет окна (история+контекст+резерв под ответ), липкий выбор модели (намерение≠факт), оценка ответа (CHECK ±1, in-place, только assistant)integration/фейковая модель + застабленный KS
test_grounding · test_acl_passthroughP0 — несущее: grounding из контекста, передача identity в KStest_streaming · test_multi_turn · test_session_boundaryP1 — SSE-стриминг без очереди, перенос контекста между сообщениями, граница беседы по conversation_id