diff --git a/libs/core/langchain_core/runnables/history.py b/libs/core/langchain_core/runnables/history.py index 96e901a5dae..a8b338fce92 100644 --- a/libs/core/langchain_core/runnables/history.py +++ b/libs/core/langchain_core/runnables/history.py @@ -537,8 +537,9 @@ class RunnableWithMessageHistory(RunnableBindingBase): configurable = config.get("configurable", {}) missing_keys = set(expected_keys) - set(configurable.keys()) + parameter_names = _get_parameter_names(self.get_session_history) - if missing_keys: + if missing_keys and parameter_names: example_input = {self.input_messages_key: "foo"} example_configurable = { missing_key: "[your-value-here]" for missing_key in missing_keys @@ -551,11 +552,16 @@ class RunnableWithMessageHistory(RunnableBindingBase): f"e.g., chain.invoke({example_input}, {example_config})" ) - parameter_names = _get_parameter_names(self.get_session_history) - if len(expected_keys) == 1: - # If arity = 1, then invoke function by positional arguments - message_history = self.get_session_history(configurable[expected_keys[0]]) + if parameter_names: + # If arity = 1, then invoke function by positional arguments + message_history = self.get_session_history( + configurable[expected_keys[0]] + ) + else: + if not config: + config["configurable"] = {} + message_history = self.get_session_history() else: # otherwise verify that names of keys patch and invoke by named arguments if set(expected_keys) != set(parameter_names): diff --git a/libs/core/tests/unit_tests/runnables/test_history.py b/libs/core/tests/unit_tests/runnables/test_history.py index b80390533d9..ccec320c8ed 100644 --- a/libs/core/tests/unit_tests/runnables/test_history.py +++ b/libs/core/tests/unit_tests/runnables/test_history.py @@ -694,3 +694,24 @@ async def test_using_custom_config_specs_async() -> None: ] ), } + + +def test_ignore_session_id() -> None: + """Test without config.""" + + def _fake_llm(input: List[BaseMessage]) -> List[BaseMessage]: + return [ + AIMessage( + content="you said: " + + "\n".join( + str(m.content) for m in input if isinstance(m, HumanMessage) + ) + ) + ] + + runnable = RunnableLambda(_fake_llm) + history = InMemoryChatMessageHistory() + with_message_history = RunnableWithMessageHistory(runnable, lambda: history) # type: ignore + _ = with_message_history.invoke("hello") + _ = with_message_history.invoke("hello again") + assert len(history.messages) == 4