diff --git a/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py b/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py index 501fdc9e4..e777a8176 100644 --- a/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py +++ b/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py @@ -51,9 +51,13 @@ class JsonPlusSerializer(SerializerProtocol): if isinstance(obj, Serializable): return obj.to_json() elif hasattr(obj, "model_dump") and callable(obj.model_dump): - return self._encode_constructor_args(obj.__class__, kwargs=obj.model_dump()) + return self._encode_constructor_args( + obj.__class__, method=[None, "model_construct"], kwargs=obj.model_dump() + ) elif hasattr(obj, "dict") and callable(obj.dict): - return self._encode_constructor_args(obj.__class__, kwargs=obj.dict()) + return self._encode_constructor_args( + obj.__class__, method=[None, "construct"], kwargs=obj.dict() + ) elif isinstance(obj, pathlib.Path): return self._encode_constructor_args(pathlib.Path, args=obj.parts) elif isinstance(obj, re.Pattern): @@ -132,20 +136,29 @@ class JsonPlusSerializer(SerializerProtocol): # Import class cls = getattr(mod, name) # Instantiate class - if value["method"] is not None: - method = getattr(cls, value["method"]) + if isinstance(value["method"], str): + methods = [getattr(cls, value["method"])] + elif isinstance(value["method"], list): + methods = [ + cls if method is None else getattr(cls, method) + for method in value["method"] + ] else: - method = cls - if isclass(method) and issubclass(method, BaseException): - return None - if value["args"] and value["kwargs"]: - return method(*value["args"], **value["kwargs"]) - elif value["args"]: - return method(*value["args"]) - elif value["kwargs"]: - return method(**value["kwargs"]) - else: - return method() + methods = [cls] + for method in methods: + try: + if isclass(method) and issubclass(method, BaseException): + return None + if value["args"] and value["kwargs"]: + return method(*value["args"], **value["kwargs"]) + elif value["args"]: + return method(*value["args"]) + elif value["kwargs"]: + return method(**value["kwargs"]) + else: + return method() + except Exception: + continue except Exception: return None