Skip to content

Commit d020d3b

Browse files
address suggestions from review
1 parent 93e3e52 commit d020d3b

2 files changed

Lines changed: 34 additions & 33 deletions

File tree

src/agentevals/api/routes.py

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -742,16 +742,11 @@ async def run_with_progress():
742742
)
743743

744744

745-
@router.post("/evaluate/json", response_model=StandardResponse[RunResult])
746-
async def evaluate_traces_json(request: EvaluateJsonRequest, raw_request: Request):
747-
"""Evaluate OTLP JSON traces passed in the request body."""
748-
content_length = int(raw_request.headers.get("content-length", 0))
749-
if content_length > _MAX_JSON_BODY_BYTES:
750-
raise HTTPException(
751-
status_code=413,
752-
detail=f"Request body exceeds {_MAX_JSON_BODY_BYTES // (1024 * 1024)}MB limit",
753-
)
745+
def _parse_json_request(request: EvaluateJsonRequest):
746+
"""Parse traces and eval set from an EvaluateJsonRequest.
754747
748+
Returns (traces, eval_set). Raises HTTPException on invalid input.
749+
"""
755750
try:
756751
traces = OtlpJsonLoader().load_from_dict(request.traces)
757752
except ValueError as exc:
@@ -767,6 +762,28 @@ async def evaluate_traces_json(request: EvaluateJsonRequest, raw_request: Reques
767762
except Exception as exc:
768763
raise HTTPException(status_code=400, detail=f"Invalid eval set: {exc}") from exc
769764

765+
return traces, eval_set
766+
767+
768+
def _check_json_body_size(raw_request: Request):
769+
content_length = int(raw_request.headers.get("content-length", 0))
770+
if content_length > _MAX_JSON_BODY_BYTES:
771+
raise HTTPException(
772+
status_code=413,
773+
detail=f"Request body exceeds {_MAX_JSON_BODY_BYTES // (1024 * 1024)}MB limit",
774+
)
775+
776+
777+
def _sse_error(message: str) -> str:
778+
return f"data: {SSEErrorEvent(error=message).model_dump_json(by_alias=True)}\n\n"
779+
780+
781+
@router.post("/evaluate/json", response_model=StandardResponse[RunResult])
782+
async def evaluate_traces_json(request: EvaluateJsonRequest, raw_request: Request):
783+
"""Evaluate OTLP JSON traces passed in the request body."""
784+
_check_json_body_size(raw_request)
785+
traces, eval_set = _parse_json_request(request)
786+
770787
try:
771788
result = await run_evaluation_from_traces(
772789
traces=traces,
@@ -782,33 +799,16 @@ async def evaluate_traces_json(request: EvaluateJsonRequest, raw_request: Reques
782799
@router.post("/evaluate/json/stream")
783800
async def evaluate_traces_json_stream(request: EvaluateJsonRequest, raw_request: Request):
784801
"""Evaluate OTLP JSON traces with real-time progress via SSE."""
785-
content_length = int(raw_request.headers.get("content-length", 0))
786-
if content_length > _MAX_JSON_BODY_BYTES:
787-
raise HTTPException(
788-
status_code=413,
789-
detail=f"Request body exceeds {_MAX_JSON_BODY_BYTES // (1024 * 1024)}MB limit",
790-
)
802+
_check_json_body_size(raw_request)
791803

792804
async def event_generator():
793805
try:
794806
try:
795-
traces = OtlpJsonLoader().load_from_dict(request.traces)
796-
except ValueError as exc:
797-
yield f"data: {SSEErrorEvent(error=str(exc)).model_dump_json(by_alias=True)}\n\n"
807+
traces, eval_set = _parse_json_request(request)
808+
except HTTPException as exc:
809+
yield _sse_error(exc.detail)
798810
return
799811

800-
if not traces:
801-
yield f"data: {SSEErrorEvent(error='No traces found in OTLP JSON').model_dump_json(by_alias=True)}\n\n"
802-
return
803-
804-
eval_set = None
805-
if request.eval_set:
806-
try:
807-
eval_set = load_eval_set_from_dict(request.eval_set)
808-
except Exception as exc:
809-
yield f"data: {SSEErrorEvent(error=f'Invalid eval set: {exc}').model_dump_json(by_alias=True)}\n\n"
810-
return
811-
812812
for trace in traces:
813813
try:
814814
extractor = get_extractor(trace)
@@ -875,8 +875,7 @@ async def run_with_progress():
875875

876876
except Exception as exc:
877877
logger.exception("JSON evaluation stream failed")
878-
evt = SSEErrorEvent(error=str(exc))
879-
yield f"data: {evt.model_dump_json(by_alias=True)}\n\n"
878+
yield _sse_error(str(exc))
880879

881880
return StreamingResponse(
882881
event_generator(),

src/agentevals/config.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ class EvalParams(BaseModel):
126126

127127
threshold: float | None = Field(
128128
default=None,
129-
description="Score threshold for pass/fail.",
129+
ge=0,
130+
le=1,
131+
description="Score threshold for pass/fail (0.0 to 1.0).",
130132
)
131133

132134
trajectory_match_type: str | None = Field(

0 commit comments

Comments
 (0)