Commit ebd5cbfca291b645f8843314644c30cdc1b0a9c0
1 parent
f4b3bb5a
基层 open ai 添加 chat 聊天
Showing
8 changed files
with
168 additions
and
0 deletions
yudao-module-ai/yudao-module-ai-api/pom.xml
| @@ -17,4 +17,22 @@ | @@ -17,4 +17,22 @@ | ||
| 17 | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | 17 | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| 18 | </properties> | 18 | </properties> |
| 19 | 19 | ||
| 20 | + <dependencies> | ||
| 21 | + <!-- yudao-common --> | ||
| 22 | + <dependency> | ||
| 23 | + <groupId>cn.iocoder.boot</groupId> | ||
| 24 | + <artifactId>yudao-common</artifactId> | ||
| 25 | + </dependency> | ||
| 26 | + <!-- lombok --> | ||
| 27 | + <dependency> | ||
| 28 | + <groupId>org.projectlombok</groupId> | ||
| 29 | + <artifactId>lombok</artifactId> | ||
| 30 | + </dependency> | ||
| 31 | + <!-- 参数校验 --> | ||
| 32 | + <dependency> | ||
| 33 | + <groupId>org.springframework.boot</groupId> | ||
| 34 | + <artifactId>spring-boot-starter-validation</artifactId> | ||
| 35 | + <optional>true</optional> | ||
| 36 | + </dependency> | ||
| 37 | + </dependencies> | ||
| 20 | </project> | 38 | </project> |
| 21 | \ No newline at end of file | 39 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiModelEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.enums; | ||
| 2 | + | ||
| 3 | +import lombok.Getter; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * author: fansili | ||
| 7 | + * time: 2024/3/4 12:36 | ||
| 8 | + */ | ||
| 9 | +@Getter | ||
| 10 | +public enum AiModelEnum { | ||
| 11 | + | ||
| 12 | + OPEN_AI_GPT_3_5("gpt-3.5-turbo", "GPT3.5"), | ||
| 13 | + OPEN_AI_GPT_4("gpt-4-turbo", "GPT4") | ||
| 14 | + | ||
| 15 | + ; | ||
| 16 | + | ||
| 17 | + AiModelEnum(String value, String message) { | ||
| 18 | + this.value = value; | ||
| 19 | + this.message = message; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + private String value; | ||
| 23 | + | ||
| 24 | + private String message; | ||
| 25 | +} |
yudao-module-ai/yudao-module-ai-biz/pom.xml
| @@ -19,10 +19,38 @@ | @@ -19,10 +19,38 @@ | ||
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | <dependencies> | 21 | <dependencies> |
| 22 | + <dependency> | ||
| 23 | + <groupId>cn.iocoder.boot</groupId> | ||
| 24 | + <artifactId>yudao-module-ai-api</artifactId> | ||
| 25 | + <version>${revision}</version> | ||
| 26 | + </dependency> | ||
| 27 | + <dependency> | ||
| 28 | + <groupId>cn.iocoder.boot</groupId> | ||
| 29 | + <artifactId>yudao-common</artifactId> | ||
| 30 | + </dependency> | ||
| 31 | + | ||
| 22 | <!-- 增加 openai --> | 32 | <!-- 增加 openai --> |
| 23 | <dependency> | 33 | <dependency> |
| 24 | <groupId>org.springframework.ai</groupId> | 34 | <groupId>org.springframework.ai</groupId> |
| 25 | <artifactId>spring-ai-openai-spring-boot-starter</artifactId> | 35 | <artifactId>spring-ai-openai-spring-boot-starter</artifactId> |
| 26 | </dependency> | 36 | </dependency> |
| 37 | + | ||
| 38 | + <dependency> | ||
| 39 | + <groupId>cn.iocoder.boot</groupId> | ||
| 40 | + <artifactId>yudao-spring-boot-starter-security</artifactId> | ||
| 41 | + </dependency> | ||
| 42 | + | ||
| 27 | </dependencies> | 43 | </dependencies> |
| 44 | + <build> | ||
| 45 | + <plugins> | ||
| 46 | + <plugin> | ||
| 47 | + <groupId>org.apache.maven.plugins</groupId> | ||
| 48 | + <artifactId>maven-compiler-plugin</artifactId> | ||
| 49 | + <configuration> | ||
| 50 | + <source>17</source> | ||
| 51 | + <target>17</target> | ||
| 52 | + </configuration> | ||
| 53 | + </plugin> | ||
| 54 | + </plugins> | ||
| 55 | + </build> | ||
| 28 | </project> | 56 | </project> |
| 29 | \ No newline at end of file | 57 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/ChatController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 5 | +import cn.iocoder.yudao.module.ai.ErrorCodeConstants; | ||
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.vo.AiChatReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.enums.AiModelEnum; | ||
| 8 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 9 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 10 | +import org.springframework.ai.chat.ChatClient; | ||
| 11 | +import org.springframework.ai.openai.OpenAiChatClient; | ||
| 12 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 13 | +import org.springframework.context.ApplicationContext; | ||
| 14 | +import org.springframework.validation.annotation.Validated; | ||
| 15 | +import org.springframework.web.bind.annotation.PostMapping; | ||
| 16 | +import org.springframework.web.bind.annotation.RequestBody; | ||
| 17 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
| 18 | +import org.springframework.web.bind.annotation.RestController; | ||
| 19 | + | ||
| 20 | +/** | ||
| 21 | + * AI模块 | ||
| 22 | + * | ||
| 23 | + * author: fansili | ||
| 24 | + * time: 2024/3/3 20:28 | ||
| 25 | + */ | ||
| 26 | +@Tag(name = "AI模块") | ||
| 27 | +@RestController | ||
| 28 | +@RequestMapping("/ai-api") | ||
| 29 | +public class ChatController { | ||
| 30 | + | ||
| 31 | + @Autowired | ||
| 32 | + private ApplicationContext applicationContext; | ||
| 33 | + | ||
| 34 | + @PostMapping("/chat") | ||
| 35 | + @Operation(summary = "对话聊天", description = "简单的ai聊天") | ||
| 36 | + public CommonResult chat(@RequestBody @Validated AiChatReqVO reqVO) { | ||
| 37 | + ChatClient chatClient = getChatClient(reqVO.getAiModel()); | ||
| 38 | + String res; | ||
| 39 | + try { | ||
| 40 | + res = chatClient.call(reqVO.getInputText()); | ||
| 41 | + } catch (Exception e) { | ||
| 42 | + res = e.getMessage(); | ||
| 43 | + } | ||
| 44 | + return CommonResult.success(res); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + /** | ||
| 48 | + * 根据 ai模型 获取对于的 模型实现类 | ||
| 49 | + * | ||
| 50 | + * @param aiModelEnum | ||
| 51 | + * @return | ||
| 52 | + */ | ||
| 53 | + private ChatClient getChatClient(AiModelEnum aiModelEnum) { | ||
| 54 | + if (AiModelEnum.OPEN_AI_GPT_3_5 == aiModelEnum) { | ||
| 55 | + return applicationContext.getBean(OpenAiChatClient.class); | ||
| 56 | + } | ||
| 57 | + // AI模型暂不支持 | ||
| 58 | + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_MODULE_NOT_SUPPORTED); | ||
| 59 | + } | ||
| 60 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/vo/AiChatReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.vo; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.ai.enums.AiModelEnum; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import jakarta.validation.constraints.NotNull; | ||
| 6 | +import lombok.Data; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * ai 聊天 req | ||
| 10 | + * | ||
| 11 | + * author: fansili | ||
| 12 | + * time: 2024/3/4 12:33 | ||
| 13 | + */ | ||
| 14 | +@Schema(description = "用户 App - 上传文件 Request VO") | ||
| 15 | +@Data | ||
| 16 | +public class AiChatReqVO { | ||
| 17 | + | ||
| 18 | + @Schema(description = "输入内容", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 19 | + @NotNull(message = "输入内容不能为空") | ||
| 20 | + private String inputText; | ||
| 21 | + | ||
| 22 | + @Schema(description = "AI模型", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 23 | + @NotNull(message = "AI模型不能为空") | ||
| 24 | + private AiModelEnum aiModel; | ||
| 25 | + | ||
| 26 | +} |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java
0 → 100644
yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.properties
0 → 100644
yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.yaml deleted