From e9c1765967063404e6c9ff553831f83b2daeec34 Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Thu, 13 Mar 2025 12:27:03 -0700 Subject: [PATCH] fix(core): Ignore missing secrets on deserialization (#30252) --- libs/core/langchain_core/load/load.py | 3 +-- libs/langchain/tests/unit_tests/load/test_load.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/libs/core/langchain_core/load/load.py b/libs/core/langchain_core/load/load.py index c407a25880c..6ceb2d3d7c8 100644 --- a/libs/core/langchain_core/load/load.py +++ b/libs/core/langchain_core/load/load.py @@ -98,8 +98,7 @@ class Reviver: else: if self.secrets_from_env and key in os.environ and os.environ[key]: return os.environ[key] - msg = f'Missing key "{key}" in load(secrets_map)' - raise KeyError(msg) + return None if ( value.get("lc") == 1 diff --git a/libs/langchain/tests/unit_tests/load/test_load.py b/libs/langchain/tests/unit_tests/load/test_load.py index 24d5b81fe38..5e95b024016 100644 --- a/libs/langchain/tests/unit_tests/load/test_load.py +++ b/libs/langchain/tests/unit_tests/load/test_load.py @@ -167,3 +167,13 @@ def test_load_llmchain_with_non_serializable_arg() -> None: chain_obj = dumpd(chain) with pytest.raises(NotImplementedError): load(chain_obj, secrets_map={"OPENAI_API_KEY": "hello"}) + + +@pytest.mark.requires("openai", "langchain_openai") +def test_loads_with_missing_secrets() -> None: + import openai + + llm_string = '{"lc": 1, "type": "constructor", "id": ["langchain", "llms", "openai", "OpenAI"], "kwargs": {"model_name": "davinci", "temperature": 0.5, "max_tokens": 256, "top_p": 0.8, "n": 1, "best_of": 1, "openai_api_key": {"lc": 1, "type": "secret", "id": ["OPENAI_API_KEY"]}, "batch_size": 20, "max_retries": 2, "disallowed_special": "all"}, "name": "OpenAI"}' # noqa: E501 + # Should throw on instantiation, not deserialization + with pytest.raises(openai.OpenAIError): + loads(llm_string)