diff --git a/app/helpers/mlflow_service.py b/app/helpers/mlflow_service.py index ecc13eb..07ed8cd 100644 --- a/app/helpers/mlflow_service.py +++ b/app/helpers/mlflow_service.py @@ -1,4 +1,5 @@ from mlflow.tracking import MlflowClient +import json def get_mlflow_client(current_app): @@ -23,11 +24,27 @@ def get_experiment_json_object(experiment): "tags": experiment.tags } +def safe_serialize(obj): + """Recursively serializes objects, converting non-serializable types to strings.""" + if isinstance(obj, (int, float, str, bool, type(None))): + return obj # Basic + + if isinstance(obj, dict): + return {key: safe_serialize(value) for key, value in obj.items()} # For serialize dicts + + if isinstance(obj, list) or isinstance(obj, tuple): + return [safe_serialize(item) for item in obj] # For lists and tuples + + try: + return json.loads(json.dumps(obj)) + except (TypeError, OverflowError): + return str(obj) # Fallback: Convert to string representation if it can't be serialized def get_run_json_object(run, full=False): if full: - return run.to_dictionary() - return { + return safe_serialize(run.to_dictionary()) + + run_info = { "run_id": run.info.run_id, "status": run.info.status, "start_time": run.info.start_time, @@ -37,3 +54,5 @@ def get_run_json_object(run, full=False): "user_id": run.info.user_id, "experiment_id": run.info.experiment_id, } + + return safe_serialize(run_info)