办学质量监测教学评价系统
ageer
2025-05-11 84b8d6f675c2f3aed83e0503e79cf1fa05e888e5
feat: 支持coze,dify,派欧云等三方模型调用
已修改97个文件
已添加3个文件
519 ■■■■■ 文件已修改
ruoyi-admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/config/LocalCache.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/BillingUsage.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/CreditGrantsResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/DailyCost.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Datum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Grants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/LineItem.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Plan.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/billing/Subscription.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/BaseChatCompletion.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/BaseMessage.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatChoice.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatCompletion.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatCompletionResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ChatCompletionWithPicture.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Content.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/FunctionCall.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Functions.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/ImageUrl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Message.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/MessagePicture.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/chat/Parameters.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/Choice.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/DeleteResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/OpenAiResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/common/Usage.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/completions/Completion.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/completions/CompletionResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/edits/Edit.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/edits/EditResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/embeddings/Embedding.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/embeddings/EmbeddingResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/engines/Engine.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/files/File.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/files/UploadFileResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/Image.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ImageEdit.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ImageResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ImageVariations.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/Item.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/ResponseFormat.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/images/SizeEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/models/Model.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/models/ModelResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/models/Permission.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/Categories.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/CategoryScores.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/Moderation.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/ModerationResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/moderations/Result.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/whisper/Whisper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/entity/whisper/WhisperResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/listener/WebSocketEventListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/exception/CommonError.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/exception/IError.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/function/KeyRandomStrategy.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/function/KeyStrategyFunction.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/DefaultOpenAiAuthInterceptor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/DynamicKeyOpenAiAuthInterceptor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/OpenAILogger.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/interceptor/OpenAiResponseInterceptor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/request/ChatRequest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/request/Dall3Request.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/sse/ConsoleEventSourceListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/sse/DefaultPluginListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/sse/PluginListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/utils/TikTokensUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/org/ruoyi/common/core/event/ConfigChangeEvent.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/ChatChoice.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/ChatCompletionResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/Message.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/client/Usage.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-pay/src/main/java/org/ruoyi/common/listener/ConfigChangeListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/request/TranslationRequest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/chat/ChatController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/bo/GenerateLuma.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/bo/GenerateLyric.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/DisplayType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/factory/ChatServiceFactory.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/UserModelService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/CozeServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/DifyServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OllamaServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-wechat/src/main/java/org/ruoyi/service/VxLoginService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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