From 47d330f4e6c09392bb53ef063bfff5643dd67c3a Mon Sep 17 00:00:00 2001 From: Michael Li Date: Tue, 8 Jul 2025 03:30:59 +1000 Subject: [PATCH] fix: fix file open with encoding in chat_history.py (#31884) Thank you for contributing to LangChain! - [x] **PR title**: "package: description" - Where "package" is whichever of langchain, core, etc. is being modified. Use "docs: ..." for purely docs changes, "infra: ..." for CI changes. - Example: "core: add foobar LLM" - [x] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** a description of the change - **Issue:** the issue # it fixes, if applicable - **Dependencies:** any dependencies required for this change - **Twitter handle:** if your PR gets announced, and you'd like a mention, we'll gladly shout you out! - [x] **Add tests and docs**: If you're adding a new integration, please include 1. a test for the integration, preferably unit tests that do not rely on network access, 2. an example notebook showing its use. It lives in `docs/docs/integrations` directory. - [x] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to pyproject.toml files (even optional ones) unless they are required for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible. If no one reviews your PR within a few days, please @-mention one of baskaryan, eyurtsev, ccurme, vbarda, hwchase17. Co-authored-by: Mason Daugherty --- libs/core/langchain_core/chat_history.py | 36 +++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/libs/core/langchain_core/chat_history.py b/libs/core/langchain_core/chat_history.py index 9e74dfca2bb..f985f25ad01 100644 --- a/libs/core/langchain_core/chat_history.py +++ b/libs/core/langchain_core/chat_history.py @@ -65,28 +65,32 @@ class BaseChatMessageHistory(ABC): .. code-block:: python class FileChatMessageHistory(BaseChatMessageHistory): - storage_path: str + storage_path: str session_id: str - @property - def messages(self): - with open(os.path.join(storage_path, session_id), 'r:utf-8') as f: - messages = json.loads(f.read()) + @property + def messages(self): + with open( + os.path.join(storage_path, session_id), + "r", + encoding="utf-8", + ) as f: + messages = json.loads(f.read()) return messages_from_dict(messages) - def add_messages(self, messages: Sequence[BaseMessage]) -> None: - all_messages = list(self.messages) # Existing messages - all_messages.extend(messages) # Add new messages + def add_messages(self, messages: Sequence[BaseMessage]) -> None: + all_messages = list(self.messages) # Existing messages + all_messages.extend(messages) # Add new messages - serialized = [message_to_dict(message) for message in all_messages] - # Can be further optimized by only writing new messages - # using append mode. - with open(os.path.join(storage_path, session_id), 'w') as f: - json.dump(f, messages) + serialized = [message_to_dict(message) for message in all_messages] + # Can be further optimized by only writing new messages + # using append mode. + with open(os.path.join(storage_path, session_id), "w") as f: + json.dump(messages, f) - def clear(self): - with open(os.path.join(storage_path, session_id), 'w') as f: - f.write("[]") + def clear(self): + with open(os.path.join(storage_path, session_id), "w") as f: + f.write("[]") """ messages: list[BaseMessage]