@@ -58,6 +58,7 @@ def on_unload(self) -> None: # pragma: no cover # noqa: B027
5858from forgesyte_yolo_tracker .tracking import ByteTrackFactory , get_tracker_ids
5959from forgesyte_yolo_tracker .inference .radar import radar_json_with_annotated_frame
6060from forgesyte_yolo_tracker .configs import load_model_config
61+ from forgesyte_yolo_tracker .utils .json_sanitize import sanitize_json
6162
6263logger = logging .getLogger (__name__ )
6364
@@ -121,10 +122,10 @@ def _tool_player_detection(
121122 if error :
122123 return error
123124 if annotated and frame is not None :
124- return detect_players_json_with_annotated_frame (frame , device = device )
125+ return { "success" : True , "result" : detect_players_json_with_annotated_frame (frame , device = device )}
125126 if frame is not None :
126- return detect_players_json (frame , device = device )
127- return {"error" : "image_decode_failed" }
127+ return { "success" : True , "result" : detect_players_json (frame , device = device )}
128+ return {"success" : False , " error" : "image_decode_failed" }
128129
129130
130131
@@ -136,10 +137,10 @@ def _tool_player_tracking(
136137 if error :
137138 return error
138139 if annotated and frame is not None :
139- return track_players_json_with_annotated_frame (frame , device = device )
140+ return { "success" : True , "result" : track_players_json_with_annotated_frame (frame , device = device )}
140141 if frame is not None :
141- return track_players_json (frame , device = device )
142- return {"error" : "image_decode_failed" }
142+ return { "success" : True , "result" : track_players_json (frame , device = device )}
143+ return {"success" : False , " error" : "image_decode_failed" }
143144
144145
145146def _tool_video_player_tracking (
@@ -220,10 +221,10 @@ def _tool_ball_detection(
220221 if error :
221222 return error
222223 if annotated and frame is not None :
223- return detect_ball_json_with_annotated_frame (frame , device = device )
224+ return { "success" : True , "result" : detect_ball_json_with_annotated_frame (frame , device = device )}
224225 if frame is not None :
225- return detect_ball_json (frame , device = device )
226- return {"error" : "image_decode_failed" }
226+ return { "success" : True , "result" : detect_ball_json (frame , device = device )}
227+ return {"success" : False , " error" : "image_decode_failed" }
227228
228229
229230def _tool_pitch_detection (
@@ -233,10 +234,10 @@ def _tool_pitch_detection(
233234 if error :
234235 return error
235236 if annotated and frame is not None :
236- return detect_pitch_json_with_annotated_frame (frame , device = device )
237+ return { "success" : True , "result" : detect_pitch_json_with_annotated_frame (frame , device = device )}
237238 if frame is not None :
238- return detect_pitch_json (frame , device = device )
239- return {"error" : "image_decode_failed" }
239+ return { "success" : True , "result" : detect_pitch_json (frame , device = device )}
240+ return {"success" : False , " error" : "image_decode_failed" }
240241
241242
242243def _tool_radar (
@@ -246,10 +247,10 @@ def _tool_radar(
246247 if error :
247248 return error
248249 if annotated and frame is not None :
249- return radar_json_with_annotated_frame (frame , device = device )
250+ return { "success" : True , "result" : radar_json_with_annotated_frame (frame , device = device )}
250251 if frame is not None :
251- return radar_json (frame , device = device )
252- return {"error" : "image_decode_failed" }
252+ return { "success" : True , "result" : radar_json (frame , device = device )}
253+ return {"success" : False , " error" : "image_decode_failed" }
253254
254255
255256# ---------------------------------------------------------
@@ -304,9 +305,13 @@ def _run_video_tool(
304305
305306 logger .info (f"Completed: { frame_index } frames" )
306307
308+ # v0.10.0: Sanitize output for JSON serialization
307309 return {
308- "total_frames" : frame_index ,
309- "frames" : frame_results ,
310+ "success" : True ,
311+ "result" : sanitize_json ({
312+ "total_frames" : frame_index ,
313+ "frames" : frame_results ,
314+ })
310315 }
311316
312317
@@ -475,10 +480,11 @@ def _tool_video_player_tracking(
475480
476481 frame_index += 1
477482
478- return {
483+ # v0.10.0: Sanitize output for JSON serialization
484+ return sanitize_json ({
479485 "total_frames" : frame_index ,
480486 "frames" : frame_results ,
481- }
487+ })
482488
483489
484490class Plugin (BasePlugin ): # type: ignore[misc]
0 commit comments