find_agent_v2.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import annotations
  2. from fastapi import APIRouter, BackgroundTasks, HTTPException, Query, Request, status
  3. from api.schemas.find_agent_v2 import CreateFindAgentV2TestBody
  4. from api.services.find_agent_v2 import (
  5. execute_test_run, get_run_candidates, get_run_detail, get_search_candidates,
  6. list_runs, prepare_test_run,
  7. )
  8. router = APIRouter(prefix="/api/find-agent-v2", tags=["find-agent-v2"])
  9. @router.get("/runs")
  10. def runs(
  11. status_filter: str | None = Query(default=None, alias="status"),
  12. keyword: str | None = Query(default=None, max_length=256),
  13. page: int = Query(default=1, ge=1),
  14. page_size: int = Query(default=30, ge=1, le=100),
  15. ) -> dict:
  16. return list_runs(
  17. status=status_filter, keyword=keyword, page=page, page_size=page_size,
  18. )
  19. @router.get("/runs/{run_id}")
  20. def run_detail(run_id: str) -> dict:
  21. result = get_run_detail(run_id)
  22. if result is None:
  23. raise HTTPException(status_code=404, detail="find_agent_v2 run not found")
  24. return result
  25. @router.get("/runs/{run_id}/candidates")
  26. def run_candidates(run_id: str) -> dict:
  27. items = get_run_candidates(run_id)
  28. if items is None:
  29. raise HTTPException(status_code=404, detail="find_agent_v2 run not found")
  30. return {"items": items, "count": len(items)}
  31. @router.get("/runs/{run_id}/searches/{search_id}/candidates")
  32. def search_candidates(run_id: str, search_id: int) -> dict:
  33. items = get_search_candidates(run_id, search_id)
  34. if items is None:
  35. raise HTTPException(status_code=404, detail="find_agent_v2 search not found")
  36. return {"items": items, "count": len(items)}
  37. @router.post("/tests", status_code=status.HTTP_202_ACCEPTED)
  38. def create_test(
  39. body: CreateFindAgentV2TestBody,
  40. request: Request,
  41. background_tasks: BackgroundTasks,
  42. ) -> dict:
  43. try:
  44. prepared = prepare_test_run(body.demand_word, request.state.current_user)
  45. except LookupError as exc:
  46. raise HTTPException(status_code=404, detail=str(exc)) from exc
  47. except ValueError as exc:
  48. raise HTTPException(status_code=422, detail=str(exc)) from exc
  49. background_tasks.add_task(execute_test_run, prepared["run_id"])
  50. return {"accepted": True, **prepared}