Source code for veupath_chatbot.transport.http.routers.experiments.evaluation

"""Evaluation endpoints: re-evaluate, threshold-sweep, export."""

from fastapi import APIRouter
from fastapi.responses import StreamingResponse

from veupath_chatbot.platform.types import JSONObject
from veupath_chatbot.services.experiment.evaluation import (
    compute_sweep_values,
    generate_sweep_events,
    re_evaluate,
    validate_sweep_parameter,
)
from veupath_chatbot.transport.http.deps import CurrentUser, ExperimentDep
from veupath_chatbot.transport.http.schemas.experiments import ThresholdSweepRequest

router = APIRouter()


[docs] @router.post("/{experiment_id}/re-evaluate") async def re_evaluate_experiment( exp: ExperimentDep, user_id: CurrentUser ) -> JSONObject: """Re-run control evaluation against the (possibly modified) strategy.""" return await re_evaluate(exp)
[docs] @router.post("/{experiment_id}/threshold-sweep") async def threshold_sweep( exp: ExperimentDep, request: ThresholdSweepRequest, user_id: CurrentUser, ) -> StreamingResponse: """Sweep a parameter across a range and stream metrics as they complete.""" validate_sweep_parameter(exp, request.parameter_name) sweep_values = compute_sweep_values( sweep_type=request.sweep_type, values=request.values, min_value=request.min_value, max_value=request.max_value, steps=request.steps, ) return StreamingResponse( generate_sweep_events( exp=exp, param_name=request.parameter_name, sweep_type=request.sweep_type, sweep_values=sweep_values, ), media_type="text/event-stream", headers={ "Cache-Control": "no-cache, no-transform", "Connection": "keep-alive", "X-Accel-Buffering": "no", }, )
[docs] @router.get("/{experiment_id}/export") async def get_experiment_report( exp: ExperimentDep, user_id: CurrentUser ) -> StreamingResponse: """Generate and return a self-contained HTML report for an experiment.""" from veupath_chatbot.services.experiment.report import generate_experiment_report html_content = generate_experiment_report(exp) return StreamingResponse( iter([html_content]), media_type="text/html", headers={ "Content-Disposition": f'attachment; filename="experiment-{exp.id}-report.html"', }, )