From 8b600f9d6c42635700f758ee6a2bf5289b270c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AD=90=E9=BB=98?= <925456043@qq.com> Date: Thu, 28 May 2026 11:15:52 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8E=8B=E7=BC=A9=E8=AE=B0=E5=BF=86=E7=9A=84=E8=A1=A8=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/interceptor/AutoContextInterceptor.java | 13 ++++++------- .../agentscope/AgentScopeStatefulRuntimeTest.java | 10 ++++++++-- 2 files changed, 14 insertions(+), 9 deletions(-) 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")); }