ai对话错误信息处理

This commit is contained in:
liu.zixi
2025-11-07 14:46:23 +08:00
committed by joshen
parent ce84ea8121
commit db73753c1f

View File

@@ -106,8 +106,18 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
@Override @Override
@Transactional @Transactional
public SseEmitter chat(CaseAiChatDto caseAiChatDto, CurrentUser currentUser) { public SseEmitter chat(CaseAiChatDto caseAiChatDto, CurrentUser currentUser) {
// 创建SSE响应器
SseEmitter sseEmitter = new SseEmitter();
// 1. 获取conversationId // 1. 获取conversationId
String conversationId = getOrCreateConversationId(caseAiChatDto, currentUser); String conversationId;
try {
conversationId = getOrCreateConversationId(caseAiChatDto, currentUser);
} catch (Exception e) {
log.error("获取会话ID失败", e);
errMessage(sseEmitter, "服务繁忙,请稍后再试。");
sseEmitter.complete();
return sseEmitter;
}
// 2. 查询历史 // 2. 查询历史
List<CaseAiMessageVo> historyMessages = elasticSearchIndexService.queryData(conversationId); List<CaseAiMessageVo> historyMessages = elasticSearchIndexService.queryData(conversationId);
@@ -141,7 +151,15 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
log.info("案例问答接口请求参数: [{}]", chatParamStr); log.info("案例问答接口请求参数: [{}]", chatParamStr);
// 4. 设置请求头 // 4. 设置请求头
String accessToken = aiAccessTokenService.getAccessToken(); String accessToken;
try {
accessToken = aiAccessTokenService.getAccessToken();
} catch (Exception e) {
log.error("获取access_token失败", e);
errMessage(sseEmitter, "服务繁忙,请稍后再试。");
sseEmitter.complete();
return sseEmitter;
}
String apiCode = caseAiProperties.getChatApiCode(); String apiCode = caseAiProperties.getChatApiCode();
Request.Builder builder = new Request.Builder(); Request.Builder builder = new Request.Builder();
builder.url(caseAiProperties.getBaseUrl() + "/apigateway/chat/knowledge/v1/chat/completions"); builder.url(caseAiProperties.getBaseUrl() + "/apigateway/chat/knowledge/v1/chat/completions");
@@ -150,9 +168,7 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
RequestBody bodyRequestBody = RequestBody.create(chatParamStr, MediaType.parse("application/json")); RequestBody bodyRequestBody = RequestBody.create(chatParamStr, MediaType.parse("application/json"));
builder.post(bodyRequestBody); builder.post(bodyRequestBody);
Request request = builder.build(); Request request = builder.build();
// 5. 创建SSE响应器
SseEmitter sseEmitter = new SseEmitter();
// 6. 用于收集对话数据的容器 // 6. 用于收集对话数据的容器
AiChatConversationData conversationData = new AiChatConversationData(); AiChatConversationData conversationData = new AiChatConversationData();
@@ -188,30 +204,28 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
if (status != null) { if (status != null) {
CaseAiChatStatusEnum statusEnum = CaseAiChatStatusEnum.getByCode(status); CaseAiChatStatusEnum statusEnum = CaseAiChatStatusEnum.getByCode(status);
switch (statusEnum) { if (statusEnum == CaseAiChatStatusEnum.REFERS) { // 返回引用文件
case REFERS: // 返回引用文件 // 处理文件引用并构建返给前端的数据
// 处理文件引用并构建返给前端的数据 JSONObject modifiedData = handleFileReferAndBuildResponse(responseData, conversationData);
JSONObject modifiedData = handleFileReferAndBuildResponse(responseData, conversationData); if (modifiedData != null) {
if (modifiedData != null) { // 发送修改后的数据给前端
// 发送修改后的数据给前端 sseEmitter.send(modifiedData.toJSONString());
sseEmitter.send(modifiedData.toJSONString()); return; // 早期返回,不发送原始数据
return; // 早期返回,不发送原始数据 }
} } else if (statusEnum == CaseAiChatStatusEnum.CHAT) { // 流式对话中
break; String content = responseData.getString("content");
case CHAT: // 流式对话中 if (content != null) {
String content = responseData.getString("content"); conversationData.appendAnswer(content);
if (content != null) { }
conversationData.appendAnswer(content); } else if (statusEnum == CaseAiChatStatusEnum.SUGGESTIONS) { // 返回建议
} handleSuggestions(responseData, conversationData);
break; } else if (statusEnum == CaseAiChatStatusEnum.CHAT_COMPLETED || statusEnum == CaseAiChatStatusEnum.API_COMPLETED) { // 接口交互完成
case SUGGESTIONS: // 返回建议 // 不做特殊处理
handleSuggestions(responseData, conversationData); } else {
break; // 异常问题取message内容
case CHAT_COMPLETED: String message = jsonData.getString("message");
case API_COMPLETED: // 接口交互完成 errMessage(sseEmitter, message);
default: return;
// 不做特殊处理
break;
} }
} }
sseEmitter.send(responseData.toJSONString()); sseEmitter.send(responseData.toJSONString());
@@ -237,7 +251,7 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
// 如果是 content-type 错误,尝试作为普通 HTTP 请求处理 // 如果是 content-type 错误,尝试作为普通 HTTP 请求处理
if (e instanceof IllegalStateException && e.getMessage() != null && e.getMessage().contains("Invalid content-type")) { if (e instanceof IllegalStateException && e.getMessage() != null && e.getMessage().contains("Invalid content-type")) {
log.warn("服务器返回的 Content-Type 不是 text/event-stream尝试作为普通 HTTP 请求处理"); log.warn("服务器返回的 Content-Type 不是 text/event-stream尝试作为普通 HTTP 请求处理");
CaseAiChatServiceImpl.this.handleAsRegularHttpRequest(request, sseEmitter, conversationData); handleAsRegularHttpRequest(request, sseEmitter, conversationData);
return; return;
} }
@@ -694,4 +708,16 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
sseEmitter.completeWithError(e); sseEmitter.completeWithError(e);
} }
} }
private void errMessage(SseEmitter sseEmitter, String message) {
JSONObject jsonData = new JSONObject();
jsonData.put("status", 1);
jsonData.put("content", message);
try {
sseEmitter.send(jsonData.toJSONString());
} catch (IOException e) {
log.error("发送错误信息异常", e);
sseEmitter.completeWithError(e);
}
}
} }