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()