diff --git a/easy-agents-agent-runtime/src/main/java/com/easyagents/agent/runtime/event/interceptor/AutoContextInterceptor.java b/easy-agents-agent-runtime/src/main/java/com/easyagents/agent/runtime/event/interceptor/AutoContextInterceptor.java index 5261fe3..0bdbca9 100644 --- a/easy-agents-agent-runtime/src/main/java/com/easyagents/agent/runtime/event/interceptor/AutoContextInterceptor.java +++ b/easy-agents-agent-runtime/src/main/java/com/easyagents/agent/runtime/event/interceptor/AutoContextInterceptor.java @@ -168,12 +168,10 @@ public class AutoContextInterceptor implements AgentRuntimeInterceptor { CompressionCheck compressionCheck = compressionCheck(autoContextMemory.getMessages()); int beforeEventCount = compressionEventCount(autoContextMemory); if (compressionCheck.thresholdReached()) { + emitCompressionStarted(compressionCheck); boolean compressed = autoContextMemory.compressIfNeeded(); List newEvents = newCompressionEvents(autoContextMemory, beforeEventCount); - if (compressed && !newEvents.isEmpty()) { - emitCompressionStarted(compressionCheck); - emitCompressionCompleted(compressionCheck, newEvents); - } + emitCompressionCompleted(compressionCheck, newEvents, compressed && !newEvents.isEmpty()); } // 压缩完毕后自动进行当前的会话 event.setInputMessages(buildInputMessages(event, autoContextMemory)); @@ -281,13 +279,14 @@ public class AutoContextInterceptor implements AgentRuntimeInterceptor { * @param events 新增压缩事件 */ private void emitCompressionCompleted(CompressionCheck compressionCheck, - List events) { + List events, + boolean compressed) { AgentRuntimeEvent event = eventBridge.event(AgentRuntimeEventType.MEMORY_COMPRESSION_COMPLETED); event.getPayload().put("statusKey", STATUS_KEY); event.getPayload().put("phase", "completed"); event.getPayload().put("status", "done"); - event.getPayload().put("label", "已整理上下文"); - event.getPayload().put("compressed", true); + event.getPayload().put("label", compressed ? "已整理上下文" : "无需压缩上下文"); + event.getPayload().put("compressed", compressed); event.getPayload().put("eventCount", events == null ? 0 : events.size()); event.getPayload().put("events", toPayloadEvents(events)); putCompressionCheckPayload(event, compressionCheck); diff --git a/easy-agents-agent-runtime/src/test/java/com/easyagents/agent/runtime/agentscope/AgentScopeStatefulRuntimeTest.java b/easy-agents-agent-runtime/src/test/java/com/easyagents/agent/runtime/agentscope/AgentScopeStatefulRuntimeTest.java index fe3dfd1..46912ce 100644 --- a/easy-agents-agent-runtime/src/test/java/com/easyagents/agent/runtime/agentscope/AgentScopeStatefulRuntimeTest.java +++ b/easy-agents-agent-runtime/src/test/java/com/easyagents/agent/runtime/agentscope/AgentScopeStatefulRuntimeTest.java @@ -338,7 +338,7 @@ public class AgentScopeStatefulRuntimeTest { } @Test - public void shouldNotEmitAutoContextCompressionEventsWhenCompressionIsSkipped() { + public void shouldEmitNoCompressionCompletedEventWhenCompressionIsSkipped() throws Exception { AgentInitRequest request = initRequest(); AgentMemoryCompressionParameter parameter = new AgentMemoryCompressionParameter(); parameter.setMsgThreshold(1); @@ -362,12 +362,18 @@ public class AgentScopeStatefulRuntimeTest { Sinks.Many sink = Sinks.many().replay().all(); AutoContextInterceptor interceptor = new AutoContextInterceptor( AgentRuntimeEventBridge.fixed(executionContext(), sink), memoryResult.getAutoContextConfig()); + CompletableFuture> eventsFuture = sink.asFlux().take(2).collectList().toFuture(); PreReasoningEvent event = new PreReasoningEvent(agent, "fake-model", null, List.of(Msg.builder().role(MsgRole.SYSTEM).textContent("system").build())); interceptor.intercept(event).block(); + List events = eventsFuture.get(3, TimeUnit.SECONDS); - Assert.assertTrue(sink.asFlux().take(Duration.ofMillis(100)).collectList().block().isEmpty()); + Assert.assertEquals(AgentRuntimeEventType.MEMORY_COMPRESSION_STARTED, events.get(0).getEventType()); + Assert.assertEquals(AgentRuntimeEventType.MEMORY_COMPRESSION_COMPLETED, events.get(1).getEventType()); + Assert.assertEquals(Boolean.FALSE, events.get(1).getPayload().get("compressed")); + Assert.assertEquals("无需压缩上下文", events.get(1).getPayload().get("label")); + Assert.assertEquals(0, ((Number) events.get(1).getPayload().get("eventCount")).intValue()); Assert.assertTrue(event.getInputMessages().get(0).getTextContent().contains("CONTEXT_OFFLOAD")); }