This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new d5ac1551 fix: keep active LLM config unchanged when persistence fails 
(#729)
d5ac1551 is described below

commit d5ac15513665ffb9e71b32a7f6e5a1a531a62f91
Author: Rui <[email protected]>
AuthorDate: Mon Aug 3 11:15:09 2026 +0800

    fix: keep active LLM config unchanged when persistence fails (#729)
---
 .../rocketmq/studio/ops/ai/LlmConfigService.java   |  8 +++++---
 .../studio/ops/ai/LlmConfigServiceTest.java        | 23 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigService.java 
b/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigService.java
index 7e488c86..f696a1be 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigService.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigService.java
@@ -80,9 +80,8 @@ public class LlmConfigService {
         if (validation.getStatus() != 0) {
             throw new LlmGatewayException(400, validation.getCode(), 
validation.getErrMsg(), validation.getHint());
         }
-        overrides = copy(normalized);
         GeneralSettingsVO current = settingsService.getGeneralSettings();
-        settingsService.saveGeneralSettings(GeneralSettingsVO.builder()
+        GeneralSettingsVO updated = GeneralSettingsVO.builder()
                 .theme(current.getTheme())
                 .compact(current.isCompact())
                 .desktopNotify(current.isDesktopNotify())
@@ -93,7 +92,10 @@ public class LlmConfigService {
                 .apiKey(normalized.getApiKey())
                 .model(normalized.getModel())
                 .baseUrl(normalized.getApiBase())
-                .build());
+                .build();
+        LlmConfigVO nextOverrides = copy(normalized);
+        settingsService.saveGeneralSettings(updated);
+        overrides = nextOverrides;
     }
 
     public LlmOperationResultVO testConfig(LlmConfigVO config) {
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmConfigServiceTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmConfigServiceTest.java
index 68cdfa93..2b40af91 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmConfigServiceTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmConfigServiceTest.java
@@ -27,6 +27,8 @@ import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -153,6 +155,27 @@ class LlmConfigServiceTest {
         
assertThat(llmConfigService.getConfig().getProvider()).isEqualTo("deepseek");
     }
 
+    @Test
+    void saveConfigShouldKeepCurrentConfigWhenPersistenceFails() {
+        doThrow(new IllegalStateException("persistence failed"))
+                
.when(settingsService).saveGeneralSettings(any(GeneralSettingsVO.class));
+
+        assertThatThrownBy(() -> 
llmConfigService.saveConfig(LlmConfigVO.builder()
+                .provider("deepseek")
+                .apiKey("sk-deepseek")
+                .apiBase("https://api.deepseek.com/v1";)
+                .model("deepseek-chat")
+                .maxTokens(8192)
+                .temperature(0.2)
+                .enabled(true)
+                .build()))
+                .isInstanceOf(IllegalStateException.class)
+                .hasMessage("persistence failed");
+
+        
assertThat(llmConfigService.getConfig().getProvider()).isEqualTo("openai");
+        
assertThat(llmConfigService.getConfig().getModel()).isEqualTo("gpt-4o");
+    }
+
     @Test
     void saveConfigShouldPreserveStoredApiKeyWhenApiKeyIsOmitted() {
         LlmConfigVO config = LlmConfigVO.builder()

Reply via email to