diff --git a/yudao-module-ai/yudao-module-ai-api/pom.xml b/yudao-module-ai/yudao-module-ai-api/pom.xml index 621c05171..ce9c41527 100644 --- a/yudao-module-ai/yudao-module-ai-api/pom.xml +++ b/yudao-module-ai/yudao-module-ai-api/pom.xml @@ -17,4 +17,22 @@ UTF-8 + + + + cn.iocoder.boot + yudao-common + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-validation + true + + \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiModelEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiModelEnum.java new file mode 100644 index 000000000..ff1889fe7 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiModelEnum.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.Getter; + +/** + * author: fansili + * time: 2024/3/4 12:36 + */ +@Getter +public enum AiModelEnum { + + OPEN_AI_GPT_3_5("gpt-3.5-turbo", "GPT3.5"), + OPEN_AI_GPT_4("gpt-4-turbo", "GPT4") + + ; + + AiModelEnum(String value, String message) { + this.value = value; + this.message = message; + } + + private String value; + + private String message; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/pom.xml b/yudao-module-ai/yudao-module-ai-biz/pom.xml index 865dce912..0281c9ece 100644 --- a/yudao-module-ai/yudao-module-ai-biz/pom.xml +++ b/yudao-module-ai/yudao-module-ai-biz/pom.xml @@ -19,10 +19,38 @@ + + cn.iocoder.boot + yudao-module-ai-api + ${revision} + + + cn.iocoder.boot + yudao-common + + org.springframework.ai spring-ai-openai-spring-boot-starter + + + cn.iocoder.boot + yudao-spring-boot-starter-security + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + + \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/ChatController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/ChatController.java new file mode 100644 index 000000000..b7ca740fb --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/ChatController.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.ai.controller.admin; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.ai.ErrorCodeConstants; +import cn.iocoder.yudao.module.ai.controller.admin.vo.AiChatReqVO; +import cn.iocoder.yudao.module.ai.enums.AiModelEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.ai.chat.ChatClient; +import org.springframework.ai.openai.OpenAiChatClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * AI模块 + * + * author: fansili + * time: 2024/3/3 20:28 + */ +@Tag(name = "AI模块") +@RestController +@RequestMapping("/ai-api") +public class ChatController { + + @Autowired + private ApplicationContext applicationContext; + + @PostMapping("/chat") + @Operation(summary = "对话聊天", description = "简单的ai聊天") + public CommonResult chat(@RequestBody @Validated AiChatReqVO reqVO) { + ChatClient chatClient = getChatClient(reqVO.getAiModel()); + String res; + try { + res = chatClient.call(reqVO.getInputText()); + } catch (Exception e) { + res = e.getMessage(); + } + return CommonResult.success(res); + } + + /** + * 根据 ai模型 获取对于的 模型实现类 + * + * @param aiModelEnum + * @return + */ + private ChatClient getChatClient(AiModelEnum aiModelEnum) { + if (AiModelEnum.OPEN_AI_GPT_3_5 == aiModelEnum) { + return applicationContext.getBean(OpenAiChatClient.class); + } + // AI模型暂不支持 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_MODULE_NOT_SUPPORTED); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/vo/AiChatReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/vo/AiChatReqVO.java new file mode 100644 index 000000000..43b29d283 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/vo/AiChatReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.ai.controller.admin.vo; + +import cn.iocoder.yudao.module.ai.enums.AiModelEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * ai 聊天 req + * + * author: fansili + * time: 2024/3/4 12:33 + */ +@Schema(description = "用户 App - 上传文件 Request VO") +@Data +public class AiChatReqVO { + + @Schema(description = "输入内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "输入内容不能为空") + private String inputText; + + @Schema(description = "AI模型", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "AI模型不能为空") + private AiModelEnum aiModel; + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java new file mode 100644 index 000000000..f15447172 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/package-info.java @@ -0,0 +1,5 @@ +/** + * author: fansili + * time: 2024/3/4 13:08 + */ +package cn.iocoder.yudao.module.ai.controller; \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.properties b/yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.properties new file mode 100644 index 000000000..cb06af6ee --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.properties @@ -0,0 +1,6 @@ +# open ai + +# openAI https://openai.com/ +spring.ai.openai.api-key=${OPEN_AI_KEY} +spring.ai.openai.chat.options.model=gpt-3.5-turbo +spring.ai.openai.chat.options.temperature=0.7 \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.yaml b/yudao-module-ai/yudao-module-ai-biz/src/main/resources/application.yaml deleted file mode 100644 index e69de29bb..000000000