ruoyi-admin/src/main/resources/application.yml
@@ -226,7 +226,7 @@ # æ é¢ title: 'æ é¢ï¼RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»_æ¥å£ææ¡£' # æè¿° description: 'æè¿°ï¼ç¨äºç®¡çé墿ä¸å ¬å¸ç人åä¿¡æ¯,å ·ä½å æ¬XXX,XXX模å...' description: ' ç¨äºç®¡çé墿ä¸å ¬å¸ç人åä¿¡æ¯,å ·ä½å æ¬XXX,XXX模å...' # çæ¬ version: 'çæ¬å·: ${ruoyi.version}' # ä½è ä¿¡æ¯ ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/config/LocalCache.java
@@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @date 2023-03-10 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java
@@ -1,7 +1,6 @@ package org.ruoyi.common.chat.constant; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 2023-03-06 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/BillingUsage.java
@@ -8,7 +8,7 @@ import java.util.List; /** * æè¿°ï¼é颿¶èä¿¡æ¯ * é颿¶èä¿¡æ¯ * * @author https:www.unfbx.com * @since 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/CreditGrantsResponse.java
@@ -8,7 +8,7 @@ import java.math.BigDecimal; /** * æè¿°ï¼ä½é¢æ¥è¯¢æ¥å£è¿åå¼ * ä½é¢æ¥è¯¢æ¥å£è¿åå¼ * * @author https:www.unfbx.com * @since 2023-03-18 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/DailyCost.java
@@ -7,7 +7,7 @@ import java.util.List; /** * æè¿°ï¼é颿¶èå表 * é颿¶èå表 * * @author https:www.unfbx.com * @since 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Datum.java
@@ -7,7 +7,6 @@ import java.math.BigDecimal; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 2023-03-18 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Grants.java
@@ -7,7 +7,6 @@ import java.util.List; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 2023-03-18 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/LineItem.java
@@ -6,7 +6,7 @@ import java.math.BigDecimal; /** * æè¿°ï¼é颿¶èå表 * é颿¶èå表 * * @author https:www.unfbx.com * @since 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Plan.java
@@ -4,7 +4,6 @@ import lombok.Data; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Subscription.java
@@ -4,7 +4,7 @@ import lombok.Data; /** * æè¿°ï¼è´¦æ·ä¿¡æ¯ * è´¦æ·ä¿¡æ¯ * * @author https:www.unfbx.com * @since 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/BaseChatCompletion.java
@@ -13,7 +13,7 @@ import static org.ruoyi.common.chat.entity.chat.BaseChatCompletion.Model.GPT_3_5_TURBO; /** * æè¿°ï¼ chat模ååºç¡ç±» * chat模ååºç¡ç±» * * @author https:www.unfbx.com * @since 1.1.2 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/BaseMessage.java
@@ -12,7 +12,6 @@ import java.util.List; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 1.1.2 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatChoice.java
@@ -7,7 +7,6 @@ import java.io.Serializable; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 2023-03-02 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatCompletion.java
@@ -12,7 +12,7 @@ import java.util.List; /** * æè¿°ï¼ chat模ååæ° * chat模ååæ° * * @author https:www.unfbx.com * 2023-03-02 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatCompletionResponse.java
@@ -8,7 +8,7 @@ import java.util.List; /** * æè¿°ï¼ chatçæ¡ç±» * chatçæ¡ç±» * * @author https:www.unfbx.com * 2023-03-02 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatCompletionWithPicture.java
@@ -11,7 +11,7 @@ import java.util.List; /** * æè¿°ï¼ chat模åé带å¾ççåæ° * ï¼ chat模åé带å¾ççåæ° * * @author https:www.unfbx.com * @since 1.1.2 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Content.java
@@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j; /** * æè¿°ï¼ * * @author https://www.unfbx.com * @since 1.1.2 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/FunctionCall.java
@@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; /** * æè¿°ï¼å½æ°è°ç¨è¿åå¼ * 彿°è°ç¨è¿åå¼ * * @author https://www.unfbx.com * @since 2023-06-14 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Functions.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼æ¹æ³åæ°å®ä½ç±»ï¼å®ä¾æ°æ®å¦ä¸ * æ¹æ³åæ°å®ä½ç±»ï¼å®ä¾æ°æ®å¦ä¸ * <pre> * { * "name": "get_current_weather", ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ImageUrl.java
@@ -8,7 +8,6 @@ import lombok.extern.slf4j.Slf4j; /** * æè¿°ï¼ * * @author https://www.unfbx.com * 2023-11-10 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Message.java
@@ -10,7 +10,7 @@ import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * @since 2023-03-02 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/MessagePicture.java
@@ -10,8 +10,6 @@ import java.util.List; /** * æè¿°ï¼ * * @author https:www.unfbx.com * @since 2023-03-02 */ ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Parameters.java
@@ -6,7 +6,7 @@ import java.io.Serializable; import java.util.List; /** * æè¿°ï¼æ¹æ³åæ°ç±»ï¼æ©å±åæ°å¯ä»¥ç»§æ¿Parametersèªå·±å®ç° * æ¹æ³åæ°ç±»ï¼æ©å±åæ°å¯ä»¥ç»§æ¿Parametersèªå·±å®ç° * åèï¼ * <pre> * { ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/Choice.java
@@ -7,7 +7,6 @@ import java.io.Serializable; /** * æè¿°ï¼ * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/DeleteResponse.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/OpenAiResponse.java
@@ -6,7 +6,7 @@ import java.io.Serializable; import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/Usage.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/completions/Completion.java
@@ -10,7 +10,7 @@ import java.util.Map; /** * æè¿°ï¼ é®é¢ç±» * é®é¢ç±» * * @author https:www.unfbx.com * 2023-02-11 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/completions/CompletionResponse.java
@@ -9,7 +9,7 @@ import java.io.Serializable; /** * æè¿°ï¼ çæ¡ç±» * çæ¡ç±» * * @author https:www.unfbx.com * 2023-02-11 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/edits/Edit.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/edits/EditResponse.java
@@ -9,7 +9,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/embeddings/Embedding.java
@@ -9,7 +9,7 @@ import java.util.Objects; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/embeddings/EmbeddingResponse.java
@@ -8,7 +8,7 @@ import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/engines/Engine.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/files/File.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/files/UploadFileResponse.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/Image.java
@@ -11,7 +11,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ImageEdit.java
@@ -11,7 +11,7 @@ import java.util.Objects; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ImageResponse.java
@@ -7,7 +7,7 @@ import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ImageVariations.java
@@ -12,7 +12,7 @@ import java.util.Objects; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/Item.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ResponseFormat.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/SizeEnum.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/models/Model.java
@@ -8,7 +8,7 @@ import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/models/ModelResponse.java
@@ -7,7 +7,7 @@ import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/models/Permission.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/Categories.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/CategoryScores.java
@@ -8,7 +8,7 @@ import java.math.BigDecimal; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/Moderation.java
@@ -10,7 +10,7 @@ import java.util.Objects; /** * æè¿°ï¼ææ¬å®¡æ ¸ï¼ææè¯é´å« * ææ¬å®¡æ ¸ï¼ææè¯é´å« * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/ModerationResponse.java
@@ -7,7 +7,7 @@ import java.util.List; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/Result.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/whisper/Whisper.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼è¯é³è½¬æå * è¯é³è½¬æå * * @author https:www.unfbx.com * @since 2023-03-02 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/whisper/WhisperResponse.java
@@ -6,7 +6,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * @since 2023-03-02 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/listener/WebSocketEventListener.java
@@ -16,7 +16,7 @@ import java.util.Objects; /** * æè¿°ï¼OpenAIæµå¼è¾åºSocketæ¥æ¶ * OpenAIæµå¼è¾åºSocketæ¥æ¶ * * @author https:www.unfbx.com * @date 2023-03-23 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiApi.java
@@ -40,7 +40,7 @@ import java.util.Map; /** * æè¿°ï¼ open ai宿¹apiæ¥å£ * open ai宿¹apiæ¥å£ * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiClient.java
@@ -56,7 +56,7 @@ /** * æè¿°ï¼ open ai 客æ·ç«¯ * open ai 客æ·ç«¯ * * @author https:www.unfbx.com * @since 2023-02-11 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java
@@ -53,7 +53,7 @@ import java.util.concurrent.TimeUnit; /** * æè¿°ï¼ open ai 客æ·ç«¯ * open ai 客æ·ç«¯ * * @author https:www.unfbx.com * 2023-02-28 @@ -190,7 +190,7 @@ ObjectMapper mapper = new ObjectMapper(); String requestBody = mapper.writeValueAsString(chatCompletion); Request request = new Request.Builder() .url(this.apiHost + apiUrl) .url(this.apiHost) .post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody)) .build(); factory.newEventSource(request, eventSourceListener); ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/exception/CommonError.java
@@ -1,7 +1,7 @@ package org.ruoyi.common.chat.openai.exception; /** * æè¿°ï¼ é误 * é误 * * @author https:www.unfbx.com * 2023-02-11 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/exception/IError.java
@@ -1,6 +1,6 @@ package org.ruoyi.common.chat.openai.exception; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-11 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/function/KeyRandomStrategy.java
@@ -5,7 +5,7 @@ import java.util.List; /** * æè¿°ï¼éæºçç¥ * éæºçç¥ * * @author https:www.unfbx.com * @since 2023-04-03 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/function/KeyStrategyFunction.java
@@ -3,7 +3,7 @@ import java.util.function.Function; /** * æè¿°ï¼key çè·åçç¥ * key çè·åçç¥ * jdké»è®¤å®ç° * @see Function * ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/DefaultOpenAiAuthInterceptor.java
@@ -9,7 +9,7 @@ import java.util.Map; /** * æè¿°ï¼è¯·æ±å¢å header apikey * 请æ±å¢å header apikey * * @author https:www.unfbx.com * @since 2023-03-23 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/DynamicKeyOpenAiAuthInterceptor.java
@@ -16,7 +16,7 @@ import java.util.stream.Collectors; /** * æè¿°ï¼å¨æå¤çkeyçé´ææ¦æªå¨ * 卿å¤çkeyçé´ææ¦æªå¨ * * @author https:www.unfbx.com * @since 2023-04-25 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/OpenAILogger.java
@@ -4,7 +4,7 @@ import okhttp3.logging.HttpLoggingInterceptor; /** * æè¿°ï¼ æ¥å¿ * æ¥å¿ * * @author https:www.unfbx.com * 2023-02-28 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/OpenAiResponseInterceptor.java
@@ -13,7 +13,7 @@ import java.util.Objects; /** * æè¿°ï¼openai è¿åå¼å¤çInterceptor * openai è¿åå¼å¤çInterceptor * * @author https:www.unfbx.com * @since 2023-03-23 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/request/ChatRequest.java
@@ -7,7 +7,7 @@ import java.util.List; /** * æè¿°ï¼å¯¹è¯è¯·æ±å¯¹è±¡ * 对è¯è¯·æ±å¯¹è±¡ * * @author ageerle * @sine 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/request/Dall3Request.java
@@ -4,7 +4,7 @@ import lombok.Data; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * @sine 2023-04-08 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/sse/ConsoleEventSourceListener.java
@@ -10,7 +10,7 @@ import java.util.Objects; /** * æè¿°ï¼ sse * sse * * @author https:www.unfbx.com * 2023-02-28 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/sse/DefaultPluginListener.java
@@ -8,7 +8,7 @@ import org.ruoyi.common.chat.openai.plugin.PluginAbstract; /** * æè¿°ï¼ æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ * æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ * * @author https:www.unfbx.com * 2023-08-18 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/sse/PluginListener.java
@@ -19,7 +19,7 @@ import java.util.Objects; /** * æè¿°ï¼ æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ * æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ * * @author https:www.unfbx.com * 2023-08-18 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/utils/TikTokensUtil.java
@@ -15,7 +15,7 @@ import java.util.*; /** * æè¿°ï¼token计ç®å·¥å ·ç±» * token计ç®å·¥å ·ç±» * * @author https:www.unfbx.com * @since 2023-04-04 ruoyi-common/ruoyi-common-core/src/main/java/org/ruoyi/common/core/event/ConfigChangeEvent.java
@@ -3,7 +3,7 @@ import org.springframework.context.ApplicationEvent; /** * æè¿°ï¼å®ä¹ä¸ä¸ªäºä»¶ç±»ï¼ç¨äºéç¥é ç½®åå * å®ä¹ä¸ä¸ªäºä»¶ç±»ï¼ç¨äºéç¥é ç½®åå * * @author ageerle@163.com * date 2024/5/19 ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/ChatChoice.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * @since 2023-03-02 ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/ChatCompletionResponse.java
@@ -7,7 +7,7 @@ import java.util.List; /** * æè¿°ï¼ chatçæ¡ç±» * chatçæ¡ç±» * * @author https:www.unfbx.com * 2023-03-02 ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/Message.java
@@ -9,7 +9,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * @since 2023-03-02 ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/Usage.java
@@ -7,7 +7,7 @@ import java.io.Serializable; /** * æè¿°ï¼ * * * @author https:www.unfbx.com * 2023-02-15 ruoyi-common/ruoyi-common-pay/src/main/java/org/ruoyi/common/listener/ConfigChangeListener.java
@@ -10,7 +10,7 @@ import org.springframework.stereotype.Component; /** * æè¿°ï¼å建ä¸ä¸ªçå¬å¨ï¼ç¨äºå¤çé ç½®ååäºä»¶ * å建ä¸ä¸ªçå¬å¨ï¼ç¨äºå¤çé ç½®ååäºä»¶ * * @author ageerle@163.com * date 2024/5/19 ruoyi-modules-api/ruoyi-chat-api/pom.xml
@@ -71,6 +71,18 @@ <artifactId>spring-ai-starter-model-openai</artifactId> </dependency> <dependency> <groupId>io.github.imfangs</groupId> <artifactId>dify-java-client</artifactId> <version>1.0.7</version> </dependency> <dependency> <groupId>com.coze</groupId> <artifactId>coze-api</artifactId> <version>0.3.1</version> </dependency> </dependencies> </project> ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java
@@ -47,7 +47,7 @@ /** * 模åä»·æ ¼ */ private Long modelPrice; private Double modelPrice; /** * 计费类å @@ -69,11 +69,6 @@ */ private String apiHost; /** * 请æ±å°ååç¼ - å ¼å®¹å¤å¹³å° */ @ExcelProperty(value = "请æ±å°ååç¼") private String apiUrl; /** * å¯é¥ ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java
@@ -49,7 +49,7 @@ * 模åä»·æ ¼ */ @NotNull(message = "模åä»·æ ¼ä¸è½ä¸ºç©º", groups = { AddGroup.class, EditGroup.class }) private Long modelPrice; private Double modelPrice; /** * 计费类å @@ -80,11 +80,6 @@ @NotBlank(message = "å¯é¥ä¸è½ä¸ºç©º", groups = { AddGroup.class, EditGroup.class }) private String apiKey; /** * 请æ±å°ååç¼ - å ¼å®¹å¤å¹³å° */ @ExcelProperty(value = "请æ±å°ååç¼") private String apiUrl; /** * 夿³¨ ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/request/TranslationRequest.java
@@ -3,7 +3,7 @@ import lombok.Data; /** * æè¿°ï¼ç¿»è¯è¯·æ±å¯¹è±¡ * ç¿»è¯è¯·æ±å¯¹è±¡ * * @author ageerle@163.com * date 2025/1/13 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java
@@ -56,7 +56,7 @@ * 模åä»·æ ¼ */ @ExcelProperty(value = "模åä»·æ ¼") private Long modelPrice; private Double modelPrice; /** * 计费类å @@ -87,12 +87,6 @@ */ @ExcelProperty(value = "å¯é¥") private String apiKey; /** * 请æ±å°ååç¼ - å ¼å®¹å¤å¹³å° */ @ExcelProperty(value = "请æ±å°ååç¼") private String apiUrl; /** * 夿³¨ ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java
@@ -7,7 +7,7 @@ /** * æè¿°ï¼ç¨æ·å¯ç ä¿®æ¹bo * ç¨æ·å¯ç ä¿®æ¹bo * * @author ageerle@163.com * date 2025/3/9 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java
@@ -32,12 +32,11 @@ public OpenAiStreamClient openAiStreamClient() { String apiHost = configService.getConfigValue("chat", "apiHost"); String apiKey = configService.getConfigValue("chat", "apiKey"); String url = configService.getConfigValue("chat", "apiUrl"); openAiStreamClient = createOpenAiStreamClient(apiHost,apiKey,url); openAiStreamClient = createOpenAiStreamClient(apiHost,apiKey); return openAiStreamClient; } public static OpenAiStreamClient createOpenAiStreamClient(String apiHost, String apiKey,String url) { public static OpenAiStreamClient createOpenAiStreamClient(String apiHost, String apiKey) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger()); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); OkHttpClient okHttpClient = new OkHttpClient.Builder() @@ -48,7 +47,6 @@ .build(); return OpenAiStreamClient.builder() .apiHost(apiHost) .apiUrl(url) .apiKey(Collections.singletonList(apiKey)) .keyStrategy(new KeyRandomStrategy()) .okHttpClient(okHttpClient) ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/chat/ChatController.java
@@ -28,7 +28,7 @@ /** * æè¿°ï¼è天管ç * è天管ç * * @author ageerle@163.com * @date 2023-03-01 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/bo/GenerateLuma.java
@@ -3,7 +3,7 @@ import lombok.Data; /** * æè¿°ï¼æçè§é¢è¯·æ±å¯¹è±¡ * æçè§é¢è¯·æ±å¯¹è±¡ * * @author ageerle@163.com * date 2024/6/27 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/bo/GenerateLyric.java
@@ -3,7 +3,7 @@ import lombok.Data; /** * æè¿°ï¼çææè¯ * çææè¯ * * @author ageerle@163.com * date 2024/6/27 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java
@@ -6,6 +6,8 @@ public enum ChatModeType { OLLAMA("ollama", "æ¬å°é¨ç½²æ¨¡å"), CHAT("chat", "ä¸è½¬æ¨¡å"), DIFY("dify", "DIFY"), COZE("coze", "æ£å"), VECTOR("vector", "ç¥è¯åºå鿍¡å"); private final String code; ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/DisplayType.java
@@ -3,7 +3,7 @@ import lombok.Getter; /** * æè¿°ï¼æ¯å¦æ¾ç¤º * æ¯å¦æ¾ç¤º * * @author ageerle@163.com * date 2025/4/10 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/factory/ChatServiceFactory.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ package org.ruoyi.chat.factory; import org.ruoyi.chat.service.chat.IChatService; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * è天æå¡å·¥åç±» * * @author ageerle@163.com * date 2025/5/10 */ @Component public class ChatServiceFactory implements ApplicationContextAware { private final Map<String, IChatService> chatServiceMap = new ConcurrentHashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // åå§åæ¶æ¶éææIChatServiceçå®ç° Map<String, IChatService> serviceMap = applicationContext.getBeansOfType(IChatService.class); for (IChatService service : serviceMap.values()) { if (service != null) { chatServiceMap.put(service.getCategory(), service); } } } /** * æ ¹æ®æ¨¡åç±»å«è·å对åºçè天æå¡å®ç° */ public IChatService getChatService(String category) { IChatService service = chatServiceMap.get(category); if (service == null) { throw new IllegalArgumentException("䏿¯æç模åç±»å«: " + category); } return service; } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java
@@ -24,7 +24,7 @@ import java.util.Objects; /** * æè¿°ï¼OpenAIEventSourceListener * OpenAIEventSourceListener * * @author https:www.unfbx.com * @date 2023-02-22 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatService.java
@@ -16,6 +16,8 @@ * @param chatRequest 请æ±å¯¹è±¡ */ SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter); /** * è·åæ¤æå¡æ¯æç模åç±»å« */ String getCategory(); } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/UserModelService.java
@@ -1,26 +1,16 @@ package org.ruoyi.chat.service.chat; import cn.dev33.satoken.stp.StpUtil; import lombok.RequiredArgsConstructor; import org.ruoyi.chat.enums.DisplayType; import org.ruoyi.chat.enums.UserGradeType; import org.ruoyi.common.satoken.utils.LoginHelper; import org.ruoyi.domain.bo.ChatModelBo; import org.ruoyi.domain.bo.ChatPackagePlanBo; import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.domain.vo.ChatPackagePlanVo; import org.ruoyi.service.IChatModelService; import org.ruoyi.service.IChatPackagePlanService; import org.ruoyi.system.domain.vo.SysUserVo; import org.ruoyi.system.service.ISysUserService; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * æè¿°ï¼ç¨æ·æ¨¡åä¿¡æ¯ * ç¨æ·æ¨¡åä¿¡æ¯ * * @author ageerle@163.com * date 2025/4/10 @@ -32,30 +22,9 @@ private final IChatModelService chatModelService; private final ISysUserService userService; private final IChatPackagePlanService packagePlanService; public List<ChatModelVo> modelList(ChatModelBo bo) { bo.setModelShow(DisplayType.VISIBLE.getCode()); List<ChatModelVo> chatModelList = chatModelService.queryList(bo); ChatPackagePlanBo sysPackagePlanBo = new ChatPackagePlanBo(); if (StpUtil.isLogin()) { Long userId = LoginHelper.getLoginUser().getUserId(); SysUserVo sysUserVo = userService.selectUserById(userId); if (UserGradeType.UNPAID.getCode().equals(sysUserVo.getUserGrade())){ sysPackagePlanBo.setName("Free"); ChatPackagePlanVo chatPackagePlanVo = packagePlanService.queryList(sysPackagePlanBo).get(0); List<String> array = new ArrayList<>(Arrays.asList(chatPackagePlanVo.getPlanDetail().split(","))); chatModelList.removeIf(model -> !array.contains(model.getModelName())); } }else { sysPackagePlanBo.setName("Visitor"); ChatPackagePlanVo sysPackagePlanVo = packagePlanService.queryList(sysPackagePlanBo).get(0); List<String> array = new ArrayList<>(Arrays.asList(sysPackagePlanVo.getPlanDetail().split(","))); chatModelList.removeIf(model -> !array.contains(model.getModelName())); } return new ArrayList<>(chatModelList); return chatModelService.queryList(bo); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/CozeServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,81 @@ package org.ruoyi.chat.service.chat.impl; import com.coze.openapi.client.chat.CreateChatReq; import com.coze.openapi.client.chat.model.ChatEvent; import com.coze.openapi.client.chat.model.ChatEventType; import com.coze.openapi.client.connversations.message.model.Message; import com.coze.openapi.service.auth.TokenAuth; import com.coze.openapi.service.config.Consts; import com.coze.openapi.service.service.CozeAPI; import io.reactivex.Flowable; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.enums.ChatModeType; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.common.chat.request.ChatRequest; import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.service.IChatModelService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.util.Collections; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * æ£åè天管ç * * @author ageer */ @Service @Slf4j public class CozeServiceImpl implements IChatService { @Autowired private IChatModelService chatModelService; @Override public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); TokenAuth authCli = new TokenAuth(chatModelVo.getApiKey()); CozeAPI coze = new CozeAPI.Builder() .baseURL(chatModelVo.getApiHost()) .auth(authCli) .readTimeout(10000) .build(); CreateChatReq req = CreateChatReq.builder() .botID(chatModelVo.getModelName()) .userID(chatRequest.getUserId().toString()) .messages(Collections.singletonList(Message.buildUserQuestionText("What can you do?"))) .build(); Flowable<ChatEvent> resp = coze.chat().stream(req); ExecutorService executor = Executors.newFixedThreadPool(10); executor.submit(() -> { resp.blockingForEach( event -> { if (ChatEventType.CONVERSATION_MESSAGE_DELTA.equals(event.getEvent())) { emitter.send(event.getMessage().getContent()); log.info("coze: {}", event.getMessage().getContent()); } if (ChatEventType.CONVERSATION_CHAT_COMPLETED.equals(event.getEvent())) { emitter.complete(); log.info("Token usage: {}", event.getChat().getUsage().getTokenCount()); } } ); coze.shutdownExecutor(); }); return emitter; } @Override public String getCategory() { return ChatModeType.COZE.getCode(); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/DifyServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,96 @@ package org.ruoyi.chat.service.chat.impl; import io.github.imfangs.dify.client.DifyClient; import io.github.imfangs.dify.client.DifyClientFactory; import io.github.imfangs.dify.client.callback.ChatStreamCallback; import io.github.imfangs.dify.client.enums.ResponseMode; import io.github.imfangs.dify.client.event.ErrorEvent; import io.github.imfangs.dify.client.event.MessageEndEvent; import io.github.imfangs.dify.client.event.MessageEvent; import io.github.imfangs.dify.client.model.DifyConfig; import io.github.imfangs.dify.client.model.chat.ChatMessage; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.enums.ChatModeType; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.common.chat.request.ChatRequest; import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.service.IChatModelService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; /** * dify è天管ç * * @author ageer */ @Service @Slf4j public class DifyServiceImpl implements IChatService { @Autowired private IChatModelService chatModelService; @Override public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); // 使ç¨èªå®ä¹é ç½®å建客æ·ç«¯ DifyConfig config = DifyConfig.builder() .baseUrl(chatModelVo.getApiHost()) .apiKey(chatModelVo.getApiKey()) .connectTimeout(5000) .readTimeout(60000) .writeTimeout(30000) .build(); DifyClient chatClient = DifyClientFactory.createClient(config); // å建èå¤©æ¶æ¯ ChatMessage message = ChatMessage.builder() .query(chatRequest.getPrompt()) .user(chatRequest.getUserId().toString()) .responseMode(ResponseMode.STREAMING) .build(); // å鿵弿¶æ¯ try { chatClient.sendChatMessageStream(message, new ChatStreamCallback() { @SneakyThrows @Override public void onMessage(MessageEvent event) { emitter.send(event.getAnswer()); log.info("æ¶å°æ¶æ¯ç段: {}", event.getAnswer()); } @Override public void onMessageEnd(MessageEndEvent event) { emitter.complete(); log.info("æ¶æ¯ç»æï¼å®æ´æ¶æ¯ID: {}", event.getMessageId()); } @Override public void onError(ErrorEvent event) { System.err.println("é误: " + event.getMessage()); } @Override public void onException(Throwable throwable) { System.err.println("å¼å¸¸: " + throwable.getMessage()); } }); } catch (Exception e) { log.error("dify请æ±å¤±è´¥ï¼{}", e.getMessage()); } return emitter; } @Override public String getCategory() { return ChatModeType.DIFY.getCode(); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OllamaServiceImpl.java
@@ -7,6 +7,8 @@ import io.github.ollama4j.models.chat.OllamaChatRequestModel; import io.github.ollama4j.models.generate.OllamaStreamHandler; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.enums.ChatModeType; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.chat.util.SSEUtil; import org.ruoyi.common.chat.entity.chat.Message; import org.ruoyi.common.chat.request.ChatRequest; @@ -22,14 +24,18 @@ import java.util.concurrent.CompletableFuture; /** * @author ageer */ @Service @Slf4j public class OllamaServiceImpl { public class OllamaServiceImpl implements IChatService { @Autowired private IChatModelService chatModelService; @Autowired private IChatModelService chatModelService; public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { @Override public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); String host = chatModelVo.getApiHost(); List<Message> msgList = chatRequest.getMessages(); @@ -73,4 +79,8 @@ return emitter; } @Override public String getCategory() { return ChatModeType.OLLAMA.getCode(); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
@@ -3,6 +3,7 @@ import io.modelcontextprotocol.client.McpSyncClient; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.config.ChatConfig; import org.ruoyi.chat.enums.ChatModeType; import org.ruoyi.chat.listener.SSEEventSourceListener; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.common.chat.entity.chat.ChatCompletion; @@ -21,15 +22,15 @@ import java.util.List; /** * @author ageer */ @Service @Slf4j public class OpenAIServiceImpl implements IChatService { @Autowired private IChatModelService chatModelService; private OpenAiStreamClient openAiStreamClient; @Value("${spring.ai.mcp.client.enabled}") private Boolean enabled; @@ -47,7 +48,7 @@ @Override public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey(),chatModelVo.getApiUrl()); OpenAiStreamClient openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey()); List<Message> messages = chatRequest.getMessages(); if (enabled) { String toolString = mcpChat(chatRequest.getPrompt()); @@ -69,4 +70,9 @@ return this.chatClient.prompt(prompt).call().content(); } @Override public String getCategory() { return ChatModeType.CHAT.getCode(); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java
@@ -8,7 +8,9 @@ import lombok.extern.slf4j.Slf4j; import okhttp3.ResponseBody; import org.ruoyi.chat.enums.ChatModeType; import org.ruoyi.chat.factory.ChatServiceFactory; import org.ruoyi.chat.service.chat.IChatCostService; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.chat.service.chat.ISseService; import org.ruoyi.chat.util.IpUtil; import org.ruoyi.chat.util.SSEUtil; @@ -61,9 +63,7 @@ private final IChatModelService chatModelService; private final OpenAIServiceImpl openAIService; private final OllamaServiceImpl ollamaService; private final ChatServiceFactory chatServiceFactory; private final IChatSessionService chatSessionService; @@ -95,7 +95,8 @@ chatCostService.deductToken(chatRequest); } // æ ¹æ®æ¨¡ååç±»è°ç¨ä¸åçå¤çé»è¾ switchModelAndHandle(chatRequest,sseEmitter); IChatService chatService = chatServiceFactory.getChatService(chatModelVo.getCategory()); chatService.chat(chatRequest, sseEmitter); } catch (Exception e) { log.error(e.getMessage(),e); SSEUtil.sendErrorEvent(sseEmitter,e.getMessage()); @@ -147,17 +148,6 @@ } } /** * æ ¹æ®æ¨¡ååç§°åç¼è°ç¨ä¸åçå¤çé»è¾ */ private void switchModelAndHandle(ChatRequest chatRequest,SseEmitter emitter) { // è°ç¨ollamaä¸é¨ç½²çæ¬å°æ¨¡å if (ChatModeType.OLLAMA.getCode().equals(chatModelVo.getCategory())) { ollamaService.chat(chatRequest,emitter); } else { openAIService.chat(chatRequest,emitter); } } /** * æå»ºæ¶æ¯å表 ruoyi-modules/ruoyi-wechat/src/main/java/org/ruoyi/service/VxLoginService.java
@@ -26,7 +26,7 @@ import java.util.UUID; /** * æè¿°ï¼å¾®ä¿¡å ¬ä¼å·ç»å½ * å¾®ä¿¡å ¬ä¼å·ç»å½ * * @author ageerle@163.com * date 2025/4/30