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]
