-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Logic <[email protected]> Co-authored-by: tomsun28 <[email protected]>
- Loading branch information
1 parent
1cb293a
commit b4d0e77
Showing
7 changed files
with
317 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,7 +30,12 @@ public enum AiTypeEnum { | |
/** | ||
* alibabaAi | ||
*/ | ||
alibabaAi; | ||
alibabaAi, | ||
|
||
/** | ||
* Moonshot AI | ||
*/ | ||
kimiAi; | ||
|
||
|
||
/** | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiRequestParamDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
|
||
|
||
} | ||
|
||
|
||
|
93 changes: 93 additions & 0 deletions
93
manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/KimiAiResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
|
||
} | ||
|
112 changes: 112 additions & 0 deletions
112
manager/src/main/java/org/apache/hertzbeat/manager/service/KimiAiServiceImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters