Commit 07d09992d5dfa7527246df78e9a7ea3a1b46c8df
1 parent
d674d68a
fix:【ai 大模型】模型返回异常时,空消息进行删除;取消时,也进行消息存储
Showing
2 changed files
with
25 additions
and
5 deletions
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 |