package com.superbiz.agent.service; import com.superbiz.agent.dto.ContextPack; import com.superbiz.agent.dto.EvidencePostprocessResult; import com.superbiz.agent.dto.LookupResult; import com.superbiz.agent.dto.RetrievalTrace; import org.springframework.stereotype.Service; import java.util.List; /** * Assembles evidence-first LookupResult instances. */ @Service public class LookupResultAssembler { public LookupResult assemble(EvidencePostprocessResult evidence, ContextPack contextPack, RetrievalTrace retrievalTrace) { boolean found = evidence != null && evidence.hasUsableEvidence(); return LookupResult.builder() .found(found) .evidenceBlocks(evidence != null ? evidence.getEvidenceBlocks() : List.of()) .evidenceCandidateCount(evidence != null ? evidence.getCandidateCount() : 0) .evidenceBlockCount(evidence != null ? evidence.getEvidenceBlockCount() : 0) .contextPack(contextPack) .retrievalTrace(retrievalTrace) .rerankTrace(evidence != null ? evidence.getRerankTrace() : null) .relevanceLevel(evidence != null ? evidence.getRelevanceLevel() : null) .completenessHint(evidence != null ? evidence.getCompletenessHint() : null) .message(found ? null : "知识库未检索到可用证据,请结合日志、指标、告警继续排查") .build(); } public LookupResult deduped(LookupResult original, List retrievedDomains, String docKey) { return LookupResult.builder() .found(false) .message("文档已在本会话中检索过,无需重复召回: " + docKey) .evidenceBlocks(List.of()) .evidenceCandidateCount(0) .evidenceBlockCount(0) .retrievalTrace(original.getRetrievalTrace()) .rerankTrace(original.getRerankTrace()) .relevanceLevel(original.getRelevanceLevel()) .completenessHint(original.getCompletenessHint()) .retrievedDomainsThisSession(retrievedDomains) .build(); } }