.gitignore
@@ -13,6 +13,8 @@ ruoyi-modules/ruoyi-generator/src/main/resources/vm/vben5 README.md ###################################################################### # IDE README.md
@@ -59,24 +59,16 @@ ### ç³»ç»ä½éª - ç¨æ·ç«¯ï¼https://web.pandarobot.chat - 管ç端ï¼https://admin.pandarobot.chat ç¨æ·å: admin å¯ç ï¼admin123 - ç¨æ·å: admin å¯ç ï¼admin123 ### æºç å°å [1]gitee - å端æå¡-ç¨æ·ç«¯: https://gitee.com/ageerle/ruoyi-web - å端æå¡-管ç端: https://gitee.com/ageerle/ruoyi-admin - å端æå¡-å°ç¨åºç«¯: https://gitee.com/ageerle/ruoyi-uniapp - å端æå¡ï¼https://gitee.com/ageerle/ruoyi-ai [2]github [1]github - å端æå¡-ç¨æ·ç«¯: https://github.com/ageerle/ruoyi-web - å端æå¡-管ç端: https://github.com/ageerle/ruoyi-admin - å端æå¡-å°ç¨åºç«¯: https://github.com/ageerle/ruoyi-uniapp - å端æå¡ï¼https://github.com/ageerle/ruoyi-ai [3]gitcode [2]gitcode - å端æå¡-ç¨æ·ç«¯ï¼https://gitcode.com/ageerle/ruoyi-web - å端æå¡-管ç端: https://gitcode.com/ageerle/ruoyi-admin - å端æå¡-å°ç¨åºç«¯: https://gitcode.com/ageerle/ruoyi-uniapp @@ -86,27 +78,25 @@ - é å¥ææ¡£: https://doc.pandarobot.chat - 项ç®é¨ç½²ææ¡£ï¼https://doc.pandarobot.chat/guide/introduction/ ### æ ¸å¿åè½ 1. å ¨å¥å¼æºç³»ç»ï¼æä¾å®æ´çå端åºç¨ãåå°ç®¡ç以åå°ç¨åºåºç¨ï¼åºäºMITåè®®ï¼å¼ç®±å³ç¨ã 2. æ¬å°RAGæ¹æ¡ï¼éæMilvus/Weaviateåéåºãæ¬å°åé忍¡åä¸Ollamaï¼å®ç°æ¬å°åRAGã 3. 䏰坿件åè½ï¼æ¯æèç½ãSQLæ¥è¯¢æä»¶åText2APIæä»¶ï¼æ©å±ç³»ç»è½åä¸åºç¨åºæ¯ã 4. å ç½®SSEãwebsocketçç½ç»åè®®ï¼æ¯æå¯¹æ¥å¤ç§å¤§è¯è¨æ¨¡åï¼åæ¶è¿éæäºMidJourneyåDALLE AIç»ç»åè½ã 5. 强大çå¤åªä½åè½ï¼æ¯æAIç¿»è¯ãPPTå¶ä½ãè¯é³å éåç¿»å±çã 6. æ©å±åè½ï¼æ¯æå°å¤§æ¨¡åæ¥å ¥ä¸ªäººæä¼ä¸å¾®ä¿¡ã 7. æ¯ä»åè½ï¼æ¯æææ¯ä»ã微信æ¯ä»çå¤ç§æ¯ä»æ¹å¼ã ### æ ¸å¿åè½ä¸ææ¯äº®ç¹ #### 1. å ¨æ å¼å¼æºç³»ç» - å ¨å¥å¼æºç³»ç»ï¼æä¾å®æ´çå端åºç¨ãåå°ç®¡ç以åå°ç¨åºåºç¨ï¼åºäºMITåè®®ï¼å¼ç®±å³ç¨ã #### 2. æ¬å°å RAG æ¹æ¡ - åºäº **Langchain4j** æ¡æ¶ï¼æ¯æ Milvus/Weaviate/Qdrant åéåºï¼ç»å BGE-large-zh-v1.5 æ¬å°åé忍¡å å®ç°é«æææ¡£æ£ç´¢ä¸ç¥è¯åºæå»ºã - æ¯æ æ¬å° LLM æ¥å ¥ï¼ç»åç§æç¥è¯åºå®ç°å®å ¨å¯æ§çé®çç³»ç»ï¼é¿å ä¾èµäºç«¯æå¡çéç§é£é©ã #### 3. 夿¨¡æ AI 弿ä¸å·¥å ·éæ - æºè½å¯¹è¯ï¼æ¯æ OpenAI GPT-4ãAzureãChatGLM çä¸»æµæ¨¡åï¼å ç½® SSE/WebSocket åè®®å®ç°ä½å»¶è¿äº¤äºï¼å ¼å®¹ **æ£å**ã**DIFY** çå¹³å° API è°ç¨ã - **Spring AI MCP** æ¯æï¼éè¿æ³¨è§£å¿«éå®ä¹æ¬å°å·¥å ·ï¼æ¯æè°ç¨ MCP å¹¿åº çæµ·é MCP Server æå¡ï¼æ©å±æ¨¡åè½åè¾¹çã #### 4. ä¼ä¸çº§æ©å±ä¸åä¸åæ¯æ - 峿¶é讯éæï¼æ¯æå¯¹æ¥ä¸ªäººå¾®ä¿¡ãä¼ä¸å¾®ä¿¡åå¾®ä¿¡å ¬ä¼å·ï¼å®ç°æ¶æ¯èªå¨åå¤ãç¨æ·ç®¡ç䏿ºè½å®¢æã - æ¯ä»ç³»ç»ï¼éæææ¯ä»ã微信æ¯ä»ãStripe å½é ä¿¡ç¨å¡æ¯ä»ï¼æ»¡è¶³åä¸ååºæ¯éæ±ã #### 5. å¤åªä½å¤çä¸åæ°åè½ - AI ç»ç»ï¼éæ DALL·E-3ãMidJourneyãStable Diffusionï¼æ¯ææçå¾ãå¾çå¾å飿 ¼ååä½ï¼éç¨äºè¥éç´ æçæä¸åæè®¾è®¡ã - PPT å¶ä½ï¼æ ¹æ®ææ¬è¾å ¥èªå¨çæç»æåå¹»ç¯çï¼æ¯æèªå®ä¹æ¨¡æ¿(éè¦ä½¿ç¨ä¸æ¹å¹³å° å¦ï¼æå¤å¤)ã ### é¡¹ç®æ¼ç¤º #### mcpæ¯æ ### å¦ä½ä½¿ç¨ 1. ruoyi-admin\src\main\resources\application.ymlä¸mcp.client.enabledæ¹ä¸ºtrue 2. application.ymlä¸é ç½®openai api-key(ç¨äºæ¨ç使ç¨é£ä¸ªå·¥å ·,å¹¶æå»ºå·¥å ·æéåæ°) 3. å¯å¨[ruoyi-mcp-server] 4. [mcp-server.json]ä¸é ç½®fileSystem.command(npxæ¬å°å®è£ è·¯å¾) 5. æå®fileSystemæä½ç®å½(æ¬å°å¿ é¡»å卿å®çç®å½) 6. é ç½®search1api.env.SEARCH1API_KEY ç³è¯·å°åï¼https://www.search1api.com/ 7. è¯¦æ æç¨ï¼https://blog.csdn.net/weixin_42416319/article/details/147385808 <div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;"> <img src="image/mcp-01.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> <img src="image/mcp-02.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> @@ -121,7 +111,6 @@ <img src="image/04.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> <img src="image/05.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> </div> #### ç¨æ·ç«¯ <div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;"> @@ -204,7 +193,6 @@ ### 注æäºé¡¹ - vbenæ¨¡æ¿ Qï¼vben5 çæ¨¡æ¿é»è®¤æ¯æ²¡æçåï¼ Aï¼vbenæ¨¡æ¿æ¯æ¶è´¹ç 请èç³»vben-vue-plusä½è è·åã @@ -212,7 +200,6 @@ ### çæ¬æ§å¶ 该项ç®ä½¿ç¨Gitè¿è¡çæ¬ç®¡çãæ¨å¯ä»¥å¨repositoryåçå½åå¯ç¨çæ¬ã ### çæè¯´æ @@ -251,7 +238,7 @@ #### é¡¹ç®ææ¡£ 1. é¡¹ç®ææ¡£åºäºvitepressæå»º 2. æç §[å¦ä½åä¸å¼æºé¡¹ç®](#å¦ä½åä¸å¼æºé¡¹ç®)æå https://github.com/ageerle/ruoyi-doc 2. æç §[å¦ä½åä¸å¼æºé¡¹ç®](#å¦ä½åä¸å¼æºé¡¹ç®)æåhttps://github.com/ageerle/ruoyi-doc 3. å®è£ ä¾èµï¼npm install 4. å¯å¨é¡¹ç®ï¼npm run docs:dev 5. 主页路å¾ï¼docs/guide/introduction/index.md @@ -277,11 +264,15 @@ [license-url]: https://github.com/ageerle/ruoyi-ai/blob/master/LICENSE.txt [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555 ## ð¿ ç¬¬ä¸æ¹çæ - [PPIO 派欧äºï¼ä¸é®è°ç¨é«æ§ä»·æ¯ç弿ºæ¨¡å API å GPU 容å¨](https://ppinfra.com/user/register?invited_by=P8QTUY&utm_source=github_ruoyi-ai) ### éï¼ææ¯è®¨è®ºç¾¤ #### å ¨é¢å¼æ¾ï¼æ¬¢è¿å å ¥ #### è¿ç¾¤å¦ä¹ ð wxï¼ruoyi-aiï¼å äººå¤æ³¨ï¼ruoyi-aiï¼ <img src="image/å°å©æwx.png" alt="drawing" style="width: 400px; height: 400px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> ð qqï¼1603234088 ï¼å äººå¤æ³¨ï¼ruoyi-aiï¼ @@ -290,11 +281,4 @@ <div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;"> <img src="image/QQåº-宿¹äº¤æµ1群.png" alt="drawing" style="width: 400px; height: 400px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> </div> ððð ruoyi-ai宿¹äº¤æµ4群ï¼å¾®ä¿¡åºï¼ï¼ <div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;"> <img src="image/WXåº-宿¹äº¤æµ4群.jpg" alt="drawing" style="width: 400px; height: 400px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/> </div> image/СÖúÊÖwx.png
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 @@ -10,6 +9,8 @@ public final static String OPENAI_HOST = "https://api.openai.com/"; public final static String apiUrl = "v1/chat/completions"; public final static int SUCCEED_CODE = 200; } 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 @@ -70,6 +70,11 @@ * èªå®ä¹api host使ç¨builderçæ¹å¼æé client */ private String apiHost; /** * èªå®ä¹url å ¼å®¹å¤ä¸ªå¹³å° */ private String apiUrl; /** * èªå®ä¹çokHttpClient @@ -112,6 +117,11 @@ } apiHost = builder.apiHost; if (StrUtil.isBlank(builder.apiUrl)) { builder.apiUrl = OpenAIConst.apiUrl; } apiUrl = builder.apiUrl; if (Objects.isNull(builder.keyStrategy)) { builder.keyStrategy = new KeyRandomStrategy(); } @@ -136,12 +146,12 @@ } okHttpClient = builder.okHttpClient; this.openAiApi = new Retrofit.Builder() .baseUrl(apiHost) .client(okHttpClient) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(JacksonConverterFactory.create()) .build().create(OpenAiApi.class); // this.openAiApi = new Retrofit.Builder() // .baseUrl(apiHost) // .client(okHttpClient) // .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // .addConverterFactory(JacksonConverterFactory.create()) // .build().create(OpenAiApi.class); } /** @@ -180,7 +190,7 @@ ObjectMapper mapper = new ObjectMapper(); String requestBody = mapper.writeValueAsString(chatCompletion); Request request = new Request.Builder() .url(this.apiHost + "v1/chat/completions") .url(this.apiHost) .post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody)) .build(); factory.newEventSource(request, eventSourceListener); @@ -334,7 +344,6 @@ BillingUsage billingUsage = billingUsage(start.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), end.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); double totalUsage = billingUsage.getTotalUsage().doubleValue() / 100; System.out.println(totalUsage); Subscription subscription = subscription(); KeyInfo keyInfo = new KeyInfo(); String start_key = key.substring(0, 6); @@ -611,6 +620,8 @@ */ private String apiHost; private String apiUrl; /** * èªå®ä¹OkhttpClient */ @@ -645,6 +656,16 @@ return this; } /** * @param val èªå®ä¹è¯·æ±åç¼ * @return Builder * @see OpenAIConst */ public Builder apiUrl(String val) { apiUrl = val; return this; } public Builder keyStrategy(KeyStrategyFunction val) { keyStrategy = val; return this; ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/TestOpenAIAPI.java
@@ -21,7 +21,7 @@ .build(); try (Response response = client.newCall(request).execute()) { System.out.println(response.body().string()); } } 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/plugin/CmdReq.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/plugin/CmdResp.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/plugin/SqlPlugin.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/plugin/SqlReq.java
ÎļþÒÑɾ³ý ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/plugin/SqlResp.java
ÎļþÒÑɾ³ý 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/DouyuLiveChatClientTest.java
@@ -45,11 +45,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -95,12 +91,9 @@ .build(); long startTime = System.currentTimeMillis(); // è·åå¼å§æ¶é´çæ¯«ç§æ° System.out.println("æ§è¡å......."); Thread.sleep(3000); System.out.println("æ§è¡å......."); long endTime = System.currentTimeMillis(); // è·åç»ææ¶é´çæ¯«ç§æ° long timeDiff = endTime - startTime; // è®¡ç®æ¶é´å·® System.out.println("æ§è¡æ¶é´ " + timeDiff / 1000 + " ç§ã"); try (Response response = okClient.newCall(request).execute()) { if (response.body() != null) { 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-live/live-chat-clients/live-chat-client-douyu/src/test/java/tech/ordinaryroad/live/chat/client/douyu/util/DouyuCodecUtilTest.java
@@ -48,7 +48,6 @@ Map<String, Object> stringObjectMap = DouyuCodecUtil.parseDouyuSttStringToMap(mapkb); assertNotNull(stringObjectMap); stringObjectMap.forEach((string, o) -> { System.out.println(string); }); } @@ -58,7 +57,6 @@ Map<String, Object> stringObjectMap = DouyuCodecUtil.parseDouyuSttStringToMap(pdrinfo); assertNotNull(stringObjectMap); stringObjectMap.forEach((string, o) -> { System.out.println(string); }); } @@ -78,7 +76,6 @@ }}); }}); }}); System.out.println(douyuSttString); assertEquals("key1@=value1/key2@=2/key3@=11@AA=11@AS12@AA=12@AS@S22@AA=22@AS21@AA=21@AS@S/".length(), douyuSttString.length()); } @@ -87,8 +84,6 @@ String mapkb = "type@=mapkb/pk_time@=600/teams@=team@AA=5@ASres@AA=1@ASsc@AA=660000@ASbf@AA=0@AS@Steam@AA=6@ASres@AA=2@ASsc@AA=600000@ASbf@AA=0@AS@Steam@AA=4@ASres@AA=3@ASsc@AA=456000@ASbf@AA=0@AS@Steam@AA=2@ASres@AA=4@ASsc@AA=302000@ASbf@AA=0@AS@Steam@AA=3@ASres@AA=5@ASsc@AA=100000@ASbf@AA=0@AS@Steam@AA=1@ASres@AA=6@ASsc@AA=200@ASbf@AA=0@AS@S/"; IDouyuMsg iDouyuMsg = DouyuCodecUtil.parseDouyuSttString(mapkb, DouyuCodecUtil.MSG_TYPE_RECEIVE); String douyuSttString = DouyuCodecUtil.toDouyuSttString(iDouyuMsg); System.out.println(mapkb); System.out.println(douyuSttString); assertEquals(mapkb.length(), douyuSttString.length()); IDouyuMsg douyuSttStringMsg = DouyuCodecUtil.parseDouyuSttString(douyuSttString, DouyuCodecUtil.MSG_TYPE_RECEIVE); assertNotNull(douyuSttStringMsg); @@ -97,6 +92,5 @@ @Test void unescape() { String unescape = DouyuCodecUtil.unescape("team@AA=5@ASres@AA=1@ASsc@AA=660000@ASbf@AA=0@AS@Steam@AA=6@ASres@AA=2@ASsc@AA=600000@ASbf@AA=0@AS@Steam@AA=4@ASres@AA=3@ASsc@AA=456000@ASbf@AA=0@AS@Steam@AA=2@ASres@AA=4@ASsc@AA=302000@ASbf@AA=0@AS@Steam@AA=3@ASres@AA=5@ASsc@AA=100000@ASbf@AA=0@AS@Steam@AA=1@ASres@AA=6@ASsc@AA=200@ASbf@AA=0@AS@S"); System.out.println(unescape); } } } ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-huya/src/test/java/tech/ordinaryroad/live/chat/client/huya/util/HuyaCodecUtilTest.java
@@ -26,7 +26,6 @@ ConnectParaInfo wsConnectParaInfo = ConnectParaInfo.newWSConnectParaInfo(ver, exp, appSrc); byte[] byteArray = wsConnectParaInfo.toByteArray(); String s = HuyaCodecUtil.ab2str(byteArray); System.out.println(s); } @Test @@ -36,7 +35,6 @@ String s = HuyaCodecUtil.ab2str(byteArray); String btoa = HuyaCodecUtil.btoa(s); System.out.println(btoa); } @Test @@ -67,7 +65,6 @@ LiveLaunchReq liveLaunchReq = new LiveLaunchReq(); liveLaunchReq = wupReq.getUniAttribute().getByClass("tReq", liveLaunchReq); UserId tId = liveLaunchReq.getTId(); System.out.println(wupReq.getTarsServantRequest().getVersion()); } @Test @@ -96,4 +93,4 @@ UserId tId = getLivingInfoReq.getTId(); } } } ruoyi-common/ruoyi-common-live/live-chat-clients/live-chat-client-kuaishou/src/test/java/tech/ordinaryroad/live/chat/client/kuaishou/api/KuaishouApisTest.java
@@ -28,13 +28,5 @@ @Test void sendComment() { System.out.println(KuaishouApis.sendComment(System.getenv("cookie"), "3x6pb6bcmjrarvs", KuaishouApis.SendCommentRequest .builder() .liveStreamId("XKLoBv2mAEo") .content("666666a") .build() )); } } } 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-common/ruoyi-common-wechat/src/main/java/org/ruoyi/common/wechat/itchat4j/client/SingleHttpClient.java
@@ -84,7 +84,6 @@ if (params != null) { String paramStr = EntityUtils.toString(new UrlEncodedFormEntity(params, Consts.UTF_8)); httpGet = new HttpGet(url + "?" + paramStr); // System.out.println(url + "?" + paramStr); } else { httpGet = new HttpGet(url); } ruoyi-common/ruoyi-common-wechat/src/main/java/org/ruoyi/common/wechat/itchat4j/utils/tools/CommonTools.java
@@ -292,9 +292,6 @@ sb.append(content.substring(lastStart)); } if (sb.length() != 0) { System.out.println(EmojiParser.parseToUnicode(sb.toString())); System.out.println(EmojiParser.parseToAliases(EmojiParser.parseToUnicode(sb.toString()))); System.out.println(EmojiParser.removeAllEmojis(sb.toString())); } } ruoyi-common/ruoyi-common-wechat/src/main/java/org/ruoyi/common/wechat/web/utils/MD5Util.java
@@ -61,7 +61,6 @@ } public static void main(String[] args) { System.out.println(MD5Encrypt("wxwobot")); } 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
@@ -1,6 +1,7 @@ package org.ruoyi.domain; import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; @@ -46,7 +47,7 @@ /** * 模åä»·æ ¼ */ private Long modelPrice; private Double modelPrice; /** * 计费类å @@ -68,6 +69,7 @@ */ private String apiHost; /** * å¯é¥ */ ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java
@@ -1,5 +1,6 @@ package org.ruoyi.domain.bo; import com.alibaba.excel.annotation.ExcelProperty; import org.ruoyi.common.core.validate.AddGroup; import org.ruoyi.common.core.validate.EditGroup; import org.ruoyi.domain.ChatModel; @@ -48,7 +49,7 @@ * 模åä»·æ ¼ */ @NotNull(message = "模åä»·æ ¼ä¸è½ä¸ºç©º", groups = { AddGroup.class, EditGroup.class }) private Long modelPrice; private Double modelPrice; /** * 计费类å @@ -79,6 +80,7 @@ @NotBlank(message = "å¯é¥ä¸è½ä¸ºç©º", groups = { AddGroup.class, EditGroup.class }) private String apiKey; /** * 夿³¨ */ 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; /** * 计费类å @@ -93,6 +93,5 @@ */ @ExcelProperty(value = "夿³¨") private String remark; } ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
@@ -103,6 +103,18 @@ <version>1.19.6</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-document-parser-apache-tika</artifactId> </dependency> <!-- ruoyi-knowledge-api/pom.xml --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.17.0</version> </dependency> </dependencies> </project> ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ExcelFileLoader.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package org.ruoyi.chain.loader; import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chain.split.TextSplitter; import org.ruoyi.common.core.exception.UtilException; import org.springframework.stereotype.Component; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; @Component @AllArgsConstructor @Slf4j public class ExcelFileLoader implements ResourceLoader { private final TextSplitter textSplitter; private static final int DEFAULT_BUFFER_SIZE = 8192; @Override public String getContent(InputStream inputStream) { // 使ç¨å¸¦ç¼å²çè¾å ¥æµå è£ ï¼ä¿æåæµä¸èªå¨å ³éï¼ try (InputStream bufferedStream = new BufferedInputStream(inputStream, DEFAULT_BUFFER_SIZE)) { ApacheTikaDocumentParser apacheTikaDocumentParser = new ApacheTikaDocumentParser(); Document document = apacheTikaDocumentParser.parse(bufferedStream); return document.text(); } catch (IOException e) { String errorMsg = "Excelæä»¶æµè¯»å失败"; throw new UtilException(errorMsg, e); } catch (RuntimeException e) { String errorMsg = "Excelå 容解æå¼å¸¸"; throw new UtilException(errorMsg, e); } } @Override public List<String> getChunkList(String content, String kid) { return textSplitter.split(content, kid); } } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoaderFactory.java
@@ -1,10 +1,7 @@ package org.ruoyi.chain.loader; import lombok.AllArgsConstructor; import org.ruoyi.chain.split.CharacterTextSplitter; import org.ruoyi.chain.split.CodeTextSplitter; import org.ruoyi.chain.split.MarkdownTextSplitter; import org.ruoyi.chain.split.TokenTextSplitter; import org.ruoyi.chain.split.*; import org.ruoyi.constant.FileType; import org.springframework.stereotype.Component; @@ -16,6 +13,8 @@ private final CodeTextSplitter codeTextSplitter; private final MarkdownTextSplitter markdownTextSplitter; private final TokenTextSplitter tokenTextSplitter; private final ExcelTextSplitter excelTextSplitter; public ResourceLoader getLoaderByFileType(String fileType){ if (FileType.isTextFile(fileType)){ return new TextFileLoader(characterTextSplitter); @@ -25,6 +24,8 @@ return new PdfFileLoader(characterTextSplitter); } else if (FileType.isMdFile(fileType)) { return new MarkDownFileLoader(markdownTextSplitter); }else if (FileType.isExcel(fileType)) { return new ExcelFileLoader(excelTextSplitter); }else if (FileType.isCodeFile(fileType)) { return new CodeFileLoader(codeTextSplitter); }else { ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/ExcelTextSplitter.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package org.ruoyi.chain.split; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.List; @Component @AllArgsConstructor @Slf4j public class ExcelTextSplitter implements TextSplitter{ @Override public List<String> split(String content, String kid) { return null; } } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/FileType.java
@@ -7,6 +7,8 @@ public static final String DOC = "doc"; public static final String DOCX = "docx"; public static final String PDF = "pdf"; public static final String XLS = "xls"; public static final String XLSX = "xlsx"; public static final String LOG = "log"; public static final String XML = "xml"; @@ -88,4 +90,13 @@ } } public static boolean isExcel(String type){ if (type.equalsIgnoreCase(XLS) || type.equalsIgnoreCase(XLSX)){ return true; } else { return false; } } } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
@@ -11,6 +11,7 @@ import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.filter.Filter; import dev.langchain4j.store.embedding.filter.comparison.IsEqualTo; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; import dev.langchain4j.store.embedding.milvus.MilvusEmbeddingStore; import dev.langchain4j.store.embedding.qdrant.QdrantEmbeddingStore; import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore; @@ -39,11 +40,11 @@ private final ConfigService configService; Map<String,EmbeddingStore<TextSegment>> storeMap; Map<String,EmbeddingStore<TextSegment>> storeMap = new HashMap<>(); @Override public void createSchema(String kid,String modelName) { EmbeddingStore<TextSegment> embeddingStore = WeaviateEmbeddingStore.builder().build(); EmbeddingStore<TextSegment> embeddingStore; switch (modelName) { case "weaviate" -> { String protocol = configService.getConfigValue("weaviate", "protocol"); @@ -78,6 +79,10 @@ .collectionName(collectionName) .build(); } default -> { //使ç¨å å embeddingStore = new InMemoryEmbeddingStore<>(); } } storeMap.put(kid,embeddingStore); } 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/controller/chat/ChatController.java
@@ -28,7 +28,7 @@ /** * æè¿°ï¼è天管ç * è天管ç * * @author ageerle@163.com * @date 2023-03-01 @@ -70,8 +70,7 @@ @PostMapping("/audio") @ResponseBody public WhisperResponse audio(@RequestParam("file") MultipartFile file) { WhisperResponse whisperResponse = sseService.speechToTextTranscriptionsV2(file); return whisperResponse; return sseService.speechToTextTranscriptionsV2(file); } /** 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(); @@ -56,7 +62,6 @@ OllamaStreamHandler streamHandler = (s) -> { String substr = s.substring(response.length()); response.append(substr); System.out.println(substr); try { emitter.send(substr); } catch (IOException e) { @@ -73,4 +78,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()); 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 script/sql/update/20250509.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ ALTER TABLE `chat_model` ADD COLUMN `api_url` varchar(50) NULL COMMENT '请æ±åç¼' AFTER `api_key`; INSERT INTO `chat_config` (`id`, `category`, `config_name`, `config_value`, `config_dict`, `create_dept`, `create_time`, `create_by`, `update_by`, `update_time`, `remark`, `version`, `del_flag`, `update_ip`, `tenant_id`) VALUES (1779450794872414211, 'chat', 'apiUrl', 'v1/chat/completions', 'API 请æ±åç¼', 103, '2024-04-14 18:05:05', '1', '1', '2025-04-23 22:29:04', NULL, NULL, '0', NULL, 0);