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

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


The following commit(s) were added to refs/heads/master by this push:
     new b4d0e77c9 [feature] : support kimi Ai (#2171)
b4d0e77c9 is described below

commit b4d0e77c994abeca8ffca7b07192434ee1acf31d
Author: linDong <[email protected]>
AuthorDate: Thu Jul 4 07:52:48 2024 +0800

    [feature] : support kimi Ai (#2171)
    
    Co-authored-by: Logic <[email protected]>
    Co-authored-by: tomsun28 <[email protected]>
---
 .../hertzbeat/common/constants/AiConstants.java    |  31 ++++++
 .../hertzbeat/common/constants/AiTypeEnum.java     |   7 +-
 .../manager/controller/MonitorsController.java     |   4 +-
 .../manager/pojo/dto/KimiAiRequestParamDTO.java    |  70 +++++++++++++
 .../hertzbeat/manager/pojo/dto/KimiAiResponse.java |  93 +++++++++++++++++
 .../manager/service/KimiAiServiceImpl.java         | 112 +++++++++++++++++++++
 manager/src/main/resources/application.yml         |   6 +-
 7 files changed, 317 insertions(+), 6 deletions(-)

diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/constants/AiConstants.java 
b/common/src/main/java/org/apache/hertzbeat/common/constants/AiConstants.java
index 621085b06..bf8f08930 100644
--- 
a/common/src/main/java/org/apache/hertzbeat/common/constants/AiConstants.java
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/constants/AiConstants.java
@@ -81,5 +81,36 @@ public interface AiConstants {
         float TEMPERATURE = 0.9f;
 
 
+    }
+
+    /**
+     * Kimi Ai constants
+     */
+    interface KimiAiConstants {
+
+        /**
+         * Kimi Ai URL
+         */
+        String URL = "https://api.moonshot.cn/v1/chat/completions";;
+
+        /**
+         * request role param
+         */
+        String REQUEST_ROLE = "user";
+
+        /**
+         * The model outputs the maximum tokens, with a maximum output of 8192 
and a default value of 1024
+         */
+        Integer MAX_TOKENS = 1024;
+
+        /**
+         * The sampling temperature, which controls the randomness of the 
output, must be positive
+         * The value ranges from 0.0 to 1.0, and cannot be equal to 0. The 
default value is 0.95. The larger the value,
+         * the more random and creative the output will be. The smaller the 
value, the more stable or certain the output will be
+         * You are advised to adjust top_p or temperature parameters based on 
application scenarios, but do not adjust the two parameters at the same time
+         */
+        float TEMPERATURE = 0.9f;
+
+
     }
 }
diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/constants/AiTypeEnum.java 
b/common/src/main/java/org/apache/hertzbeat/common/constants/AiTypeEnum.java
index 87d7fc4d8..6225b2297 100644
--- a/common/src/main/java/org/apache/hertzbeat/common/constants/AiTypeEnum.java
+++ b/common/src/main/java/org/apache/hertzbeat/common/constants/AiTypeEnum.java
@@ -30,7 +30,12 @@ public enum AiTypeEnum {
     /**
      * alibabaAi
      */
-    alibabaAi;
+    alibabaAi,
+
+    /**
+     * Moonshot AI
+     */
+    kimiAi;
 
 
     /**
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/MonitorsController.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/MonitorsController.java
index 9ab7eac97..46e1129b3 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/MonitorsController.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/MonitorsController.java
@@ -160,7 +160,7 @@ public class MonitorsController {
             @Parameter(description = "Monitoring ID List", example = 
"6565463543") @RequestParam(required = false) List<Long> ids
     ) {
         if (ids != null && !ids.isEmpty()) {
-            monitorService.cancelManageMonitors(new HashSet<>(ids));
+            monitorService.deleteMonitors(new HashSet<>(ids));
         }
         Message<Void> message = Message.success();
         return ResponseEntity.ok(message);
@@ -173,7 +173,7 @@ public class MonitorsController {
             @Parameter(description = "Monitoring ID List", example = 
"6565463543") @RequestParam(required = false) List<Long> ids
     ) {
         if (ids != null && !ids.isEmpty()) {
-            monitorService.deleteMonitors(new HashSet<>(ids));
+            monitorService.cancelManageMonitors(new HashSet<>(ids));
         }
         Message<Void> message = Message.success();
         return ResponseEntity.ok(message);
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiRequestParamDTO.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiRequestParamDTO.java
new file mode 100644
index 000000000..29153ad45
--- /dev/null
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiRequestParamDTO.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.manager.pojo.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * zhiPu Request param
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class KimiAiRequestParamDTO {
+
+    /**
+     * ai version
+     */
+    private String model;
+
+    /**
+     * request message
+     */
+    private List<AiMessage> messages;
+
+    /**
+     * The sampling temperature, which controls the randomness of the output, 
must be positive
+     * The value ranges from 0.0 to 1.0, and cannot be equal to 0. The default 
value is 0.95.
+     * The larger the value, the more random and creative the output will be. 
The smaller the value, the more stable or certain the output will be
+     * You are advised to adjust top_p or temperature parameters based on 
application scenarios, but do not adjust the two parameters at the same time
+     */
+    private float temperature;
+
+    /**
+     * The model outputs the maximum tokens, with a maximum output of 8192 and 
a default value of 1024
+     */
+    @JsonProperty("max_tokens")
+    private Integer maxTokens;
+
+    /**
+     * stream response
+     */
+    private Boolean stream = Boolean.FALSE;
+
+
+}
+
+
+
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiResponse.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiResponse.java
new file mode 100644
index 000000000..58458565d
--- /dev/null
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiResponse.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.manager.pojo.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * ZhiPuAiResponse
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class KimiAiResponse {
+
+    /**
+     * Task order number generated by the AI open platform. Use this order 
number when invoking the request result interface
+     */
+    private String id;
+
+    /**
+     * The request creation time is a Unix timestamp in seconds
+     */
+    private Long created;
+
+    /**
+     * response message
+     */
+    private List<Choice> choices;
+
+    /**
+     * Returns the number of tokens invoked by the model at the end.
+     */
+    private Tokens usage;
+
+    /**
+     * Choice
+     */
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public class Choice {
+        private int index;
+        private AiMessage delta;
+    }
+
+    /**
+     * Tokens
+     */
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public class Tokens {
+
+        /**
+         * The number of tokens entered by users
+         */
+        @JsonProperty("prompt_tokens")
+        private Integer promptTokens;
+
+        /**
+         * The number of tokens that the model outputs
+         */
+        @JsonProperty("completion_tokens")
+        private Integer completionTokens;
+
+        /**
+         * Total number of tokens
+         */
+        @JsonProperty("total_tokens")
+        private Integer totalTokens;
+    }
+
+}
+
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/KimiAiServiceImpl.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/KimiAiServiceImpl.java
new file mode 100644
index 000000000..318204872
--- /dev/null
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/KimiAiServiceImpl.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.manager.service;
+
+import com.alibaba.fastjson.JSON;
+import java.util.List;
+import java.util.Objects;
+import javax.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.hertzbeat.common.constants.AiConstants;
+import org.apache.hertzbeat.common.constants.AiTypeEnum;
+import org.apache.hertzbeat.manager.pojo.dto.AiMessage;
+import org.apache.hertzbeat.manager.pojo.dto.KimiAiRequestParamDTO;
+import org.apache.hertzbeat.manager.pojo.dto.KimiAiResponse;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.ExchangeStrategies;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Flux;
+
+/**
+ * Kimi Ai
+ */
+@Service("KimiAiServiceImpl")
+@Slf4j
+public class KimiAiServiceImpl implements AiService {
+
+    @Value("${aiConfig.model:moonshot-v1-8k}")
+    private String model;
+
+    @Value("${aiConfig.api-key}")
+    private String apiKey;
+
+    private WebClient webClient;
+
+    @PostConstruct
+    private void init() {
+        this.webClient = WebClient.builder()
+                .baseUrl(AiConstants.KimiAiConstants.URL)
+                .defaultHeader(HttpHeaders.CONTENT_TYPE, 
MediaType.APPLICATION_JSON_VALUE)
+                .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey)
+                .exchangeStrategies(ExchangeStrategies.builder()
+                        .codecs(item -> 
item.defaultCodecs().maxInMemorySize(16 * 1024 * 1024))
+                        .build())
+                .build();
+    }
+
+    @Override
+    public AiTypeEnum getType() {
+        return AiTypeEnum.kimiAi;
+    }
+
+    @Override
+    public Flux<String> requestAi(String text) {
+
+        checkParam(text, apiKey);
+        KimiAiRequestParamDTO zhiPuRequestParamDTO = 
KimiAiRequestParamDTO.builder()
+                .model(model)
+                .stream(Boolean.TRUE)
+                .maxTokens(AiConstants.KimiAiConstants.MAX_TOKENS)
+                .temperature(AiConstants.KimiAiConstants.TEMPERATURE)
+                .messages(List.of(new 
AiMessage(AiConstants.KimiAiConstants.REQUEST_ROLE, text)))
+                .build();
+
+
+        return webClient.post()
+                .body(BodyInserters.fromValue(zhiPuRequestParamDTO))
+                .retrieve()
+                .bodyToFlux(String.class)
+                .filter(aiResponse -> !"[DONE]".equals(aiResponse))
+                .map(this::convertToResponse)
+                .doOnError(error -> log.info("AiResponse Exception:{}", 
error.toString()));
+
+    }
+
+    private String convertToResponse(String aiRes) {
+        try {
+            KimiAiResponse kimiAiResponse = JSON.parseObject(aiRes, 
KimiAiResponse.class);
+            if (Objects.nonNull(kimiAiResponse)) {
+                KimiAiResponse.Choice choice = 
kimiAiResponse.getChoices().get(0);
+                return choice.getDelta().getContent();
+            }
+        } catch (Exception e) {
+            log.info("convertToResponse Exception:{}", e.toString());
+        }
+        return "";
+    }
+
+    private void checkParam(String param, String apiKey) {
+        Assert.notNull(param, "text is null");
+        Assert.notNull(apiKey, "aiConfig.api-key is null");
+    }
+}
diff --git a/manager/src/main/resources/application.yml 
b/manager/src/main/resources/application.yml
index c1089081d..90d6e43e7 100644
--- a/manager/src/main/resources/application.yml
+++ b/manager/src/main/resources/application.yml
@@ -203,9 +203,9 @@ scheduler:
 # AI config
 # See the documentation for details : 
https://hertzbeat.apache.org/zh-cn/docs/help/aiConfig
 aiConfig:
-  # AI Type:zhiPu、alibabaAi
+  # AI Type:zhiPu、alibabaAi、kimiAi
   type:
-  # Model name:glm-4、qwen-turbo
-  model:
+  # Model name:glm-4、qwen-turbo、moonshot-v1-8k
+  model: glm-4
   # api key
   api-key:
\ No newline at end of file


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

Reply via email to