Commit 07d09992d5dfa7527246df78e9a7ea3a1b46c8df

Authored by YunaiV
1 parent d674d68a

fix:【ai 大模型】模型返回异常时,空消息进行删除;取消时,也进行消息存储

yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java
@@ -270,9 +270,29 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { @@ -270,9 +270,29 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
270 }).doOnError(throwable -> { 270 }).doOnError(throwable -> {
271 log.error("[sendChatMessageStream][userId({}) sendReqVO({}) 发生异常]", userId, sendReqVO, throwable); 271 log.error("[sendChatMessageStream][userId({}) sendReqVO({}) 发生异常]", userId, sendReqVO, throwable);
272 // 忽略租户,因为 Flux 异步无法透传租户 272 // 忽略租户,因为 Flux 异步无法透传租户
273 - TenantUtils.executeIgnore(() -> chatMessageMapper.updateById(  
274 - new AiChatMessageDO().setId(assistantMessage.getId()).setContent(throwable.getMessage())  
275 - .setReasoningContent(reasoningContentBuffer.toString()))); 273 + TenantUtils.executeIgnore(() -> {
  274 + // 如果有内容,则更新内容
  275 + if (StrUtil.isNotEmpty(contentBuffer)) {
  276 + chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId())
  277 + .setContent(contentBuffer.toString()).setReasoningContent(reasoningContentBuffer.toString()));
  278 + } else {
  279 + // 否则,则进行删除
  280 + chatMessageMapper.deleteById(assistantMessage.getId());
  281 + }
  282 + });
  283 + }).doOnCancel(() -> {
  284 + log.info("[sendChatMessageStream][userId({}) sendReqVO({}) 取消请求]", userId, sendReqVO);
  285 + // 忽略租户,因为 Flux 异步无法透传租户
  286 + TenantUtils.executeIgnore(() -> {
  287 + // 如果有内容,则更新内容
  288 + if (StrUtil.isNotEmpty(contentBuffer)) {
  289 + chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId())
  290 + .setContent(contentBuffer.toString()).setReasoningContent(reasoningContentBuffer.toString()));
  291 + } else {
  292 + // 否则,则进行删除
  293 + chatMessageMapper.deleteById(assistantMessage.getId());
  294 + }
  295 + });
276 }).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.CHAT_STREAM_ERROR))); 296 }).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.CHAT_STREAM_ERROR)));
277 } 297 }
278 298
yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/TongYiChatModelTests.java
@@ -85,8 +85,8 @@ public class TongYiChatModelTests { @@ -85,8 +85,8 @@ public class TongYiChatModelTests {
85 List<Message> messages = new ArrayList<>(); 85 List<Message> messages = new ArrayList<>();
86 messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); 86 messages.add(new UserMessage("详细分析下,如何设计一个电商系统?"));
87 DashScopeChatOptions options = DashScopeChatOptions.builder() 87 DashScopeChatOptions options = DashScopeChatOptions.builder()
88 -// .withModel("qwen3-235b-a22b-thinking-2507")  
89 - .withModel("qwen-max-2025-01-25") 88 + .withModel("qwen3-235b-a22b-thinking-2507")
  89 +// .withModel("qwen-max-2025-01-25")
90 .withEnableThinking(true) // 必须设置,否则会报错 90 .withEnableThinking(true) // 必须设置,否则会报错
91 .build(); 91 .build();
92 92