diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index 44f99b6510f..1b720fb5b6e 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -159,17 +159,25 @@ def patch_config( def merge_configs(*configs: Optional[RunnableConfig]) -> RunnableConfig: base: RunnableConfig = {} + # Even though the keys aren't literals this is correct + # because both dicts are same type for config in (c for c in configs if c is not None): for key in config: if key == "metadata": - base[key] = {**base.get(key, {}), **config[key]} # type: ignore + base[key] = { # type: ignore + **base.get(key, {}), # type: ignore + **(config.get(key) or {}), # type: ignore + } elif key == "tags": - base[key] = list(set(base.get(key, []) + config[key])) # type: ignore + base[key] = list( # type: ignore + set(base.get(key, []) + (config.get(key) or [])), # type: ignore + ) elif key == "configurable": - base[key] = {**base.get(key, {}), **config[key]} # type: ignore + base[key] = { # type: ignore + **base.get(key, {}), # type: ignore + **(config.get(key) or {}), # type: ignore + } else: - # Even though the keys aren't literals this is correct - # because both dicts are same type base[key] = config[key] or base.get(key) # type: ignore return base