From b269fdca92b411eba5e8680b6c4775eaa0a365ef Mon Sep 17 00:00:00 2001 From: Sean-Kenneth-Doherty Date: Fri, 30 Jan 2026 22:36:13 -0600 Subject: [PATCH] fix: add encoding='utf-8' to file operations in task_centric_memory This follows up on issue #5566 and PR #6094 which fixed the same issue in playwright_controller.py. The task_centric_memory module has similar file operations without explicit encoding, which can cause UnicodeDecodeError on non-English Windows systems (e.g., cp950, gbk). Files fixed: - chat_completion_client_recorder.py: session file read/write - page_logger.py: hash file, call tree HTML, and page HTML writes Without explicit encoding, Python uses the system default encoding which varies by locale (cp950 for Traditional Chinese Windows, cp936 for Simplified Chinese, etc.) and may fail to decode UTF-8 content. --- .../utils/chat_completion_client_recorder.py | 4 ++-- .../experimental/task_centric_memory/utils/page_logger.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/chat_completion_client_recorder.py b/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/chat_completion_client_recorder.py index 8b981312f427..66c304a6ae05 100644 --- a/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/chat_completion_client_recorder.py +++ b/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/chat_completion_client_recorder.py @@ -73,7 +73,7 @@ def __init__( # Load the previously recorded messages and responses from disk. self.logger.info("Replay mode enabled.\nRetrieving session from: " + self.session_file_path) try: - with open(self.session_file_path, "r") as f: + with open(self.session_file_path, "r", encoding="utf-8") as f: self.records = json.load(f) except Exception as e: error_str = f"\nFailed to load recorded session: '{self.session_file_path}': {e}" @@ -211,7 +211,7 @@ def finalize(self) -> None: # Create the directory if it doesn't exist. os.makedirs(os.path.dirname(self.session_file_path), exist_ok=True) # Write the records to disk. - with open(self.session_file_path, "w") as f: + with open(self.session_file_path, "w", encoding="utf-8") as f: json.dump(self.records, f, indent=2) self.logger.info("\nRecorded session was saved to: " + self.session_file_path) except Exception as e: diff --git a/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/page_logger.py b/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/page_logger.py index fa7fe2f1d567..2ccec94d42cc 100644 --- a/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/page_logger.py +++ b/python/packages/autogen-ext/src/autogen_ext/experimental/task_centric_memory/utils/page_logger.py @@ -117,7 +117,7 @@ def finalize(self) -> None: # Write the hash and other details to a file. hash_str, num_files, num_subdirs = hash_directory(self.log_dir) hash_path = os.path.join(self.log_dir, "hash.txt") - with open(hash_path, "w") as f: + with open(hash_path, "w", encoding="utf-8") as f: f.write(hash_str) f.write("\n") f.write("{} files\n".format(num_files)) @@ -386,7 +386,7 @@ def flush(self, finished: bool = False) -> None: return # Create a call tree of the log. call_tree_path = os.path.join(self.log_dir, self.name + ".html") - with open(call_tree_path, "w") as f: + with open(call_tree_path, "w", encoding="utf-8") as f: f.write(_html_opening("0 Call Tree", finished=finished)) f.write(f"

{self.name}

") f.write("\n") @@ -498,7 +498,7 @@ def flush(self) -> None: Writes the HTML page to disk. """ page_path = os.path.join(self.page_logger.log_dir, self.index_str + ".html") - with open(page_path, "w") as f: + with open(page_path, "w", encoding="utf-8") as f: f.write(_html_opening(self.file_title, finished=self.finished)) f.write(f"

{self.file_title}

\n") for line in self.lines: