@@ -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" )
783800async 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 (),
0 commit comments