From 55eb1f87bc159761695100bed8c8b572a63086da Mon Sep 17 00:00:00 2001 From: "jinli.yl" Date: Tue, 25 Nov 2025 12:13:22 +0800 Subject: [PATCH] refactor(summary): remove system message handling in compression logic --- reme_ai/summary/working/message_compact_op.py | 10 ---------- .../summary/working/message_compress_op.py | 20 ++++++------------- test_op/test_agentic_retrieve_op.py | 4 ++-- 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/reme_ai/summary/working/message_compact_op.py b/reme_ai/summary/working/message_compact_op.py index b20488fb..6fc5858c 100644 --- a/reme_ai/summary/working/message_compact_op.py +++ b/reme_ai/summary/working/message_compact_op.py @@ -58,15 +58,6 @@ class MessageCompactOp(BaseAsyncOp): if keep_recent_count > 0: messages_to_compress = messages_to_compress[:-keep_recent_count] - # Extract system message (should be exactly one) - system_message = [x for x in messages if x.role is Role.SYSTEM] - assert len(system_message) <= 1, f"Expected at most one system message, got {len(system_message)}" - - if len(system_message) == 0: - system_message = Message(role=Role.SYSTEM, content="") - else: - system_message = system_message[0] - # If nothing to compress after filtering, return original messages if not messages_to_compress: self.context.response.answer = self.context.messages @@ -125,7 +116,6 @@ class MessageCompactOp(BaseAsyncOp): if preview_char_length > 0: compact_result += f"\npreview: {original_content[:preview_char_length]}..." tool_message.content = compact_result - system_message.content += f"\n\n{compact_result}" # Store write_file_dict in context for potential batch writing if write_file_dict: diff --git a/reme_ai/summary/working/message_compress_op.py b/reme_ai/summary/working/message_compress_op.py index 3eac31da..99bad722 100644 --- a/reme_ai/summary/working/message_compress_op.py +++ b/reme_ai/summary/working/message_compress_op.py @@ -162,7 +162,6 @@ class MessageCompressOp(BaseAsyncOp): async def _compress_with_groups( self, - system_message: Message, message_groups: List[List[Message]], ) -> Tuple[dict, list]: """Compress multiple message groups and prepare them for storage. @@ -173,7 +172,6 @@ class MessageCompressOp(BaseAsyncOp): message. Otherwise, original messages are preserved in the return list. Args: - system_message: The system message to append compressed summaries to. message_groups: List of message groups, where each group is a list of Message objects to be compressed together. @@ -190,7 +188,7 @@ class MessageCompressOp(BaseAsyncOp): chat_id: str = self.context.get("chat_id", uuid4().hex) # Create a copy of system_message to avoid modifying the original - system_message_copy = Message(role=system_message.role, content=system_message.content) + compress_message = Message(role=Role.ASSISTANT, content="") for g_idx, messages in enumerate(message_groups): group_original_tokens = self.token_count(messages) @@ -218,7 +216,7 @@ class MessageCompressOp(BaseAsyncOp): ) return_messages.extend(messages) else: - system_message_copy.content += compress_content + "\n\n" + compress_message.content += compress_content + "\n\n" write_file_dict[store_path.as_posix()] = messages_str logger.info( f"Group {g_idx} compression successful: " @@ -227,7 +225,7 @@ class MessageCompressOp(BaseAsyncOp): f"{100 * (1 - compressed_tokens / group_original_tokens):.1f}%)", ) - return_messages = [system_message_copy] + return_messages + return_messages = [compress_message] + return_messages return write_file_dict, return_messages async def async_execute(self): @@ -257,13 +255,7 @@ class MessageCompressOp(BaseAsyncOp): messages = [Message(**x) for x in self.context.messages] # Extract system message (should be exactly one) - system_message = [x for x in messages if x.role is Role.SYSTEM] - assert len(system_message) <= 1, f"Expected at most one system message, got {len(system_message)}" - - if len(system_message) == 0: - system_message = Message(role=Role.SYSTEM, content="") - else: - system_message = system_message[0] + system_messages = [x for x in messages if x.role is Role.SYSTEM] messages_without_system = [x for x in messages if x.role is not Role.SYSTEM] if keep_recent_count > 0: @@ -296,13 +288,13 @@ class MessageCompressOp(BaseAsyncOp): else: message_groups = [messages_to_compress] - write_file_dict, return_messages = await self._compress_with_groups(system_message, message_groups) + write_file_dict, return_messages = await self._compress_with_groups(message_groups) # Store write_file_dict in context for potential batch writing if write_file_dict: self.context.write_file_dict = write_file_dict - self.context.response.answer = [x.simple_dump() for x in (return_messages + recent_messages)] + self.context.response.answer = [x.simple_dump() for x in (system_messages + return_messages + recent_messages)] self.context.response.metadata["write_file_dict"] = write_file_dict async def async_default_execute(self, e: Exception = None, **_kwargs): diff --git a/test_op/test_agentic_retrieve_op.py b/test_op/test_agentic_retrieve_op.py index 7233d2dd..3cb9d851 100644 --- a/test_op/test_agentic_retrieve_op.py +++ b/test_op/test_agentic_retrieve_op.py @@ -70,9 +70,9 @@ async def test_agentic_retrieve_basic(): ] # llm = "qwen3_coder_plus" - # llm = "qwen3_30b_instruct" + llm = "qwen3_30b_instruct" # llm = "qwen3_30b_thinking" - llm = "qwen3_coder_30b_instruct" + # llm = "qwen3_coder_30b_instruct" # llm = "qwen3_max_instruct" op = AgenticRetrieveOp(llm=llm)