diff --git a/libs/community/langchain_community/chat_message_histories/file.py b/libs/community/langchain_community/chat_message_histories/file.py index 41dbd2afaad..e32f668efb5 100644 --- a/libs/community/langchain_community/chat_message_histories/file.py +++ b/libs/community/langchain_community/chat_message_histories/file.py @@ -1,5 +1,40 @@ -from langchain_core.chat_history import FileChatMessageHistory +import json +from pathlib import Path +from typing import List -__all__ = [ - "FileChatMessageHistory", -] +from langchain_core.chat_history import ( + BaseChatMessageHistory, +) +from langchain_core.messages import BaseMessage, messages_from_dict, messages_to_dict + + +class FileChatMessageHistory(BaseChatMessageHistory): + """Chat message history that stores history in a local file.""" + + def __init__(self, file_path: str) -> None: + """Initialize the file path for the chat history. + + Args: + file_path: The path to the local file to store the chat history. + """ + self.file_path = Path(file_path) + if not self.file_path.exists(): + self.file_path.touch() + self.file_path.write_text(json.dumps([])) + + @property + def messages(self) -> List[BaseMessage]: # type: ignore + """Retrieve the messages from the local file""" + items = json.loads(self.file_path.read_text()) + messages = messages_from_dict(items) + return messages + + def add_message(self, message: BaseMessage) -> None: + """Append the message to the record in the local file""" + messages = messages_to_dict(self.messages) + messages.append(messages_to_dict([message])[0]) + self.file_path.write_text(json.dumps(messages)) + + def clear(self) -> None: + """Clear session memory from the local file""" + self.file_path.write_text(json.dumps([])) diff --git a/libs/core/tests/unit_tests/chat_history/test_file_chat_message_history.py b/libs/community/tests/unit_tests/chat_message_histories/test_file_chat_message_history.py similarity index 97% rename from libs/core/tests/unit_tests/chat_history/test_file_chat_message_history.py rename to libs/community/tests/unit_tests/chat_message_histories/test_file_chat_message_history.py index 4c292c61e5a..f069ff24935 100644 --- a/libs/core/tests/unit_tests/chat_history/test_file_chat_message_history.py +++ b/libs/community/tests/unit_tests/chat_message_histories/test_file_chat_message_history.py @@ -3,10 +3,10 @@ from pathlib import Path from typing import Generator import pytest - -from langchain_core.chat_history import FileChatMessageHistory from langchain_core.messages import AIMessage, HumanMessage +from langchain_community.chat_message_histories import FileChatMessageHistory + @pytest.fixture def file_chat_message_history() -> Generator[FileChatMessageHistory, None, None]: diff --git a/libs/core/langchain_core/chat_history.py b/libs/core/langchain_core/chat_history.py index 4388b373305..da14d070657 100644 --- a/libs/core/langchain_core/chat_history.py +++ b/libs/core/langchain_core/chat_history.py @@ -16,9 +16,7 @@ """ # noqa: E501 from __future__ import annotations -import json from abc import ABC, abstractmethod -from pathlib import Path from typing import List, Sequence, Union from langchain_core.messages import ( @@ -26,8 +24,6 @@ from langchain_core.messages import ( BaseMessage, HumanMessage, get_buffer_string, - messages_from_dict, - messages_to_dict, ) from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables import run_in_executor @@ -215,35 +211,3 @@ class InMemoryChatMessageHistory(BaseChatMessageHistory, BaseModel): async def aclear(self) -> None: self.clear() - - -class FileChatMessageHistory(BaseChatMessageHistory): - """Chat message history that stores history in a local file.""" - - def __init__(self, file_path: str) -> None: - """Initialize the file path for the chat history. - - Args: - file_path: The path to the local file to store the chat history. - """ - self.file_path = Path(file_path) - if not self.file_path.exists(): - self.file_path.touch() - self.file_path.write_text(json.dumps([])) - - @property - def messages(self) -> List[BaseMessage]: # type: ignore - """Retrieve the messages from the local file""" - items = json.loads(self.file_path.read_text()) - messages = messages_from_dict(items) - return messages - - def add_message(self, message: BaseMessage) -> None: - """Append the message to the record in the local file""" - messages = messages_to_dict(self.messages) - messages.append(messages_to_dict([message])[0]) - self.file_path.write_text(json.dumps(messages)) - - def clear(self) -> None: - """Clear session memory from the local file""" - self.file_path.write_text(json.dumps([]))