mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-09-06 17:57:49 +02:00
feat(serde): diff type encodes prev_checkpoint_id; loads_typed returns DeltaValue
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
aa312d18e1
commit
5169786ded
@@ -263,7 +263,7 @@ class JsonPlusSerializer(SerializerProtocol):
|
||||
elif isinstance(obj, bytearray):
|
||||
return "bytearray", obj
|
||||
elif _is_diff_delta(obj):
|
||||
return "diff", _msgpack_enc({"d": obj.delta, "p": obj.prev_version})
|
||||
return "diff", _msgpack_enc({"d": obj.delta, "c": obj.prev_checkpoint_id})
|
||||
else:
|
||||
try:
|
||||
return "msgpack", _msgpack_enc(obj)
|
||||
@@ -287,9 +287,11 @@ class JsonPlusSerializer(SerializerProtocol):
|
||||
data_, ext_hook=self._unpack_ext_hook, option=ormsgpack.OPT_NON_STR_KEYS
|
||||
)
|
||||
elif type_ == "diff":
|
||||
return ormsgpack.unpackb(
|
||||
from langgraph.checkpoint.base import DeltaValue # lazy import
|
||||
raw = ormsgpack.unpackb(
|
||||
data_, ext_hook=self._unpack_ext_hook, option=ormsgpack.OPT_NON_STR_KEYS
|
||||
)
|
||||
return DeltaValue(delta=raw["d"], prev_checkpoint_id=raw.get("c"))
|
||||
elif self.pickle_fallback and type_ == "pickle":
|
||||
return pickle.loads(data_)
|
||||
else:
|
||||
|
||||
@@ -999,33 +999,27 @@ def test_msgpack_nested_pydantic_serializes_as_dict(
|
||||
assert result == obj
|
||||
|
||||
|
||||
def test_diff_delta_serde_round_trip() -> None:
|
||||
def test_delta_value_serde_round_trip() -> None:
|
||||
from langgraph.checkpoint.base import DeltaValue
|
||||
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
|
||||
|
||||
serde = JsonPlusSerializer()
|
||||
prev = "00000000000000000000000000000001.1234567890123456"
|
||||
delta = DeltaValue(
|
||||
delta=[HumanMessage(content="hello", id="msg-1")],
|
||||
prev_version=prev,
|
||||
)
|
||||
type_tag, blob = serde.dumps_typed(delta)
|
||||
original = DeltaValue(delta=[{"type": "human", "content": "hi"}], prev_checkpoint_id="abc-123")
|
||||
type_tag, blob = serde.dumps_typed(original)
|
||||
assert type_tag == "diff"
|
||||
|
||||
result = serde.loads_typed(("diff", blob))
|
||||
assert isinstance(result, dict)
|
||||
assert result["p"] == prev
|
||||
assert len(result["d"]) == 1
|
||||
assert result["d"][0].content == "hello"
|
||||
loaded = serde.loads_typed((type_tag, blob))
|
||||
assert isinstance(loaded, DeltaValue)
|
||||
assert loaded.delta == original.delta
|
||||
assert loaded.prev_checkpoint_id == "abc-123"
|
||||
|
||||
|
||||
def test_diff_delta_serde_root_blob() -> None:
|
||||
def test_delta_value_serde_chain_root() -> None:
|
||||
from langgraph.checkpoint.base import DeltaValue
|
||||
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
|
||||
|
||||
serde = JsonPlusSerializer()
|
||||
delta = DeltaValue(delta=[], prev_version=None)
|
||||
type_tag, blob = serde.dumps_typed(delta)
|
||||
assert type_tag == "diff"
|
||||
|
||||
result = serde.loads_typed(("diff", blob))
|
||||
assert result["p"] is None
|
||||
assert result["d"] == []
|
||||
original = DeltaValue(delta=[], prev_checkpoint_id=None)
|
||||
type_tag, blob = serde.dumps_typed(original)
|
||||
loaded = serde.loads_typed((type_tag, blob))
|
||||
assert isinstance(loaded, DeltaValue)
|
||||
assert loaded.prev_checkpoint_id is None
|
||||
|
||||
Reference in New Issue
Block a user