refactor(search): /ask 핸들러 오케스트레이션을 _run_ask 로 분리 (라우터=deps 해소만)

api 리뷰: ask() 529줄에 검색→evidence/classifier→refusal→synthesis→grounding/verifier→7-tier 재게이트→telemetry 가 인라인. body 를 _run_ask(plain params)로 분리, ask 는 FastAPI deps 해소 후 return await _run_ask(...). body verbatim(동작 무변경), 12 params 전부 전달, 다중 return/background_tasks 보존. py_compile + pyflakes undefined-name 0 으로 충실이동 검증.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
hyungi
2026-06-27 07:25:58 +09:00
parent 2fedaa065b
commit 842ad14930
+33
View File
@@ -647,6 +647,39 @@ async def ask(
- 일반 client 의 X-Source=eval 시도는 무시되고 source='document_server' 로 강제. - 일반 client 의 X-Source=eval 시도는 무시되고 source='document_server' 로 강제.
- source != 'eval' 이면 eval_case_id 항상 None. - source != 'eval' 이면 eval_case_id 항상 None.
""" """
# 오케스트레이션은 _run_ask 로 분리(라우터=입력+deps 해소만). 동작 무변경 (refactor: ask-orchestrator).
return await _run_ask(
q=q,
user=user,
session=session,
background_tasks=background_tasks,
limit=limit,
debug=debug,
backend=backend,
corpus_variant=corpus_variant,
exact_knn=exact_knn,
x_source=x_source,
x_eval_case_id=x_eval_case_id,
x_eval_token=x_eval_token,
)
async def _run_ask(
q: str,
user: User,
session: AsyncSession,
background_tasks: BackgroundTasks,
limit: int,
debug: bool,
backend: str | None,
corpus_variant: str | None,
exact_knn: bool,
x_source: str | None,
x_eval_case_id: str | None,
x_eval_token: str | None,
) -> "AskResponse | JSONResponse":
"""/ask 오케스트레이션 — 검색→evidence/classifier→refusal→synthesis→grounding/verifier→
7-tier 재게이트→telemetry. ask() 가 FastAPI deps 해소 후 호출. 동작은 기존 핸들러와 동일."""
t_total = time.perf_counter() t_total = time.perf_counter()
defense_log: dict = {} # per-layer flag snapshot defense_log: dict = {} # per-layer flag snapshot
source, eval_case_id = _resolve_eval_identity(x_source, x_eval_case_id, x_eval_token) source, eval_case_id = _resolve_eval_identity(x_source, x_eval_case_id, x_eval_token)