diff --git a/libs/checkpoint/langgraph/checkpoint/memory/__init__.py b/libs/checkpoint/langgraph/checkpoint/memory/__init__.py index 82361b539..ff6f7b1ca 100644 --- a/libs/checkpoint/langgraph/checkpoint/memory/__init__.py +++ b/libs/checkpoint/langgraph/checkpoint/memory/__init__.py @@ -170,8 +170,8 @@ class InMemorySaver( return {} thread_id = config["configurable"]["thread_id"] checkpoint_ns = config["configurable"].get("checkpoint_ns", "") - checkpoint_id = config["configurable"].get("checkpoint_id", "") ns_storage = self.storage.get(thread_id, {}).get(checkpoint_ns, {}) + checkpoint_id = get_checkpoint_id(config) or max(ns_storage, default="") chain: list[str] = [] target_entry = ns_storage.get(checkpoint_id) diff --git a/libs/checkpoint/tests/test_memory.py b/libs/checkpoint/tests/test_memory.py index 51d10a5dd..7c350ab96 100644 --- a/libs/checkpoint/tests/test_memory.py +++ b/libs/checkpoint/tests/test_memory.py @@ -420,6 +420,19 @@ class TestInMemorySaverDeltaChannel: assert "seed" not in result assert result["writes"] == [] + def test_get_channel_writes_without_checkpoint_id_reads_the_latest(self) -> None: + saver = InMemorySaver() + thread: RunnableConfig = { + "configurable": {"thread_id": "t1", "checkpoint_ns": ""} + } + parent = saver.put(thread, empty_checkpoint(), {}, {}) + saver.put_writes(parent, [("messages", "hi")], "task1") + saver.put(parent, empty_checkpoint(), {}, {}) + + result = saver.get_delta_channel_history(config=thread, channels=["messages"]) + + assert result == {"messages": {"writes": [("task1", "messages", "hi")]}} + class TestBaseFallbackGetChannelWrites: """Exercises the `BaseCheckpointSaver.get_delta_channel_history` default