| | |
| | | |
| | | ruoyi-modules/ruoyi-generator/src/main/resources/vm/vben5 |
| | | |
| | | README.md |
| | | |
| | | ###################################################################### |
| | | # IDE |
| | | |
| | |
| | | ### ç³»ç»ä½éª |
| | | - ç¨æ·ç«¯ï¼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 |
| | |
| | | - é
å¥ææ¡£: 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);"/> |
| | |
| | | <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;"> |
| | |
| | | ### 注æäºé¡¹ |
| | | - vbenæ¨¡æ¿ |
| | | |
| | | |
| | | Qï¼vben5 çæ¨¡æ¿é»è®¤æ¯æ²¡æçåï¼ |
| | | |
| | | Aï¼vbenæ¨¡æ¿æ¯æ¶è´¹ç 请èç³»vben-vue-plusä½è
è·åã |
| | |
| | | ### çæ¬æ§å¶ |
| | | |
| | | 该项ç®ä½¿ç¨Gitè¿è¡çæ¬ç®¡çãæ¨å¯ä»¥å¨repositoryåçå½åå¯ç¨çæ¬ã |
| | | |
| | | |
| | | |
| | | ### çæè¯´æ |
| | |
| | | |
| | | #### é¡¹ç®ææ¡£ |
| | | 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 |
| | |
| | | [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ï¼ |
| | | |
| | |
| | | <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> |
| | | |
| | | |
| | | |
| | |
| | | # æ é¢ |
| | | title: 'æ é¢ï¼RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»_æ¥å£ææ¡£' |
| | | # æè¿° |
| | | description: 'æè¿°ï¼ç¨äºç®¡çé墿ä¸å
¬å¸ç人åä¿¡æ¯,å
·ä½å
æ¬XXX,XXX模å...' |
| | | description: ' ç¨äºç®¡çé墿ä¸å
¬å¸ç人åä¿¡æ¯,å
·ä½å
æ¬XXX,XXX模å...' |
| | | # çæ¬ |
| | | version: 'çæ¬å·: ${ruoyi.version}' |
| | | # ä½è
ä¿¡æ¯ |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @date 2023-03-10 |
| | |
| | | package org.ruoyi.common.chat.constant; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-06 |
| | |
| | | |
| | | 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; |
| | | |
| | | } |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼é颿¶èä¿¡æ¯ |
| | | * é颿¶èä¿¡æ¯ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-08 |
| | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * æè¿°ï¼ä½é¢æ¥è¯¢æ¥å£è¿åå¼ |
| | | * ä½é¢æ¥è¯¢æ¥å£è¿åå¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-18 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼é颿¶èå表 |
| | | * é颿¶èå表 |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-08 |
| | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-18 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-18 |
| | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * æè¿°ï¼é颿¶èå表 |
| | | * é颿¶èå表 |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-08 |
| | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-08 |
| | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æè¿°ï¼è´¦æ·ä¿¡æ¯ |
| | | * è´¦æ·ä¿¡æ¯ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-08 |
| | |
| | | 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 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 1.1.2 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ chat模ååæ° |
| | | * chat模ååæ° |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-03-02 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ chatçæ¡ç±» |
| | | * chatçæ¡ç±» |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-03-02 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ chat模åé带å¾ççåæ° |
| | | * ï¼ chat模åé带å¾ççåæ° |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 1.1.2 |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https://www.unfbx.com |
| | | * @since 1.1.2 |
| | |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | /** |
| | | * æè¿°ï¼å½æ°è°ç¨è¿åå¼ |
| | | * 彿°è°ç¨è¿åå¼ |
| | | * |
| | | * @author https://www.unfbx.com |
| | | * @since 2023-06-14 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼æ¹æ³åæ°å®ä½ç±»ï¼å®ä¾æ°æ®å¦ä¸ |
| | | * æ¹æ³åæ°å®ä½ç±»ï¼å®ä¾æ°æ®å¦ä¸ |
| | | * <pre> |
| | | * { |
| | | * "name": "get_current_weather", |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https://www.unfbx.com |
| | | * 2023-11-10 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | | */ |
| | |
| | | import java.io.Serializable; |
| | | import java.util.List; |
| | | /** |
| | | * æè¿°ï¼æ¹æ³åæ°ç±»ï¼æ©å±åæ°å¯ä»¥ç»§æ¿Parametersèªå·±å®ç° |
| | | * æ¹æ³åæ°ç±»ï¼æ©å±åæ°å¯ä»¥ç»§æ¿Parametersèªå·±å®ç° |
| | | * åèï¼ |
| | | * <pre> |
| | | * { |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | import java.util.List; |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * æè¿°ï¼ é®é¢ç±» |
| | | * é®é¢ç±» |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-11 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ çæ¡ç±» |
| | | * çæ¡ç±» |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-11 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼ææ¬å®¡æ ¸ï¼ææè¯é´å« |
| | | * ææ¬å®¡æ ¸ï¼ææè¯é´å« |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼è¯é³è½¬æå |
| | | * è¯é³è½¬æå |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼OpenAIæµå¼è¾åºSocketæ¥æ¶ |
| | | * OpenAIæµå¼è¾åºSocketæ¥æ¶ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @date 2023-03-23 |
| | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * æè¿°ï¼ open ai宿¹apiæ¥å£ |
| | | * open ai宿¹apiæ¥å£ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | |
| | | |
| | | /** |
| | | * æè¿°ï¼ open ai 客æ·ç«¯ |
| | | * open ai 客æ·ç«¯ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-02-11 |
| | |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * æè¿°ï¼ open ai 客æ·ç«¯ |
| | | * open ai 客æ·ç«¯ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-28 |
| | |
| | | * èªå®ä¹api host使ç¨builderçæ¹å¼æé client |
| | | */ |
| | | private String apiHost; |
| | | |
| | | /** |
| | | * èªå®ä¹url å
¼å®¹å¤ä¸ªå¹³å° |
| | | */ |
| | | private String apiUrl; |
| | | |
| | | /** |
| | | * èªå®ä¹çokHttpClient |
| | |
| | | } |
| | | apiHost = builder.apiHost; |
| | | |
| | | if (StrUtil.isBlank(builder.apiUrl)) { |
| | | builder.apiUrl = OpenAIConst.apiUrl; |
| | | } |
| | | apiUrl = builder.apiUrl; |
| | | |
| | | if (Objects.isNull(builder.keyStrategy)) { |
| | | builder.keyStrategy = new KeyRandomStrategy(); |
| | | } |
| | |
| | | } |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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); |
| | |
| | | |
| | | 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); |
| | |
| | | */ |
| | | private String apiHost; |
| | | |
| | | private String apiUrl; |
| | | |
| | | /** |
| | | * èªå®ä¹OkhttpClient |
| | | */ |
| | |
| | | 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; |
| | |
| | | .build(); |
| | | |
| | | try (Response response = client.newCall(request).execute()) { |
| | | System.out.println(response.body().string()); |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | package org.ruoyi.common.chat.openai.exception; |
| | | |
| | | /** |
| | | * æè¿°ï¼ é误 |
| | | * é误 |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-11 |
| | |
| | | package org.ruoyi.common.chat.openai.exception; |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-11 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼éæºçç¥ |
| | | * éæºçç¥ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-03 |
| | |
| | | import java.util.function.Function; |
| | | |
| | | /** |
| | | * æè¿°ï¼key çè·åçç¥ |
| | | * key çè·åçç¥ |
| | | * jdké»è®¤å®ç° |
| | | * @see Function |
| | | * |
| | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * æè¿°ï¼è¯·æ±å¢å header apikey |
| | | * 请æ±å¢å header apikey |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-23 |
| | |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * æè¿°ï¼å¨æå¤çkeyçé´ææ¦æªå¨ |
| | | * 卿å¤çkeyçé´ææ¦æªå¨ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-25 |
| | |
| | | import okhttp3.logging.HttpLoggingInterceptor; |
| | | |
| | | /** |
| | | * æè¿°ï¼ æ¥å¿ |
| | | * æ¥å¿ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-28 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼openai è¿åå¼å¤çInterceptor |
| | | * openai è¿åå¼å¤çInterceptor |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-23 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼å¯¹è¯è¯·æ±å¯¹è±¡ |
| | | * 对è¯è¯·æ±å¯¹è±¡ |
| | | * |
| | | * @author ageerle |
| | | * @sine 2023-04-08 |
| | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @sine 2023-04-08 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼ sse |
| | | * sse |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-28 |
| | |
| | | import org.ruoyi.common.chat.openai.plugin.PluginAbstract; |
| | | |
| | | /** |
| | | * æè¿°ï¼ æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ |
| | | * æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-08-18 |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼ æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ |
| | | * æä»¶å¼åè¿åä¿¡æ¯æ¶ésseçå¬å¨ |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-08-18 |
| | |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * æè¿°ï¼token计ç®å·¥å
·ç±» |
| | | * token计ç®å·¥å
·ç±» |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-04-04 |
| | |
| | | import org.springframework.context.ApplicationEvent; |
| | | |
| | | /** |
| | | * æè¿°ï¼å®ä¹ä¸ä¸ªäºä»¶ç±»ï¼ç¨äºéç¥é
ç½®åå |
| | | * å®ä¹ä¸ä¸ªäºä»¶ç±»ï¼ç¨äºéç¥é
ç½®åå |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2024/5/19 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æè¿°ï¼ chatçæ¡ç±» |
| | | * chatçæ¡ç±» |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-03-02 |
| | |
| | | |
| | | 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; |
| | |
| | | .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) { |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @since 2023-03-02 |
| | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * æè¿°ï¼ |
| | | * |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * 2023-02-15 |
| | |
| | | Map<String, Object> stringObjectMap = DouyuCodecUtil.parseDouyuSttStringToMap(mapkb); |
| | | assertNotNull(stringObjectMap); |
| | | stringObjectMap.forEach((string, o) -> { |
| | | System.out.println(string); |
| | | }); |
| | | } |
| | | |
| | |
| | | Map<String, Object> stringObjectMap = DouyuCodecUtil.parseDouyuSttStringToMap(pdrinfo); |
| | | assertNotNull(stringObjectMap); |
| | | stringObjectMap.forEach((string, o) -> { |
| | | System.out.println(string); |
| | | }); |
| | | } |
| | | |
| | |
| | | }}); |
| | | }}); |
| | | }}); |
| | | 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()); |
| | | } |
| | | |
| | |
| | | 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); |
| | |
| | | @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); |
| | | } |
| | | } |
| | | } |
| | |
| | | ConnectParaInfo wsConnectParaInfo = ConnectParaInfo.newWSConnectParaInfo(ver, exp, appSrc); |
| | | byte[] byteArray = wsConnectParaInfo.toByteArray(); |
| | | String s = HuyaCodecUtil.ab2str(byteArray); |
| | | System.out.println(s); |
| | | } |
| | | |
| | | @Test |
| | |
| | | String s = HuyaCodecUtil.ab2str(byteArray); |
| | | |
| | | String btoa = HuyaCodecUtil.btoa(s); |
| | | System.out.println(btoa); |
| | | } |
| | | |
| | | @Test |
| | |
| | | LiveLaunchReq liveLaunchReq = new LiveLaunchReq(); |
| | | liveLaunchReq = wupReq.getUniAttribute().getByClass("tReq", liveLaunchReq); |
| | | UserId tId = liveLaunchReq.getTId(); |
| | | System.out.println(wupReq.getTarsServantRequest().getVersion()); |
| | | } |
| | | |
| | | @Test |
| | |
| | | |
| | | UserId tId = getLivingInfoReq.getTId(); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | @Test |
| | | void sendComment() { |
| | | System.out.println(KuaishouApis.sendComment(System.getenv("cookie"), |
| | | "3x6pb6bcmjrarvs", |
| | | KuaishouApis.SendCommentRequest |
| | | .builder() |
| | | .liveStreamId("XKLoBv2mAEo") |
| | | .content("666666a") |
| | | .build() |
| | | )); |
| | | } |
| | | } |
| | | } |
| | |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * æè¿°ï¼å建ä¸ä¸ªçå¬å¨ï¼ç¨äºå¤çé
ç½®ååäºä»¶ |
| | | * å建ä¸ä¸ªçå¬å¨ï¼ç¨äºå¤çé
ç½®ååäºä»¶ |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2024/5/19 |
| | |
| | | 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); |
| | | } |
| | |
| | | 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())); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | System.out.println(MD5Encrypt("wxwobot")); |
| | | } |
| | | |
| | | |
| | |
| | | <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> |
| | |
| | | package org.ruoyi.domain; |
| | | |
| | | |
| | | import com.alibaba.excel.annotation.ExcelProperty; |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | /** |
| | | * 模åä»·æ ¼ |
| | | */ |
| | | private Long modelPrice; |
| | | private Double modelPrice; |
| | | |
| | | /** |
| | | * 计费类å |
| | |
| | | */ |
| | | private String apiHost; |
| | | |
| | | |
| | | /** |
| | | * å¯é¥ |
| | | */ |
| | |
| | | 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; |
| | |
| | | * 模åä»·æ ¼ |
| | | */ |
| | | @NotNull(message = "模åä»·æ ¼ä¸è½ä¸ºç©º", groups = { AddGroup.class, EditGroup.class }) |
| | | private Long modelPrice; |
| | | private Double modelPrice; |
| | | |
| | | /** |
| | | * 计费类å |
| | |
| | | @NotBlank(message = "å¯é¥ä¸è½ä¸ºç©º", groups = { AddGroup.class, EditGroup.class }) |
| | | private String apiKey; |
| | | |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æè¿°ï¼ç¿»è¯è¯·æ±å¯¹è±¡ |
| | | * ç¿»è¯è¯·æ±å¯¹è±¡ |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2025/1/13 |
| | |
| | | * 模åä»·æ ¼ |
| | | */ |
| | | @ExcelProperty(value = "模åä»·æ ¼") |
| | | private Long modelPrice; |
| | | private Double modelPrice; |
| | | |
| | | /** |
| | | * 计费类å |
| | |
| | | */ |
| | | @ExcelProperty(value = "夿³¨") |
| | | private String remark; |
| | | |
| | | |
| | | } |
| | |
| | | <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> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | 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); |
| | |
| | | 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 { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | 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"; |
| | |
| | | } |
| | | } |
| | | |
| | | public static boolean isExcel(String type){ |
| | | if (type.equalsIgnoreCase(XLS) || type.equalsIgnoreCase(XLSX)){ |
| | | return true; |
| | | } |
| | | else { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | |
| | | 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"); |
| | |
| | | .collectionName(collectionName) |
| | | .build(); |
| | | } |
| | | default -> { |
| | | //使ç¨å
å |
| | | embeddingStore = new InMemoryEmbeddingStore<>(); |
| | | } |
| | | } |
| | | storeMap.put(kid,embeddingStore); |
| | | } |
| | |
| | | |
| | | |
| | | /** |
| | | * æè¿°ï¼ç¨æ·å¯ç ä¿®æ¹bo |
| | | * ç¨æ·å¯ç ä¿®æ¹bo |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2025/3/9 |
| | |
| | | |
| | | |
| | | /** |
| | | * æè¿°ï¼è天管ç |
| | | * è天管ç |
| | | * |
| | | * @author ageerle@163.com |
| | | * @date 2023-03-01 |
| | |
| | | @PostMapping("/audio") |
| | | @ResponseBody |
| | | public WhisperResponse audio(@RequestParam("file") MultipartFile file) { |
| | | WhisperResponse whisperResponse = sseService.speechToTextTranscriptionsV2(file); |
| | | return whisperResponse; |
| | | return sseService.speechToTextTranscriptionsV2(file); |
| | | } |
| | | |
| | | /** |
| | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æè¿°ï¼æçè§é¢è¯·æ±å¯¹è±¡ |
| | | * æçè§é¢è¯·æ±å¯¹è±¡ |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2024/6/27 |
| | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * æè¿°ï¼çææè¯ |
| | | * çææè¯ |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2024/6/27 |
| | |
| | | public enum ChatModeType { |
| | | OLLAMA("ollama", "æ¬å°é¨ç½²æ¨¡å"), |
| | | CHAT("chat", "ä¸è½¬æ¨¡å"), |
| | | DIFY("dify", "DIFY"), |
| | | COZE("coze", "æ£å"), |
| | | VECTOR("vector", "ç¥è¯åºå鿍¡å"); |
| | | |
| | | private final String code; |
| | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * æè¿°ï¼æ¯å¦æ¾ç¤º |
| | | * æ¯å¦æ¾ç¤º |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2025/4/10 |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æè¿°ï¼OpenAIEventSourceListener |
| | | * OpenAIEventSourceListener |
| | | * |
| | | * @author https:www.unfbx.com |
| | | * @date 2023-02-22 |
| | |
| | | * @param chatRequest 请æ±å¯¹è±¡ |
| | | */ |
| | | SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter); |
| | | |
| | | |
| | | /** |
| | | * è·åæ¤æå¡æ¯æç模åç±»å« |
| | | */ |
| | | String getCategory(); |
| | | } |
| | |
| | | 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 |
| | |
| | | |
| | | 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); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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(); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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(); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | 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(); |
| | |
| | | OllamaStreamHandler streamHandler = (s) -> { |
| | | String substr = s.substring(response.length()); |
| | | response.append(substr); |
| | | System.out.println(substr); |
| | | try { |
| | | emitter.send(substr); |
| | | } catch (IOException e) { |
| | |
| | | return emitter; |
| | | } |
| | | |
| | | @Override |
| | | public String getCategory() { |
| | | return ChatModeType.OLLAMA.getCode(); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | @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()); |
| | |
| | | return this.chatClient.prompt(prompt).call().content(); |
| | | } |
| | | |
| | | @Override |
| | | public String getCategory() { |
| | | return ChatModeType.CHAT.getCode(); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | |
| | | private final IChatModelService chatModelService; |
| | | |
| | | private final OpenAIServiceImpl openAIService; |
| | | |
| | | private final OllamaServiceImpl ollamaService; |
| | | private final ChatServiceFactory chatServiceFactory; |
| | | |
| | | private final IChatSessionService chatSessionService; |
| | | |
| | |
| | | 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()); |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®æ¨¡ååç§°åç¼è°ç¨ä¸åçå¤çé»è¾ |
| | | */ |
| | | private void switchModelAndHandle(ChatRequest chatRequest,SseEmitter emitter) { |
| | | // è°ç¨ollamaä¸é¨ç½²çæ¬å°æ¨¡å |
| | | if (ChatModeType.OLLAMA.getCode().equals(chatModelVo.getCategory())) { |
| | | ollamaService.chat(chatRequest,emitter); |
| | | } else { |
| | | openAIService.chat(chatRequest,emitter); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºæ¶æ¯å表 |
| | |
| | | import java.util.UUID; |
| | | |
| | | /** |
| | | * æè¿°ï¼å¾®ä¿¡å
¬ä¼å·ç»å½ |
| | | * 微信å
¬ä¼å·ç»å½ |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2025/4/30 |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |