From 427d2d6397c7263a9ed5e40c610f468f6c563f1a Mon Sep 17 00:00:00 2001 From: Gurram Siddarth Reddy <73605274+siddarthreddygsr@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:24:28 +0530 Subject: [PATCH] fix(core): implement sleep delay in FakeMessagesListChatModel `_generate` (#32014) implement sleep delay in FakeMessagesListChatModel._generate so the sleep parameter is respected, matching the documented behavior. This adds artificial latency between responses for testing purposes. Issue: closes [#31974](https://github.com/langchain-ai/langchain/issues/31974) following [docs](https://python.langchain.com/api_reference/core/language_models/langchain_core.language_models.fake_chat_models.FakeMessagesListChatModel.html#langchain_core.language_models.fake_chat_models.FakeMessagesListChatModel.sleep) Dependencies: none Twitter handle: [@siddarthreddyg2](https://x.com/siddarthreddyg2) --------- Signed-off-by: Siddarthreddygsr --- .../language_models/fake_chat_models.py | 2 ++ .../unit_tests/fake/test_fake_chat_model.py | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libs/core/langchain_core/language_models/fake_chat_models.py b/libs/core/langchain_core/language_models/fake_chat_models.py index a1cdd49a7b3..b8dd7325242 100644 --- a/libs/core/langchain_core/language_models/fake_chat_models.py +++ b/libs/core/langchain_core/language_models/fake_chat_models.py @@ -36,6 +36,8 @@ class FakeMessagesListChatModel(BaseChatModel): run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> ChatResult: + if self.sleep is not None: + time.sleep(self.sleep) response = self.responses[self.i] if self.i < len(self.responses) - 1: self.i += 1 diff --git a/libs/core/tests/unit_tests/fake/test_fake_chat_model.py b/libs/core/tests/unit_tests/fake/test_fake_chat_model.py index 7500e1640ac..ce262797535 100644 --- a/libs/core/tests/unit_tests/fake/test_fake_chat_model.py +++ b/libs/core/tests/unit_tests/fake/test_fake_chat_model.py @@ -1,5 +1,6 @@ """Tests for verifying that testing utility code works as expected.""" +import time from itertools import cycle from typing import Any, Optional, Union from uuid import UUID @@ -9,10 +10,11 @@ from typing_extensions import override from langchain_core.callbacks.base import AsyncCallbackHandler from langchain_core.language_models import ( FakeListChatModel, + FakeMessagesListChatModel, GenericFakeChatModel, ParrotFakeChatModel, ) -from langchain_core.messages import AIMessage, AIMessageChunk, BaseMessage +from langchain_core.messages import AIMessage, AIMessageChunk, BaseMessage, HumanMessage from langchain_core.outputs import ChatGenerationChunk, GenerationChunk from tests.unit_tests.stubs import ( _any_id_ai_message, @@ -230,3 +232,18 @@ def test_fake_list_chat_model_batch() -> None: fake = FakeListChatModel(responses=["a", "b", "c"]) resp = fake.batch(["1", "2", "3"]) assert resp == expected + + +def test_fake_messages_list_chat_model_sleep_delay() -> None: + sleep_time = 0.1 + model = FakeMessagesListChatModel( + responses=[AIMessage(content="A"), AIMessage(content="B")], + sleep=sleep_time, + ) + messages = [HumanMessage(content="C")] + + start = time.time() + model.invoke(messages) + elapsed = time.time() - start + + assert elapsed >= sleep_time