From a75434dff22411d0a9ef8cde2c6363726620189a Mon Sep 17 00:00:00 2001 From: AMATH <116212274+amathxbt@users.noreply.github.com> Date: Fri, 3 Apr 2026 22:34:47 +0100 Subject: [PATCH] fix: guard json.loads() in JSON tensor parsing to prevent crash on malformed/missing values Two unguarded json.loads() calls in _conversions.py would raise JSONDecodeError or TypeError when a JSON tensor's value field is None or not valid JSON. Also added a None-name guard to avoid silently inserting None keys into the output dict. Affected functions: - convert_to_model_output (event-based output path) - convert_array_to_model_output (array-based output path) --- src/opengradient/client/_conversions.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/opengradient/client/_conversions.py b/src/opengradient/client/_conversions.py index 495f663b..e45ed392 100644 --- a/src/opengradient/client/_conversions.py +++ b/src/opengradient/client/_conversions.py @@ -156,7 +156,15 @@ def convert_to_model_output(event_data: AttributeDict) -> Dict[str, np.ndarray]: if isinstance(tensor, (AttributeDict, dict)): name = tensor.get("name") value = tensor.get("value") - output_dict[name] = np.array(json.loads(value)) + if name is None: + logging.warning("JSON tensor is missing 'name' field; skipping.") + continue + try: + output_dict[name] = np.array(json.loads(value)) + except (json.JSONDecodeError, TypeError) as e: + logging.warning( + f"Failed to parse JSON tensor '{name}' — value={value!r}: {e}. Skipping." + ) else: logging.warning(f"Unexpected tensor type: {type(tensor)}") @@ -203,7 +211,15 @@ def convert_array_to_model_output(array_data: List) -> ModelOutput: for tensor in array_data[2]: name = tensor[0] value = tensor[1] - json_data[name] = np.array(json.loads(value)) + if name is None: + logging.warning("JSON tensor entry is missing a name; skipping.") + continue + try: + json_data[name] = np.array(json.loads(value)) + except (json.JSONDecodeError, TypeError) as e: + logging.warning( + f"Failed to parse JSON tensor '{name}' — value={value!r}: {e}. Skipping." + ) return ModelOutput( numbers=number_data,