feat(trace): bind feedback to runs
This commit is contained in:
@@ -16,7 +16,11 @@ public class FeedbackController {
|
||||
|
||||
@PostMapping("/feedback")
|
||||
public ResponseEntity<FeedbackResponse> submitFeedback(@RequestBody FeedbackRequest request) {
|
||||
FeedbackResponse response = feedbackService.submitFeedback(request.getSessionId(), request.getFeedback());
|
||||
FeedbackResponse response = feedbackService.submitFeedback(
|
||||
request.getSessionId(),
|
||||
request.getRunId(),
|
||||
request.getFeedback()
|
||||
);
|
||||
if (!response.isSuccess()) {
|
||||
return ResponseEntity.badRequest().body(response);
|
||||
}
|
||||
|
||||
@@ -7,5 +7,6 @@ import lombok.Setter;
|
||||
@Setter
|
||||
public class FeedbackRequest {
|
||||
private String sessionId;
|
||||
private String runId;
|
||||
private String feedback;
|
||||
}
|
||||
|
||||
@@ -9,4 +9,6 @@ public class FeedbackResponse {
|
||||
private boolean success;
|
||||
private String message;
|
||||
private String caseId;
|
||||
private String runId;
|
||||
private boolean fallbackToLatestRun;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.superbiz.agent.service;
|
||||
|
||||
import com.superbiz.agent.domain.entity.CaseLibrary;
|
||||
import com.superbiz.agent.domain.entity.DiagnosisRun;
|
||||
import com.superbiz.agent.domain.entity.DiagnosisSession;
|
||||
import com.superbiz.agent.domain.enums.FaultCategory;
|
||||
import com.superbiz.agent.domain.enums.SourceType;
|
||||
@@ -20,22 +21,31 @@ public class CaseLibraryService {
|
||||
@Autowired
|
||||
private CaseLibraryRepository caseLibraryRepository;
|
||||
|
||||
public CaseLibrary createFromRun(DiagnosisRun run) {
|
||||
return createFromSource(run.getRunId(), run.getQuery(), run.getAnswer(), "runId=" + run.getRunId());
|
||||
}
|
||||
|
||||
public CaseLibrary createFromSession(DiagnosisSession session) {
|
||||
return caseLibraryRepository.findByDiagnosisId(session.getSessionId())
|
||||
return createFromSource(session.getSessionId(), session.getQuery(), session.getAnswer(),
|
||||
"sessionId=" + session.getSessionId());
|
||||
}
|
||||
|
||||
private CaseLibrary createFromSource(String diagnosisId, String query, String answer, String logContext) {
|
||||
return caseLibraryRepository.findByDiagnosisId(diagnosisId)
|
||||
.orElseGet(() -> {
|
||||
String content = session.getAnswer();
|
||||
String content = answer;
|
||||
if (content == null || content.isBlank()) {
|
||||
content = session.getQuery() + "\n(自动提取失败,请人工补充)";
|
||||
content = query + "\n(自动提取失败,请人工补充)";
|
||||
}
|
||||
|
||||
String title = session.getQuery();
|
||||
String title = query;
|
||||
if (title.length() > 100) {
|
||||
title = title.substring(0, 100);
|
||||
}
|
||||
|
||||
CaseLibrary caseLibrary = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.diagnosisId(session.getSessionId())
|
||||
.diagnosisId(diagnosisId)
|
||||
.sourceType(SourceType.AUTO)
|
||||
.faultCategory(FaultCategory.GENERAL)
|
||||
.title(title)
|
||||
@@ -46,7 +56,7 @@ public class CaseLibraryService {
|
||||
.build();
|
||||
|
||||
CaseLibrary saved = caseLibraryRepository.save(caseLibrary);
|
||||
logger.info("案例已沉淀: caseId={}, sessionId={}", saved.getCaseId(), session.getSessionId());
|
||||
logger.info("案例已沉淀: caseId={}, {}", saved.getCaseId(), logContext);
|
||||
return saved;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package com.superbiz.agent.service;
|
||||
|
||||
import com.superbiz.agent.domain.entity.DiagnosisRun;
|
||||
import com.superbiz.agent.domain.entity.DiagnosisSession;
|
||||
import com.superbiz.agent.dto.FeedbackResponse;
|
||||
import com.superbiz.agent.repository.DiagnosisRunRepository;
|
||||
import com.superbiz.agent.repository.DiagnosisSessionRepository;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -19,20 +21,81 @@ public class FeedbackService {
|
||||
@Autowired
|
||||
private DiagnosisSessionRepository diagnosisSessionRepository;
|
||||
|
||||
@Autowired
|
||||
private DiagnosisRunRepository diagnosisRunRepository;
|
||||
|
||||
@Autowired
|
||||
private CaseLibraryService caseLibraryService;
|
||||
|
||||
public FeedbackResponse submitFeedback(String sessionId, String feedback) {
|
||||
return submitFeedback(sessionId, null, feedback);
|
||||
}
|
||||
|
||||
public FeedbackResponse submitFeedback(String sessionId, String runId, String feedback) {
|
||||
if (sessionId == null || sessionId.isBlank()) {
|
||||
return FeedbackResponse.builder().success(false).message("sessionId 不能为空").build();
|
||||
}
|
||||
if (!FEEDBACK_USEFUL.equals(feedback) && !FEEDBACK_NOT_USEFUL.equals(feedback)) {
|
||||
return FeedbackResponse.builder().success(false)
|
||||
.message("feedback 只能是 useful 或 not_useful").build();
|
||||
return FeedbackResponse.builder()
|
||||
.success(false)
|
||||
.message("feedback 只能是 useful 或 not_useful")
|
||||
.build();
|
||||
}
|
||||
|
||||
DiagnosisSession session = diagnosisSessionRepository.findBySessionId(sessionId)
|
||||
.orElse(null);
|
||||
if (runId != null && !runId.isBlank()) {
|
||||
return submitRunFeedback(sessionId, runId, feedback, false);
|
||||
}
|
||||
|
||||
return diagnosisRunRepository.findFirstBySessionIdOrderByCreatedAtDescIdDesc(sessionId)
|
||||
.map(run -> submitRunFeedback(sessionId, run.getRunId(), feedback, true))
|
||||
.orElseGet(() -> submitLegacySessionFeedback(sessionId, feedback));
|
||||
}
|
||||
|
||||
private FeedbackResponse submitRunFeedback(String sessionId,
|
||||
String runId,
|
||||
String feedback,
|
||||
boolean fallbackToLatestRun) {
|
||||
DiagnosisRun run = diagnosisRunRepository.findBySessionIdAndRunId(sessionId, runId).orElse(null);
|
||||
if (run == null) {
|
||||
if (diagnosisRunRepository.findByRunId(runId).isPresent()) {
|
||||
return FeedbackResponse.builder()
|
||||
.success(false)
|
||||
.message("runId does not belong to sessionId")
|
||||
.runId(runId)
|
||||
.fallbackToLatestRun(fallbackToLatestRun)
|
||||
.build();
|
||||
}
|
||||
return FeedbackResponse.builder()
|
||||
.success(false)
|
||||
.message("run 不存在")
|
||||
.runId(runId)
|
||||
.fallbackToLatestRun(fallbackToLatestRun)
|
||||
.build();
|
||||
}
|
||||
|
||||
run.setFeedback(feedback);
|
||||
|
||||
String caseId = null;
|
||||
if (FEEDBACK_USEFUL.equals(feedback)) {
|
||||
var caseLibrary = caseLibraryService.createFromRun(run);
|
||||
caseId = caseLibrary.getCaseId();
|
||||
}
|
||||
|
||||
diagnosisRunRepository.save(run);
|
||||
logger.info("反馈已记录: sessionId={}, runId={}, feedback={}, fallbackToLatestRun={}, caseId={}",
|
||||
sessionId, runId, feedback, fallbackToLatestRun, caseId);
|
||||
|
||||
return FeedbackResponse.builder()
|
||||
.success(true)
|
||||
.message("反馈已记录")
|
||||
.caseId(caseId)
|
||||
.runId(runId)
|
||||
.fallbackToLatestRun(fallbackToLatestRun)
|
||||
.build();
|
||||
}
|
||||
|
||||
private FeedbackResponse submitLegacySessionFeedback(String sessionId, String feedback) {
|
||||
DiagnosisSession session = diagnosisSessionRepository.findBySessionId(sessionId).orElse(null);
|
||||
if (session == null) {
|
||||
return FeedbackResponse.builder().success(false).message("会话不存在").build();
|
||||
}
|
||||
@@ -46,12 +109,13 @@ public class FeedbackService {
|
||||
}
|
||||
|
||||
diagnosisSessionRepository.save(session);
|
||||
logger.info("反馈已记录: sessionId={}, feedback={}, caseId={}", sessionId, feedback, caseId);
|
||||
logger.info("历史反馈已记录: sessionId={}, feedback={}, caseId={}", sessionId, feedback, caseId);
|
||||
|
||||
return FeedbackResponse.builder()
|
||||
.success(true)
|
||||
.message("反馈已记录")
|
||||
.caseId(caseId)
|
||||
.fallbackToLatestRun(false)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user