From b00646d88273f13feedc26b6167c96c6effc279d Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Thu, 16 Apr 2026 15:17:20 -0400 Subject: [PATCH] chore(core): keep checkpoint_ns behavior in streaming metadata for backwards compat (#36828) minor buglet --- libs/core/langchain_core/runnables/config.py | 16 +++++++++----- .../tests/unit_tests/runnables/test_config.py | 21 ++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/libs/core/langchain_core/runnables/config.py b/libs/core/langchain_core/runnables/config.py index 5bae0488370..d94d049fc52 100644 --- a/libs/core/langchain_core/runnables/config.py +++ b/libs/core/langchain_core/runnables/config.py @@ -286,11 +286,17 @@ def ensure_config(config: RunnableConfig | None = None) -> RunnableConfig: for k, v in config.items(): if k not in CONFIG_KEYS and v is not None: empty["configurable"][k] = v - if ( - isinstance(model := empty.get("configurable", {}).get("model"), str) - and "model" not in empty["metadata"] - ): - empty["metadata"]["model"] = model + for configurable_key in ("model", "checkpoint_ns"): + if ( + isinstance( + configurable_value := empty.get("configurable", {}).get( + configurable_key + ), + str, + ) + and configurable_key not in empty["metadata"] + ): + empty["metadata"][configurable_key] = configurable_value return empty diff --git a/libs/core/tests/unit_tests/runnables/test_config.py b/libs/core/tests/unit_tests/runnables/test_config.py index 9a4716e8269..4d422333cbf 100644 --- a/libs/core/tests/unit_tests/runnables/test_config.py +++ b/libs/core/tests/unit_tests/runnables/test_config.py @@ -95,7 +95,11 @@ def test_ensure_config_copies_model_to_metadata() -> None: } ) - assert config["metadata"] == {"nooverride": 18, "model": "gpt-4o"} + assert config["metadata"] == { + "nooverride": 18, + "model": "gpt-4o", + "checkpoint_ns": "ns-1", + } assert config["configurable"] == { "thread_id": "th-123", "checkpoint_id": "ckpt-1", @@ -157,6 +161,21 @@ def test_ensure_config_copies_top_level_model_to_metadata() -> None: assert config["configurable"] == {"model": "gpt-4o"} +def test_ensure_config_copies_top_level_checkpoint_ns_to_metadata() -> None: + config = ensure_config( + cast( + "RunnableConfig", + { + "checkpoint_ns": "ns-1", + "metadata": {"nooverride": 18}, + }, + ) + ) + + assert config["metadata"] == {"nooverride": 18, "checkpoint_ns": "ns-1"} + assert config["configurable"] == {"checkpoint_ns": "ns-1"} + + def test_get_langsmith_inheritable_metadata_from_config_uses_previous_copy_rules() -> ( None ):