feat: add aiops lightweight verifier

This commit is contained in:
aruo
2026-07-05 13:44:30 +08:00
parent 2658742119
commit ed267d753d
15 changed files with 417 additions and 5 deletions
@@ -0,0 +1,56 @@
package com.superbiz.agent.service;
import com.superbiz.agent.domain.entity.ToolInvocation;
import com.superbiz.agent.dto.AIOpsRequest;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
class AiOpsRuleEvaluationServiceTest {
private final AiOpsRuleEvaluationService service = new AiOpsRuleEvaluationService();
@Test
void evaluatePassesWhenReportFocusesPayloadAndHasEvidenceTools() {
AIOpsRequest request = new AIOpsRequest();
request.setAlertName("HighCPUUsage");
request.setService("payment-service");
ToolInvocation invocation = ToolInvocation.builder()
.toolName("lookup_knowledge")
.build();
Map<String, Object> evaluation = service.evaluate(
request,
"HighCPUUsage alert on payment-service was diagnosed using metrics and knowledge evidence.",
List.of(invocation)
);
assertEquals("PASS", evaluation.get("verdict"));
}
@Test
void evaluateWarnsWhenEvidenceToolsAreMissing() {
AIOpsRequest request = new AIOpsRequest();
request.setAlertName("HighCPUUsage");
request.setService("payment-service");
Map<String, Object> evaluation = service.evaluate(
request,
"HighCPUUsage alert on payment-service has a likely resource saturation issue.",
List.of()
);
assertEquals("WARN", evaluation.get("verdict"));
}
@Test
void evaluateFailsWhenReportIsMissing() {
Map<String, Object> evaluation = service.evaluate(null, "too short", List.of());
assertEquals("FAIL", evaluation.get("verdict"));
}
}
@@ -28,6 +28,8 @@ class AiOpsServiceTest {
ReflectionTestUtils.setField(service, "diagnosisSessionRepository", diagnosisSessionRepository);
ReflectionTestUtils.setField(service, "agentStepRepository", agentStepRepository);
ReflectionTestUtils.setField(service, "toolInvocationRepository", toolInvocationRepository);
ReflectionTestUtils.setField(service, "aiOpsRuleEvaluationService", new AiOpsRuleEvaluationService());
ReflectionTestUtils.setField(service, "selfEvaluationMergeService", new SelfEvaluationMergeService());
}
@Test
@@ -145,10 +147,12 @@ class AiOpsServiceTest {
.agentFlow("AI_OPS")
.build();
when(diagnosisSessionRepository.findBySessionId("aiops-session-001")).thenReturn(Optional.of(session));
when(toolInvocationRepository.findBySessionIdOrderByIdAsc("aiops-session-001")).thenReturn(List.of());
service.persistFinalReport("aiops-session-001", "# 告警分析报告");
service.persistFinalReport("aiops-session-001", "# 告警分析报告\nHighCPUUsage payment-service analysis with evidence summary.");
assertEquals("# 告警分析报告", session.getAnswer());
assertEquals("# 告警分析报告\nHighCPUUsage payment-service analysis with evidence summary.", session.getAnswer());
assertTrue(session.getSelfEvaluation().contains("aiops_rule_evaluation"));
verify(diagnosisSessionRepository).save(session);
}
@@ -45,7 +45,7 @@ class DiagnosisTraceServiceTest {
.stepCount(2)
.toolCallCount(1)
.answer("restart payment gateway pool")
.selfEvaluation("{\"verifier_evaluation\":{\"verdict\":\"PASS\"}}")
.selfEvaluation("{\"verifier_evaluation\":{\"verdict\":\"PASS\"},\"aiops_rule_evaluation\":{\"verdict\":\"WARN\"}}")
.feedback("useful")
.createdAt(now)
.updatedAt(now)
@@ -103,6 +103,7 @@ class DiagnosisTraceServiceTest {
assertEquals(1, response.getSummary().getPersistedToolCallCount());
assertEquals(1, response.getSummary().getReturnedToolCallCount());
assertTrue(response.getSummary().isHasVerifierEvaluation());
assertTrue(response.getSummary().isHasAiOpsRuleEvaluation());
assertTrue(response.getSummary().isHasFeedback());
}