from __future__ import annotations from fastapi import APIRouter, BackgroundTasks, HTTPException, Query, Request, status from api.schemas.find_agent_v2 import CreateFindAgentV2TestBody from api.services.find_agent_v2 import ( execute_test_run, get_run_candidates, get_run_detail, get_search_candidates, list_runs, prepare_test_run, ) router = APIRouter(prefix="/api/find-agent-v2", tags=["find-agent-v2"]) @router.get("/runs") def runs( status_filter: str | None = Query(default=None, alias="status"), keyword: str | None = Query(default=None, max_length=256), page: int = Query(default=1, ge=1), page_size: int = Query(default=30, ge=1, le=100), ) -> dict: return list_runs( status=status_filter, keyword=keyword, page=page, page_size=page_size, ) @router.get("/runs/{run_id}") def run_detail(run_id: str) -> dict: result = get_run_detail(run_id) if result is None: raise HTTPException(status_code=404, detail="find_agent_v2 run not found") return result @router.get("/runs/{run_id}/candidates") def run_candidates(run_id: str) -> dict: items = get_run_candidates(run_id) if items is None: raise HTTPException(status_code=404, detail="find_agent_v2 run not found") return {"items": items, "count": len(items)} @router.get("/runs/{run_id}/searches/{search_id}/candidates") def search_candidates(run_id: str, search_id: int) -> dict: items = get_search_candidates(run_id, search_id) if items is None: raise HTTPException(status_code=404, detail="find_agent_v2 search not found") return {"items": items, "count": len(items)} @router.post("/tests", status_code=status.HTTP_202_ACCEPTED) def create_test( body: CreateFindAgentV2TestBody, request: Request, background_tasks: BackgroundTasks, ) -> dict: try: prepared = prepare_test_run(body.demand_word, request.state.current_user) except LookupError as exc: raise HTTPException(status_code=404, detail=str(exc)) from exc except ValueError as exc: raise HTTPException(status_code=422, detail=str(exc)) from exc background_tasks.add_task(execute_test_run, prepared["run_id"]) return {"accepted": True, **prepared}