From ded1dbba2f68bf554e03c88f3f01e6e2d958e873 Mon Sep 17 00:00:00 2001 From: Sydney Runkle Date: Fri, 17 Apr 2026 14:24:41 -0400 Subject: [PATCH] fix(checkpoint/serde): use lazy isinstance check for DiffDelta Replace duck-typing check with lazy import inside _is_diff_delta helper function to avoid module-level circular dependency while using proper isinstance semantics. Co-Authored-By: Claude Sonnet 4.6 --- .../checkpoint/langgraph/checkpoint/serde/jsonplus.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py b/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py index f6a234583..e0b0e642d 100644 --- a/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py +++ b/libs/checkpoint/langgraph/checkpoint/serde/jsonplus.py @@ -64,6 +64,11 @@ def _warn_once( logger.warning(msg, *args) +def _is_diff_delta(obj: Any) -> bool: + from langgraph.checkpoint.base import DiffDelta # lazy import avoids circular dep + return isinstance(obj, DiffDelta) + + class JsonPlusSerializer(SerializerProtocol): """Serializer that uses ormsgpack, with optional fallbacks. @@ -256,11 +261,7 @@ class JsonPlusSerializer(SerializerProtocol): return "bytes", obj elif isinstance(obj, bytearray): return "bytearray", obj - elif ( - type(obj).__name__ == "DiffDelta" - and hasattr(obj, "delta") - and hasattr(obj, "prev_version") - ): + elif _is_diff_delta(obj): return "diff", _msgpack_enc({"d": obj.delta, "p": obj.prev_version}) else: try: