From d30e58ff833937ce607e0110430a43fd15dcbff0 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 12 Apr 2026 22:15:08 +0800 Subject: [PATCH] refactor(framework): centralize model exception reporting in ActivateModel and remove duplicated module-level handlers --- .../action/executor/ActionExecutor.java | 8 +------- .../module/action/planner/ActionPlanner.java | 4 +--- .../planner/evaluator/ActionEvaluator.java | 3 +-- .../planner/extractor/ActionExtractor.java | 13 +++++++++++-- .../communication/CommunicationProducer.java | 2 -- .../evaluator/SliceSelectEvaluator.java | 3 --- .../extractor/MemorySelectExtractor.java | 4 +--- .../updater/summarizer/SingleSummarizer.java | 3 +-- .../memory/runtime/MemoryRuntimeTest.java | 19 +++++-------------- .../framework/agent/model/ActivateModel.kt | 13 ++++++++++--- 10 files changed, 31 insertions(+), 41 deletions(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java index aca707e5..c15fad1e 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java @@ -8,7 +8,6 @@ import work.slhaf.partner.core.action.entity.*; import work.slhaf.partner.core.action.runner.RunnerClient; import work.slhaf.partner.core.cognition.CognitionCapability; import work.slhaf.partner.framework.agent.exception.AgentRuntimeException; -import work.slhaf.partner.framework.agent.exception.ExceptionReporterHandler; import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule; import work.slhaf.partner.framework.agent.factory.component.annotation.Init; @@ -227,7 +226,6 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { if (shouldRunCorrector) { val correctorInput = assemblyHelper.buildCorrectorInput(executableAction); actionCorrector.execute(correctorInput) - .onFailure(ExceptionReporterHandler.INSTANCE::report) .onSuccess(correctorResult -> { actionCapability.handleInterventions(correctorResult.getMetaInterventionList(), executableAction); blockManager.emitActionCorrectionBlock( @@ -313,8 +311,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { val executingStage = actionData.getExecutingStage(); - Result extractorInputResult = assemblyHelper.buildExtractorInput(metaAction.getKey(), actionData.getUuid(), actionData.getDescription()) - .onFailure(ExceptionReporterHandler.INSTANCE::report); + Result extractorInputResult = assemblyHelper.buildExtractorInput(metaAction.getKey(), actionData.getUuid(), actionData.getDescription()); AgentRuntimeException exception = extractorInputResult.exceptionOrNull(); if (exception != null) { failureReason.set(exception.getMessage()); @@ -323,7 +320,6 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { ExtractorInput extractorInput = extractorInputResult.getOrThrow(); Result extractorResultWrapped = paramsExtractor.execute(extractorInput).onFailure(exp -> { - ExceptionReporterHandler.INSTANCE.report(exp); failureReason.set(exp.getLocalizedMessage()); }); if (extractorResultWrapped.exceptionOrNull() != null) { @@ -373,7 +369,6 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { return () -> { try { return actionCorrectionRecognizer.execute(input) - .onFailure(ExceptionReporterHandler.INSTANCE::report) .getOrDefault(new CorrectionRecognizerResult()); } finally { phaser.arriveAndDeregister(); @@ -515,7 +510,6 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { private String resolveHistoryDescription(String actionKey) { return actionCapability.loadMetaActionInfo(actionKey) - .onFailure(ExceptionReporterHandler.INSTANCE::report) .fold( metaActionInfo -> metaActionInfo.getDescription().isBlank() ? actionKey : metaActionInfo.getDescription(), exception -> actionKey diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java index b591fd6d..60eada0f 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java @@ -390,7 +390,6 @@ public class ActionPlanner extends AbstractAgentModule.Running metaActionResult = actionCapability.loadMetaAction(actionKey); AgentRuntimeException failure = metaActionResult.onSuccess(metaActions::add) - .onFailure(ExceptionReporterHandler.INSTANCE::report) .exceptionOrNull(); if (failure != null) { return null; @@ -415,8 +414,7 @@ public class ActionPlanner extends AbstractAgentModule.Running infoResult = actionCapability.loadMetaActionInfo(actionKey) - .onFailure(ExceptionReporterHandler.INSTANCE::report); + Result infoResult = actionCapability.loadMetaActionInfo(actionKey); if (infoResult.exceptionOrNull() != null) { return false; } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java index 0be0d5e3..53b6f310 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java @@ -10,7 +10,6 @@ import work.slhaf.partner.core.cognition.BlockContent; import work.slhaf.partner.core.cognition.CognitionCapability; import work.slhaf.partner.core.cognition.ContextBlock; import work.slhaf.partner.core.cognition.ResolvedContext; -import work.slhaf.partner.framework.agent.exception.ExceptionReporterHandler; import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule; import work.slhaf.partner.framework.agent.factory.component.annotation.Init; @@ -67,7 +66,7 @@ public class ActionEvaluator extends AbstractAgentModule.Sub { + result.onSuccess(evaluatorResult -> { evaluatorResult.setTendency(tendency); synchronized (evaluatorResults) { evaluatorResults.add(evaluatorResult); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/extractor/ActionExtractor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/extractor/ActionExtractor.java index 1ce5d51a..8767008b 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/extractor/ActionExtractor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/extractor/ActionExtractor.java @@ -3,6 +3,8 @@ package work.slhaf.partner.module.action.planner.extractor; import org.jetbrains.annotations.NotNull; import work.slhaf.partner.core.cognition.CognitionCapability; import work.slhaf.partner.core.cognition.ContextBlock; +import work.slhaf.partner.framework.agent.exception.AgentRuntimeException; +import work.slhaf.partner.framework.agent.exception.ModuleExecutionException; import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule; import work.slhaf.partner.framework.agent.model.ActivateModel; @@ -26,8 +28,15 @@ public class ActionExtractor extends AbstractAgentModule.Sub { - ExceptionReporterHandler.INSTANCE.report(exception); consumer.onDelta(INTERRUPTED_MARKER); }); updateChatMessages(runningFlowContext, consumer.collectResponse()); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/evaluator/SliceSelectEvaluator.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/evaluator/SliceSelectEvaluator.java index 10d8d41f..cb4d820f 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/evaluator/SliceSelectEvaluator.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/evaluator/SliceSelectEvaluator.java @@ -46,7 +46,6 @@ public class SliceSelectEvaluator extends AbstractAgentModule.Sub execute(EvaluatorInput evaluatorInput) { - log.debug("切片评估模块开始..."); List preparedSlices = evaluatorInput.getMemorySlices(); List result = new ArrayList<>(); CountDownLatch latch = new CountDownLatch(preparedSlices.size()); @@ -65,7 +64,6 @@ public class SliceSelectEvaluator extends AbstractAgentModule.Sub log.debug("切片评估失败,已跳过当前切片", exception)) .onSuccess(evaluatorBatchResult -> { if (evaluatorBatchResult.isPassed()) { synchronized (result) { @@ -83,7 +81,6 @@ public class SliceSelectEvaluator extends AbstractAgentModule.Sub messages = List.of( resolveContextMessage(), @@ -44,7 +42,7 @@ public class MemorySelectExtractor extends AbstractAgentModule.Sub value, exception -> { ExtractorResult fallback = new ExtractorResult(); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/summarizer/SingleSummarizer.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/summarizer/SingleSummarizer.java index 9cc0034d..48ce4414 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/summarizer/SingleSummarizer.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/summarizer/SingleSummarizer.java @@ -4,7 +4,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.partner.core.action.ActionCapability; import work.slhaf.partner.core.action.ActionCore; -import work.slhaf.partner.framework.agent.exception.ExceptionReporterHandler; import work.slhaf.partner.framework.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule; import work.slhaf.partner.framework.agent.factory.component.annotation.Init; @@ -41,7 +40,7 @@ public class SingleSummarizer extends AbstractAgentModule.Sub, Voi int index = i; executor.execute(() -> { try { - String summarized = chat(List.of(new Message(Message.Character.USER, content))).onFailure(ExceptionReporterHandler.INSTANCE::report).fold( + String summarized = chat(List.of(new Message(Message.Character.USER, content))).fold( res -> res, exp -> content ); diff --git a/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java b/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java index 7dcd7da3..f1233f28 100644 --- a/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java +++ b/Partner-Core/src/test/java/work/slhaf/partner/module/memory/runtime/MemoryRuntimeTest.java @@ -28,7 +28,8 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; class MemoryRuntimeTest { @@ -206,24 +207,14 @@ class MemoryRuntimeTest { } @Test - void shouldThrowMemoryLookupExceptionWhenTopicOrDateIndexDoesNotExist() throws Exception { + void shouldReturnEmptyActivatedMemoryWhenTopicOrDateIndexDoesNotExist() throws Exception { StubMemoryCapability memoryCapability = new StubMemoryCapability("session-test"); MemoryRuntime runtime = new MemoryRuntime(); setField(runtime, "memoryCapability", memoryCapability); setField(runtime, "cognitionCapability", stubCognitionCapability(List.of(message("seed")))); - MemoryLookupException topicException = assertThrows( - MemoryLookupException.class, - () -> runtime.queryActivatedMemoryByTopicPath("topic/missing") - ); - assertEquals("不存在的主题: topic/missing", topicException.getMessage()); - - MemoryLookupException dateException = assertThrows( - MemoryLookupException.class, - () -> runtime.queryActivatedMemoryByDate(LocalDate.parse("1970-01-01")) - ); - assertEquals("不存在的日期索引: 1970-01-01", dateException.getMessage()); - assertInstanceOf(MemoryLookupException.class, dateException); + assertTrue(runtime.queryActivatedMemoryByTopicPath("topic/missing").isEmpty()); + assertTrue(runtime.queryActivatedMemoryByDate(LocalDate.parse("1970-01-01")).isEmpty()); } private static final class StubMemoryCapability implements MemoryCapability { diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/framework/agent/model/ActivateModel.kt b/Partner-Framework/src/main/java/work/slhaf/partner/framework/agent/model/ActivateModel.kt index 5365d256..2e45eb9d 100644 --- a/Partner-Framework/src/main/java/work/slhaf/partner/framework/agent/model/ActivateModel.kt +++ b/Partner-Framework/src/main/java/work/slhaf/partner/framework/agent/model/ActivateModel.kt @@ -1,5 +1,6 @@ package work.slhaf.partner.framework.agent.model +import work.slhaf.partner.framework.agent.exception.ExceptionReporterHandler import work.slhaf.partner.framework.agent.factory.component.abstracts.AbstractAgentModule import work.slhaf.partner.framework.agent.model.pojo.Message import work.slhaf.partner.framework.agent.support.Result @@ -7,18 +8,24 @@ import work.slhaf.partner.framework.agent.support.Result interface ActivateModel { fun chat(messages: List): Result { - return ModelRuntimeRegistry.resolveProvider(modelKey()).chat(mergeMessages(messages)) + return ModelRuntimeRegistry.resolveProvider(modelKey()) + .chat(mergeMessages(messages)) + .onFailure { ExceptionReporterHandler.report(it) } } fun streamChat( messages: List, handler: StreamChatMessageConsumer ): Result { - return ModelRuntimeRegistry.resolveProvider(modelKey()).streamChat(mergeMessages(messages), handler) + return ModelRuntimeRegistry.resolveProvider(modelKey()) + .streamChat(mergeMessages(messages), handler) + .onFailure { ExceptionReporterHandler.report(it) } } fun formattedChat(messages: List, responseType: Class): Result { - return ModelRuntimeRegistry.resolveProvider(modelKey()).formattedChat(mergeMessages(messages), responseType) + return ModelRuntimeRegistry.resolveProvider(modelKey()) + .formattedChat(mergeMessages(messages), responseType) + .onFailure { ExceptionReporterHandler.report(it) } } fun mergeMessages(messages: List): List {