"""Test script for MessageCompactOp. This script provides test cases for MessageCompactOp class. It can be run directly with: python test_context_compact_op.py """ import asyncio from flowllm.core.enumeration import Role from flowllm.core.schema import Message from reme_ai.main import ReMeApp from reme_ai.retrieve.working import BatchWriteFileOp from reme_ai.summary.working import MessageCompactOp async def async_main(): """Test function for MessageCompactOp.""" async with ReMeApp(): # Create test messages with system, user, assistant, tool sequence messages = [ Message(role=Role.SYSTEM, content="You are a helpful assistant."), Message(role=Role.USER, content="What is the weather today?"), Message( role=Role.ASSISTANT, content="I'll check the weather for you.", ), Message( role=Role.TOOL, content="A" * 5000, # Large tool message that should be compacted tool_call_id="call_001", ), Message( role=Role.ASSISTANT, content="Let me also check the forecast.", ), Message( role=Role.TOOL, content="B" * 5000, # Another large tool message tool_call_id="call_002", ), Message( role=Role.USER, content="What about tomorrow?", ), Message( role=Role.ASSISTANT, content="I'll check tomorrow's weather.", ), Message( role=Role.TOOL, content="C" * 5000, # Third large tool message tool_call_id="call_003", ), Message( role=Role.TOOL, content="Recent result", # Recent tool message (should be kept) tool_call_id="call_004", ), ] # Create op with lower thresholds for testing op = MessageCompactOp() >> BatchWriteFileOp() # Execute the compaction await op.async_call( messages=[m.model_dump() for m in messages], max_total_tokens=1000, # Low threshold to trigger compaction max_tool_message_tokens=100, # Low threshold to compact tool messages preview_char_length=50, # Keep 50 chars in preview keep_recent_count=1, # Keep 1 recent tool message store_dir="./test_compact_storage", ) # Print results result = op.context.response.answer print(f"Context compaction result: {result}") if __name__ == "__main__": asyncio.run(async_main())