fix(core): applied secrets_map in load to plain string values (#33678)

Replaces #33618 

**Description:** Fixes the bug in the `load()` function where secret
placeholders in plain dicts were not replaced, even if they match a key
in `secrets_map`, and adds a test case.

Example:
```py
obj = {"api_key": "__SECRET_API_KEY__"}
secret_key = "secret_key_1234"
secrets_map = {"__SECRET_API_KEY__": secret_key}
result = load(obj, secrets_map=secrets_map)
```
Before this change, printing `api_key` in `result` would output
`"__SECRET_API_KEY__"`. Now, it will properly output
`"secret_key_1234"`.

**Issue:** Fixes #31804 

**Dependencies:** None

`make format`, `make lint`, and `make test` have all passed on my
machine.

---------

Co-authored-by: Mason Daugherty <mason@langchain.dev>
Co-authored-by: Mason Daugherty <github@mdrxy.com>
This commit is contained in:
npage902
2025-11-07 14:14:13 -08:00
committed by GitHub
parent 9383b78be1
commit cc3af82b47
2 changed files with 13 additions and 0 deletions

View File

@@ -265,6 +265,8 @@ def load(
return reviver(loaded_obj)
if isinstance(obj, list):
return [_load(o) for o in obj]
if isinstance(obj, str) and obj in reviver.secrets_map:
return reviver.secrets_map[obj]
return obj
return _load(obj)

View File

@@ -0,0 +1,11 @@
"""Test for Serializable base class."""
from langchain_core.load.load import load
def test_load_with_string_secrets() -> None:
obj = {"api_key": "__SECRET_API_KEY__"}
secrets_map = {"__SECRET_API_KEY__": "hello"}
result = load(obj, secrets_map=secrets_map)
assert result["api_key"] == "hello"