diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index 612e19d2c70..afce1201e18 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -2253,30 +2253,32 @@ class RunnableEach(RunnableSerializable[List[Input], List[Output]]): inputs: List[Input], run_manager: CallbackManagerForChainRun, config: RunnableConfig, + **kwargs: Any, ) -> List[Output]: return self.bound.batch( - inputs, patch_config(config, callbacks=run_manager.get_child()) + inputs, patch_config(config, callbacks=run_manager.get_child()), **kwargs ) def invoke( - self, input: List[Input], config: Optional[RunnableConfig] = None + self, input: List[Input], config: Optional[RunnableConfig] = None, **kwargs: Any ) -> List[Output]: - return self._call_with_config(self._invoke, input, config) + return self._call_with_config(self._invoke, input, config, **kwargs) async def _ainvoke( self, inputs: List[Input], run_manager: AsyncCallbackManagerForChainRun, config: RunnableConfig, + **kwargs: Any, ) -> List[Output]: return await self.bound.abatch( - inputs, patch_config(config, callbacks=run_manager.get_child()) + inputs, patch_config(config, callbacks=run_manager.get_child()), **kwargs ) async def ainvoke( self, input: List[Input], config: Optional[RunnableConfig] = None, **kwargs: Any ) -> List[Output]: - return await self._acall_with_config(self._ainvoke, input, config) + return await self._acall_with_config(self._ainvoke, input, config, **kwargs) class RunnableBinding(RunnableSerializable[Input, Output]): @@ -2332,6 +2334,8 @@ class RunnableBinding(RunnableSerializable[Input, Output]): copy[key] = {**copy.get(key, {}), **config[key]} # type: ignore elif key == "tags": copy[key] = (copy.get(key) or []) + config[key] # type: ignore + elif key == "configurable": + copy[key] = {**copy.get(key, {}), **config[key]} # type: ignore else: # Even though the keys aren't literals this is correct # because both dicts are same type diff --git a/libs/langchain/langchain/schema/runnable/config.py b/libs/langchain/langchain/schema/runnable/config.py index c7bf9ddc2bf..71eb7428e06 100644 --- a/libs/langchain/langchain/schema/runnable/config.py +++ b/libs/langchain/langchain/schema/runnable/config.py @@ -135,6 +135,7 @@ def patch_config( recursion_limit: Optional[int] = None, max_concurrency: Optional[int] = None, run_name: Optional[str] = None, + configurable: Optional[Dict[str, Any]] = None, ) -> RunnableConfig: config = ensure_config(config) if copy_locals: @@ -151,6 +152,8 @@ def patch_config( config["max_concurrency"] = max_concurrency if run_name is not None: config["run_name"] = run_name + if configurable is not None: + config["configurable"] = {**config.get("configurable", {}), **configurable} return config