From 4af8feb1786f94a5242b5b393f206436d7339e89 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Tue, 21 Apr 2026 09:18:49 +0800 Subject: [PATCH] fix(memory): enhance null-safe in memory-related modules --- .../module/memory/runtime/MemoryRuntime.java | 3 ++ .../memory/selector/MemorySelector.java | 3 ++ .../extractor/MemoryRecallCueExtractor.java | 44 ++++++++++++++----- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/runtime/MemoryRuntime.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/runtime/MemoryRuntime.java index b83e178f..8324960f 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/runtime/MemoryRuntime.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/runtime/MemoryRuntime.java @@ -96,6 +96,9 @@ public class MemoryRuntime extends AbstractAgentModule.Standalone implements Sta } public String fixTopicPath(String topicPath) { + if (topicPath == null || topicPath.isBlank()) { + return ""; + } String[] parts = topicPath.split("->"); List cleanedParts = new ArrayList<>(); for (String part : parts) { diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java index 0854ed53..b89b4ef1 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java @@ -155,6 +155,9 @@ public class MemorySelector extends AbstractAgentModule.Running candidates, List matches) { for (ExtractorResult.ExtractorMatchData match : matches) { + if (match == null || match.getType() == null || match.getText() == null || match.getText().isBlank()) { + continue; + } try { List recalledSlices = switch (match.getType()) { case ExtractorResult.ExtractorMatchData.Constant.TOPIC -> diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/extractor/MemoryRecallCueExtractor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/extractor/MemoryRecallCueExtractor.java index f2b9bc07..d0748bdb 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/extractor/MemoryRecallCueExtractor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/extractor/MemoryRecallCueExtractor.java @@ -18,6 +18,7 @@ import work.slhaf.partner.module.memory.selector.extractor.entity.ExtractorInput import work.slhaf.partner.module.memory.selector.extractor.entity.ExtractorResult; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; public class MemoryRecallCueExtractor extends AbstractAgentModule.Sub implements ActivateModel { @@ -155,17 +156,40 @@ public class MemoryRecallCueExtractor extends AbstractAgentModule.Sub { - if (m.getType().equals(ExtractorResult.ExtractorMatchData.Constant.DATE)) { - return; - } - m.setText(memoryRuntime.fixTopicPath(m.getText())); - }); - if (extractorResult.getMatches().isEmpty()) { - return extractorResult; + ExtractorResult safeResult = extractorResult == null ? new ExtractorResult() : extractorResult; + List rawMatches = safeResult.getMatches(); + if (rawMatches == null || rawMatches.isEmpty()) { + safeResult.setMatches(List.of()); + return safeResult; } - extractorResult.getMatches().removeIf(m -> m.getText().split("->")[0].isEmpty()); - return extractorResult; + + List normalizedMatches = new ArrayList<>(); + for (ExtractorResult.ExtractorMatchData match : rawMatches) { + if (match == null) { + continue; + } + String type = match.getType(); + String text = match.getText(); + if (text == null || text.isBlank()) { + continue; + } + + if (ExtractorResult.ExtractorMatchData.Constant.TOPIC.equals(type)) { + text = memoryRuntime.fixTopicPath(text); + if (text.isBlank() || text.split("->")[0].isEmpty()) { + continue; + } + match.setText(text); + normalizedMatches.add(match); + continue; + } + + if (ExtractorResult.ExtractorMatchData.Constant.DATE.equals(type)) { + normalizedMatches.add(match); + } + } + safeResult.setMatches(normalizedMatches); + return safeResult; } @Override