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

gongchao pushed a commit to branch ai-enhance
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git

commit 592628468faff9494fe2eb456565d0a1c993c529
Author: tomsun28 <[email protected]>
AuthorDate: Wed Oct 22 22:29:38 2025 +0800

    [chore] refactor ai service
    
    Signed-off-by: tomsun28 <[email protected]>
---
 .../hertzbeat/ai/agent/config/LlmConfig.java       |  2 +-
 .../ai/agent/service/AiConfigService.java          | 12 ----------
 .../agent/service/ChatClientProviderService.java   |  8 ++++++-
 .../ai/agent/service/impl/AiConfigServiceImpl.java | 28 ----------------------
 .../impl/ChatClientProviderServiceImpl.java        | 18 ++++++++++++--
 .../service/impl/ConversationServiceImpl.java      |  9 +++----
 .../event/AiProviderConfigChangeEvent.java         |  2 +-
 .../impl/ModelProviderConfigServiceImpl.java       | 14 +++++++++--
 web-app/src/app/pojo/ModelProviderConfig.ts        |  2 +-
 .../shared/components/ai-chat/chat.component.ts    |  1 +
 10 files changed, 42 insertions(+), 54 deletions(-)

diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/config/LlmConfig.java
 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/config/LlmConfig.java
index ff3b2742a..1048fcfbc 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/config/LlmConfig.java
+++ 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/config/LlmConfig.java
@@ -19,7 +19,7 @@
 package org.apache.hertzbeat.ai.agent.config;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.hertzbeat.ai.agent.event.AiProviderConfigChangeEvent;
+import org.apache.hertzbeat.common.support.event.AiProviderConfigChangeEvent;
 import org.apache.hertzbeat.ai.agent.pojo.dto.ModelProviderConfig;
 import org.apache.hertzbeat.base.dao.GeneralConfigDao;
 import org.apache.hertzbeat.common.entity.manager.GeneralConfig;
diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/AiConfigService.java
 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/AiConfigService.java
index ad379ba2b..796c46986 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/AiConfigService.java
+++ 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/AiConfigService.java
@@ -22,12 +22,6 @@ package org.apache.hertzbeat.ai.agent.service;
  */
 public interface AiConfigService {
 
-    /**
-     * Check if OpenAI is properly configured
-     * @return true if configured and enabled
-     */
-    boolean isConfigured();
-
     /**
      * Validate OpenAI API key by calling the OpenAI API
      * @param apiKey the API key to validate
@@ -35,12 +29,6 @@ public interface AiConfigService {
      */
     ValidationResult validateApiKey(String apiKey);
 
-    /**
-     * Force reload of OpenAI configuration cache
-     * This method is typically called when configuration changes
-     */
-    void reloadConfig();
-
     /**
      * Validation result class
      */
diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/ChatClientProviderService.java
 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/ChatClientProviderService.java
index 2f65fb4a2..4b6de16f1 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/ChatClientProviderService.java
+++ 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/ChatClientProviderService.java
@@ -33,4 +33,10 @@ public interface ChatClientProviderService {
      * @return Flux of string chunks from the LLM response
      */
     Flux<String> streamChat(ChatRequestContext context);
-}
\ No newline at end of file
+
+    /**
+     * Check if provider is properly configured
+     * @return true if configured and enabled
+     */
+    boolean isConfigured();
+}
diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/AiConfigServiceImpl.java
 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/AiConfigServiceImpl.java
index 2f4ee7c4d..1c4031a68 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/AiConfigServiceImpl.java
+++ 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/AiConfigServiceImpl.java
@@ -18,13 +18,8 @@
 package org.apache.hertzbeat.ai.agent.service.impl;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.hertzbeat.ai.agent.event.AiProviderConfigChangeEvent;
-import org.apache.hertzbeat.ai.agent.pojo.dto.ModelProviderConfig;
 import org.apache.hertzbeat.ai.agent.service.AiConfigService;
 import org.apache.hertzbeat.base.dao.GeneralConfigDao;
-import org.apache.hertzbeat.common.entity.manager.GeneralConfig;
-import org.apache.hertzbeat.common.util.JsonUtil;
-import org.springframework.context.event.EventListener;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
@@ -51,13 +46,6 @@ public class AiConfigServiceImpl implements AiConfigService {
         this.generalConfigDao = generalConfigDao;
     }
 
-    @Override
-    public boolean isConfigured() {
-        GeneralConfig providerConfig = generalConfigDao.findByType("provider");
-        ModelProviderConfig modelProviderConfig = 
JsonUtil.fromJson(providerConfig.getContent(), ModelProviderConfig.class);
-        return modelProviderConfig != null && modelProviderConfig.isStatus();
-    }
-
     @Override
     public ValidationResult validateApiKey(String apiKey) {
         if (!StringUtils.hasText(apiKey)) {
@@ -109,20 +97,4 @@ public class AiConfigServiceImpl implements AiConfigService 
{
             }
         }
     }
-
-    @Override
-    public void reloadConfig() {
-        synchronized (this) {
-            
-        }
-    }
-
-    /**
-     * OpenAI configuration change event listener
-     */
-    @EventListener(AiProviderConfigChangeEvent.class)
-    public void onAiProviderConfigChange(AiProviderConfigChangeEvent event) {
-        log.info("Provider configuration change event received");
-        reloadConfig();
-    }
 }
diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ChatClientProviderServiceImpl.java
 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ChatClientProviderServiceImpl.java
index 933334df9..5ab4af2d9 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ChatClientProviderServiceImpl.java
+++ 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ChatClientProviderServiceImpl.java
@@ -21,7 +21,11 @@ package org.apache.hertzbeat.ai.agent.service.impl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.hertzbeat.ai.agent.config.PromptProvider;
 import org.apache.hertzbeat.ai.agent.pojo.dto.MessageDto;
+import org.apache.hertzbeat.ai.agent.pojo.dto.ModelProviderConfig;
 import org.apache.hertzbeat.ai.agent.service.ChatClientProviderService;
+import org.apache.hertzbeat.base.dao.GeneralConfigDao;
+import org.apache.hertzbeat.common.entity.manager.GeneralConfig;
+import org.apache.hertzbeat.common.util.JsonUtil;
 import org.springframework.stereotype.Service;
 import org.apache.hertzbeat.ai.agent.pojo.dto.ChatRequestContext;
 import org.springframework.ai.chat.client.ChatClient;
@@ -48,13 +52,16 @@ public class ChatClientProviderServiceImpl implements 
ChatClientProviderService
 
     private final ApplicationContext applicationContext;
 
+    private final GeneralConfigDao generalConfigDao;
+
     @Qualifier("hertzbeatTools")
     @Autowired
     private ToolCallbackProvider toolCallbackProvider;
 
     @Autowired
-    public ChatClientProviderServiceImpl(ApplicationContext 
applicationContext) {
+    public ChatClientProviderServiceImpl(ApplicationContext 
applicationContext, GeneralConfigDao generalConfigDao) {
         this.applicationContext = applicationContext;
+        this.generalConfigDao = generalConfigDao;
     }
 
     public String complete(String message) {
@@ -102,4 +109,11 @@ public class ChatClientProviderServiceImpl implements 
ChatClientProviderService
             return Flux.error(e);
         }
     }
-}
\ No newline at end of file
+
+    @Override
+    public boolean isConfigured() {
+        GeneralConfig providerConfig = generalConfigDao.findByType("provider");
+        ModelProviderConfig modelProviderConfig = 
JsonUtil.fromJson(providerConfig.getContent(), ModelProviderConfig.class);
+        return modelProviderConfig != null && modelProviderConfig.isStatus();
+    }
+}
diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ConversationServiceImpl.java
 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ConversationServiceImpl.java
index 534435e28..d0764a485 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ConversationServiceImpl.java
+++ 
b/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/service/impl/ConversationServiceImpl.java
@@ -51,10 +51,7 @@ public class ConversationServiceImpl implements 
ConversationService {
 
     @Autowired
     private ChatClientProviderService chatClientProviderService;
-
-    @Autowired
-    private AiConfigService openAiConfigService;
-
+    
     @Override
     public ConversationDto createConversation() {
         String conversationId = createNewConversation();
@@ -75,10 +72,10 @@ public class ConversationServiceImpl implements 
ConversationService {
         }
 
         // Check if OpenAI is properly configured
-        if (!openAiConfigService.isConfigured()) {
+        if (!chatClientProviderService.isConfigured()) {
             ChatResponseDto errorResponse = ChatResponseDto.builder()
                     .conversationId(conversationId)
-                    .response("Provider is not configured. Please configure 
your OpenAI API key in the settings or application.yml file.")
+                    .response("Provider is not configured. Please configure 
your AI Provider.")
                     .build();
             return Flux.just(ServerSentEvent.builder(errorResponse)
                     .event("error")
diff --git 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/event/AiProviderConfigChangeEvent.java
 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/support/event/AiProviderConfigChangeEvent.java
similarity index 95%
rename from 
hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/event/AiProviderConfigChangeEvent.java
rename to 
hertzbeat-common/src/main/java/org/apache/hertzbeat/common/support/event/AiProviderConfigChangeEvent.java
index 410b57da9..f539fb7d6 100644
--- 
a/hertzbeat-ai-agent/src/main/java/org/apache/hertzbeat/ai/agent/event/AiProviderConfigChangeEvent.java
+++ 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/support/event/AiProviderConfigChangeEvent.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.hertzbeat.ai.agent.event;
+package org.apache.hertzbeat.common.support.event;
 
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationEvent;
diff --git 
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/ModelProviderConfigServiceImpl.java
 
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/ModelProviderConfigServiceImpl.java
index e5755a1af..82c637e36 100644
--- 
a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/ModelProviderConfigServiceImpl.java
+++ 
b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/ModelProviderConfigServiceImpl.java
@@ -23,6 +23,8 @@ import java.lang.reflect.Type;
 import org.apache.hertzbeat.ai.agent.pojo.dto.ModelProviderConfig;
 import org.apache.hertzbeat.base.dao.GeneralConfigDao;
 import org.apache.hertzbeat.common.constants.GeneralConfigTypeEnum;
+import org.apache.hertzbeat.common.support.event.AiProviderConfigChangeEvent;
+import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 
 /**
@@ -31,6 +33,8 @@ import org.springframework.stereotype.Service;
 @Service
 public class ModelProviderConfigServiceImpl extends 
AbstractGeneralConfigServiceImpl<ModelProviderConfig> {
 
+    private final ApplicationContext applicationContext;
+    
     /**
      *
      * <p>Constructor, passing in GeneralConfigDao, ObjectMapper and type.</p>
@@ -38,15 +42,21 @@ public class ModelProviderConfigServiceImpl extends 
AbstractGeneralConfigService
      * @param generalConfigDao ConfigDao object
      * @param objectMapper     JSON tool object
      */
-    public ModelProviderConfigServiceImpl(GeneralConfigDao generalConfigDao, 
ObjectMapper objectMapper) {
+    public ModelProviderConfigServiceImpl(ApplicationContext 
applicationContext, GeneralConfigDao generalConfigDao, ObjectMapper 
objectMapper) {
         super(generalConfigDao, objectMapper);
+        this.applicationContext = applicationContext;
     }
     
     @Override
     public String type() {
         return GeneralConfigTypeEnum.provider.name();
     }
-    
+
+    @Override
+    public void handler(ModelProviderConfig config) {
+        applicationContext.publishEvent(new 
AiProviderConfigChangeEvent(applicationContext));
+    }
+
     @Override
     public TypeReference<ModelProviderConfig> getTypeReference() {
         return new TypeReference<>() {
diff --git a/web-app/src/app/pojo/ModelProviderConfig.ts 
b/web-app/src/app/pojo/ModelProviderConfig.ts
index 93879d934..dba2fba6e 100644
--- a/web-app/src/app/pojo/ModelProviderConfig.ts
+++ b/web-app/src/app/pojo/ModelProviderConfig.ts
@@ -19,7 +19,7 @@
 
 export class ModelProviderConfig {
   enable: boolean = false;
-  status: boolean = false;
+  status: boolean = true;
   error!: string;
   type!: string;
   code: string = 'openai';
diff --git a/web-app/src/app/shared/components/ai-chat/chat.component.ts 
b/web-app/src/app/shared/components/ai-chat/chat.component.ts
index 1c4ed5eac..068a0a7ba 100644
--- a/web-app/src/app/shared/components/ai-chat/chat.component.ts
+++ b/web-app/src/app/shared/components/ai-chat/chat.component.ts
@@ -547,6 +547,7 @@ export class ChatComponent implements OnInit, 
AfterViewChecked {
 
     // Always enable when saving an API key
     this.aiProviderConfig.enable = true;
+    this.aiProviderConfig.status = true;
 
     this.configLoading = true;
     this.message.info('Validating API key...', { nzDuration: 2000 });


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to