Commit 9de9e938bf6d113aac62f419e7db35518e8b4536
1 parent
7fca38ce
【新增】AI:增加 ollama 模型的接入
Showing
5 changed files
with
39 additions
and
20 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/config/AiChatClientFactory.java
| @@ -6,6 +6,7 @@ import org.springframework.ai.chat.StreamingChatClient; | @@ -6,6 +6,7 @@ import org.springframework.ai.chat.StreamingChatClient; | ||
| 6 | import org.springframework.ai.models.tongyi.QianWenChatClient; | 6 | import org.springframework.ai.models.tongyi.QianWenChatClient; |
| 7 | import org.springframework.ai.models.xinghuo.XingHuoChatClient; | 7 | import org.springframework.ai.models.xinghuo.XingHuoChatClient; |
| 8 | import org.springframework.ai.models.yiyan.YiYanChatClient; | 8 | import org.springframework.ai.models.yiyan.YiYanChatClient; |
| 9 | +import org.springframework.ai.ollama.OllamaChatClient; | ||
| 9 | import org.springframework.beans.factory.annotation.Autowired; | 10 | import org.springframework.beans.factory.annotation.Autowired; |
| 10 | import org.springframework.context.ApplicationContext; | 11 | import org.springframework.context.ApplicationContext; |
| 11 | import org.springframework.stereotype.Component; | 12 | import org.springframework.stereotype.Component; |
| @@ -36,12 +37,17 @@ public class AiChatClientFactory { | @@ -36,12 +37,17 @@ public class AiChatClientFactory { | ||
| 36 | 37 | ||
| 37 | // TODO yunai 要不再加一个接口,让他们拥有 ChatClient、StreamingChatClient 功能 | 38 | // TODO yunai 要不再加一个接口,让他们拥有 ChatClient、StreamingChatClient 功能 |
| 38 | public StreamingChatClient getStreamingChatClient(AiPlatformEnum platformEnum) { | 39 | public StreamingChatClient getStreamingChatClient(AiPlatformEnum platformEnum) { |
| 40 | +// if (true) { | ||
| 41 | +// return applicationContext.getBean(OllamaChatClient.class); | ||
| 42 | +// } | ||
| 39 | if (AiPlatformEnum.QIAN_WEN == platformEnum) { | 43 | if (AiPlatformEnum.QIAN_WEN == platformEnum) { |
| 40 | return applicationContext.getBean(QianWenChatClient.class); | 44 | return applicationContext.getBean(QianWenChatClient.class); |
| 41 | } else if (AiPlatformEnum.YI_YAN == platformEnum) { | 45 | } else if (AiPlatformEnum.YI_YAN == platformEnum) { |
| 42 | return applicationContext.getBean(YiYanChatClient.class); | 46 | return applicationContext.getBean(YiYanChatClient.class); |
| 43 | } else if (AiPlatformEnum.XING_HUO == platformEnum) { | 47 | } else if (AiPlatformEnum.XING_HUO == platformEnum) { |
| 44 | return applicationContext.getBean(XingHuoChatClient.class); | 48 | return applicationContext.getBean(XingHuoChatClient.class); |
| 49 | + } else if (AiPlatformEnum.OLLAMA == platformEnum) { | ||
| 50 | + return applicationContext.getBean(OllamaChatClient.class); | ||
| 45 | } | 51 | } |
| 46 | throw new IllegalArgumentException("不支持的 chat client!"); | 52 | throw new IllegalArgumentException("不支持的 chat client!"); |
| 47 | } | 53 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java
| @@ -127,7 +127,7 @@ public class AiChatServiceImpl implements AiChatService { | @@ -127,7 +127,7 @@ public class AiChatServiceImpl implements AiChatService { | ||
| 127 | // 1.1 校验对话存在 | 127 | // 1.1 校验对话存在 |
| 128 | AiChatConversationDO conversation = chatConversationService.validateExists(sendReqVO.getConversationId()); | 128 | AiChatConversationDO conversation = chatConversationService.validateExists(sendReqVO.getConversationId()); |
| 129 | if (ObjUtil.notEqual(conversation.getUserId(), userId)) { | 129 | if (ObjUtil.notEqual(conversation.getUserId(), userId)) { |
| 130 | - throw exception(CHAT_CONVERSATION_NOT_EXISTS); | 130 | + throw exception(CHAT_CONVERSATION_NOT_EXISTS); // TODO 芋艿:异常情况的对接; |
| 131 | } | 131 | } |
| 132 | // 1.2 校验模型 | 132 | // 1.2 校验模型 |
| 133 | AiChatModelDO model = chatModalService.validateChatModel(conversation.getModelId()); | 133 | AiChatModelDO model = chatModalService.validateChatModel(conversation.getModelId()); |
yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml
| @@ -25,6 +25,12 @@ | @@ -25,6 +25,12 @@ | ||
| 25 | </dependency> | 25 | </dependency> |
| 26 | 26 | ||
| 27 | <dependency> | 27 | <dependency> |
| 28 | + <groupId>io.springboot.ai</groupId> | ||
| 29 | + <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> | ||
| 30 | + <version>1.0.3</version> | ||
| 31 | + </dependency> | ||
| 32 | + | ||
| 33 | + <dependency> | ||
| 28 | <groupId>cn.iocoder.boot</groupId> | 34 | <groupId>cn.iocoder.boot</groupId> |
| 29 | <artifactId>yudao-common</artifactId> | 35 | <artifactId>yudao-common</artifactId> |
| 30 | </dependency> | 36 | </dependency> |
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/enums/AiPlatformEnum.java
| 1 | package cn.iocoder.yudao.framework.ai.core.enums; | 1 | package cn.iocoder.yudao.framework.ai.core.enums; |
| 2 | 2 | ||
| 3 | -import com.google.common.collect.Lists; | ||
| 4 | import lombok.AllArgsConstructor; | 3 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Getter; | 4 | import lombok.Getter; |
| 6 | 5 | ||
| 7 | -import java.util.List; | ||
| 8 | - | ||
| 9 | // TODO 芋艿:这块,看看要不要调整下; | 6 | // TODO 芋艿:这块,看看要不要调整下; |
| 10 | /** | 7 | /** |
| 11 | * ai 模型平台 | 8 | * ai 模型平台 |
| @@ -17,29 +14,31 @@ import java.util.List; | @@ -17,29 +14,31 @@ import java.util.List; | ||
| 17 | @AllArgsConstructor | 14 | @AllArgsConstructor |
| 18 | public enum AiPlatformEnum { | 15 | public enum AiPlatformEnum { |
| 19 | 16 | ||
| 17 | + OPENAI("OpenAI", "OpenAI"), | ||
| 18 | + OLLAMA("dall", "dall"), | ||
| 19 | + | ||
| 20 | YI_YAN("yiyan", "一言"), | 20 | YI_YAN("yiyan", "一言"), |
| 21 | QIAN_WEN("qianwen", "千问"), | 21 | QIAN_WEN("qianwen", "千问"), |
| 22 | XING_HUO("xinghuo", "星火"), | 22 | XING_HUO("xinghuo", "星火"), |
| 23 | - OPENAI("OpenAI", "OpenAI"), | ||
| 24 | OPEN_AI_DALL("dall", "dall"), | 23 | OPEN_AI_DALL("dall", "dall"), |
| 25 | - MIDJOURNEY("midjourney", "midjourney"), | 24 | + MIDJOURNEY("Ollama", "Ollama"), |
| 26 | 25 | ||
| 27 | ; | 26 | ; |
| 28 | 27 | ||
| 29 | - private String platform; | ||
| 30 | - private String name; | ||
| 31 | - | ||
| 32 | - public static List<AiPlatformEnum> CHAT_PLATFORM_LIST = Lists.newArrayList( | ||
| 33 | - AiPlatformEnum.YI_YAN, | ||
| 34 | - AiPlatformEnum.QIAN_WEN, | ||
| 35 | - AiPlatformEnum.XING_HUO, | ||
| 36 | - AiPlatformEnum.OPENAI | ||
| 37 | - ); | ||
| 38 | - | ||
| 39 | - public static List<AiPlatformEnum> IMAGE_PLATFORM_LIST = Lists.newArrayList( | ||
| 40 | - AiPlatformEnum.OPEN_AI_DALL, | ||
| 41 | - AiPlatformEnum.MIDJOURNEY | ||
| 42 | - ); | 28 | + private final String platform; |
| 29 | + private final String name; | ||
| 30 | + | ||
| 31 | +// public static List<AiPlatformEnum> CHAT_PLATFORM_LIST = Lists.newArrayList( | ||
| 32 | +// AiPlatformEnum.YI_YAN, | ||
| 33 | +// AiPlatformEnum.QIAN_WEN, | ||
| 34 | +// AiPlatformEnum.XING_HUO, | ||
| 35 | +// AiPlatformEnum.OPENAI | ||
| 36 | +// ); | ||
| 37 | +// | ||
| 38 | +// public static List<AiPlatformEnum> IMAGE_PLATFORM_LIST = Lists.newArrayList( | ||
| 39 | +// AiPlatformEnum.OPEN_AI_DALL, | ||
| 40 | +// AiPlatformEnum.MIDJOURNEY | ||
| 41 | +// ); | ||
| 43 | 42 | ||
| 44 | public static AiPlatformEnum validatePlatform(String platform) { | 43 | public static AiPlatformEnum validatePlatform(String platform) { |
| 45 | for (AiPlatformEnum platformEnum : AiPlatformEnum.values()) { | 44 | for (AiPlatformEnum platformEnum : AiPlatformEnum.values()) { |
yudao-server/src/main/resources/application.yaml
| @@ -142,6 +142,14 @@ spring: | @@ -142,6 +142,14 @@ spring: | ||
| 142 | listener: | 142 | listener: |
| 143 | missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 | 143 | missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 |
| 144 | 144 | ||
| 145 | +--- #################### AI 相关配置 #################### | ||
| 146 | + | ||
| 147 | +spring.ai: | ||
| 148 | + ollama: | ||
| 149 | + base-url: http://127.0.0.1:11434 | ||
| 150 | + chat: | ||
| 151 | + model: llama3 | ||
| 152 | + | ||
| 145 | --- #################### 芋道相关配置 #################### | 153 | --- #################### 芋道相关配置 #################### |
| 146 | 154 | ||
| 147 | yudao: | 155 | yudao: |