Просмотр исходного кода

1、增加 chat 和 chatStream

cherishsince 1 год назад
Родитель
Сommit
a3530555ca
17 измененных файлов с 97 добавлено и 70 удалено
  1. 2 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java
  2. 76 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java
  3. 0 34
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/ChatController.java
  4. 0 5
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/package-info.java
  5. 0 5
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/package-info.java
  6. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java
  7. 3 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java
  8. 0 5
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/package-info.java
  9. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java
  10. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java
  11. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java
  12. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java
  13. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java
  14. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java
  15. 2 9
      yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/chat.http
  16. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/http-client.env.json
  17. 6 0
      yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/chatyiyan/YiYanChatClient.java

+ 2 - 2
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/chat/AiChatRoleController.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java

@@ -1,8 +1,8 @@
-package cn.iocoder.yudao.module.ai.controller.app.chat;
+package cn.iocoder.yudao.module.ai.controller;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.ai.controller.app.chat.vo.*;
 import cn.iocoder.yudao.module.ai.service.ChatRoleService;
+import cn.iocoder.yudao.module.ai.vo.*;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
 import org.springframework.validation.annotation.Validated;

+ 76 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java

@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.ai.controller;
+
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.iocoder.yudao.framework.ai.chat.ChatResponse;
+import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt;
+import cn.iocoder.yudao.framework.ai.config.AiClient;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+import reactor.core.publisher.Flux;
+
+import java.io.IOException;
+import java.util.function.Consumer;
+
+/**
+ * @author fansili
+ * @time 2024/4/13 17:44
+ * @since 1.0
+ */
+@Tag(name = "AI模块")
+@RestController
+@RequestMapping("/ai")
+@Slf4j
+@AllArgsConstructor
+public class ChatController {
+
+
+
+    @Autowired
+    private AiClient aiClient;
+
+    @GetMapping("/chat")
+    public CommonResult<String> chat(@RequestParam("prompt") String prompt) {
+        ChatResponse callRes = aiClient.call(new Prompt(prompt), "qianWen");
+        return CommonResult.success(callRes.getResult().getOutput().getContent());
+    }
+
+    // TODO @芋艿:调用这个方法异常,Unable to handle the Spring Security Exception because the response is already committed.
+    @GetMapping(value = "/chatStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    public SseEmitter chatStream(@RequestParam("prompt") String prompt) {
+        Utf8SseEmitter sseEmitter = new Utf8SseEmitter();
+        Flux<ChatResponse> streamResponse = aiClient.stream(new Prompt(prompt), "qianWen");
+        streamResponse.subscribe(
+                new Consumer<ChatResponse>() {
+                    @Override
+                    public void accept(ChatResponse chatResponse) {
+                        String content = chatResponse.getResults().get(0).getOutput().getContent();
+                        try {
+                            sseEmitter.send(content, MediaType.APPLICATION_JSON);
+                        } catch (IOException e) {
+                            log.error("发送异常{}", ExceptionUtil.getMessage(e));
+                            // 如果不是因为关闭而抛出异常,则重新连接
+                            sseEmitter.completeWithError(e);
+                        }
+                    }
+                },
+                error -> {
+                    //
+                    log.error("subscribe错误 {}", ExceptionUtil.getMessage(error));
+                },
+                () -> {
+                    log.info("发送完成!");
+                    sseEmitter.complete();
+                }
+        );
+        return sseEmitter;
+    }
+}

+ 0 - 34
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/ChatController.java

@@ -1,34 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat;
-
-import cn.iocoder.yudao.framework.ai.chat.ChatResponse;
-import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt;
-import cn.iocoder.yudao.framework.ai.config.AiClient;
-import cn.iocoder.yudao.framework.ai.config.YudaoAiClient;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author fansili
- * @since 1.0
- * @time 2024/4/13 17:44
- */
-@Tag(name = "AI模块")
-@RestController
-@RequestMapping("/admin-api/ai")
-@Slf4j
-@AllArgsConstructor
-public class ChatController {
-
-    private final AiClient aiClient;
-
-    @PostMapping("/chat")
-    public CommonResult<String> chat(@RequestParam("prompt") String prompt) {
-        ChatResponse callRes = aiClient.call(new Prompt(prompt), "qianWen");
-        return CommonResult.success(callRes.getResult().getOutput().getContent());
-    }
-
-}

+ 0 - 5
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/package-info.java

@@ -1,5 +0,0 @@
-/**
- * author: fansili
- * time: 2024/3/4 13:08
- */
-package cn.iocoder.yudao.module.ai.controller.admin;

+ 0 - 5
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/package-info.java

@@ -1,5 +0,0 @@
-/**
- * author: fansili
- * time: 2024/3/4 13:08
- */
-package cn.iocoder.yudao.module.ai.controller.app;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java

@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.ai.service;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.ai.controller.app.chat.vo.*;
+import cn.iocoder.yudao.module.ai.vo.*;
 
 /**
  * chat 角色

+ 3 - 2
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleServiceImpl.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java

@@ -1,7 +1,8 @@
-package cn.iocoder.yudao.module.ai.service;
+package cn.iocoder.yudao.module.ai.service.impl;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.ai.controller.app.chat.vo.*;
+import cn.iocoder.yudao.module.ai.service.ChatRoleService;
+import cn.iocoder.yudao.module.ai.vo.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 0 - 5
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/package-info.java

@@ -1,5 +0,0 @@
-/**
- * author: fansili
- * time: 2024/3/3 18:14
- */
-package cn.iocoder.yudao.module.ai.service;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/AiChatReqVO.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo;
+package cn.iocoder.yudao.module.ai.vo;
 
 import cn.iocoder.yudao.module.ai.enums.OpenAiModelEnum;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/chat/vo/ChatRoleAddReq.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.controller.app.chat.vo;
+package cn.iocoder.yudao.module.ai.vo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/chat/vo/ChatRoleListReq.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.controller.app.chat.vo;
+package cn.iocoder.yudao.module.ai.vo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/chat/vo/ChatRoleListRes.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.controller.app.chat.vo;
+package cn.iocoder.yudao.module.ai.vo;
 
 import lombok.Data;
 import lombok.experimental.Accessors;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/chat/vo/ChatRoleUpdateReq.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.controller.app.chat.vo;
+package cn.iocoder.yudao.module.ai.vo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/app/chat/vo/ChatRoleUpdateVisibilityReq.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.controller.app.chat.vo;
+package cn.iocoder.yudao.module.ai.vo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 2 - 9
yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/chat.http

@@ -16,24 +16,17 @@ tenant-id: 1
 }
 
 ### chat call
-POST {{baseUrl}}/admin-api/ai/chat?prompt=中国怎么样
+GET {{baseUrl}}/ai/chat?prompt=中国怎么样
 tenant-id: 1
 Authorization: {{token}}
 
 
-### chat call
-POST {{baseUrl}}/ai-api/chat
-tenant-id: 1
-Authorization: {{token}}
-
 
 ### chat call
-GET {{baseUrl}}/chat-role/list
+GET {{baseUrl}}/ai/chatStream?prompt=苹果是什么颜色?
 tenant-id: 1
 Authorization: {{token}}
 
 
 
 
-
-

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/http-client.env.json

@@ -1,6 +1,6 @@
 {
   "dev": {
     "baseUrl": "http://127.0.0.1:48080",
-    "token": "Bearer 07390ff2824a4798bcfd7f9395092181"
+    "token": "Bearer cff0ce99ddb14ea89c62ff4de1c31180"
   }
 }

+ 6 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/chatyiyan/YiYanChatClient.java

@@ -82,6 +82,12 @@ public class YiYanChatClient implements ChatClient, StreamingChatClient {
         YiYanChatCompletionRequest request = this.createRequest(prompt, true);
         // 调用 callWithFunctionSupport 发送请求
         Flux<YiYanChatCompletion> response = this.yiYanApi.chatCompletionStream(request);
+        response.doOnComplete(new Runnable() {
+            @Override
+            public void run() {
+                String a = ";";
+            }
+        });
         return response.map(res -> new ChatResponse(List.of(new Generation(res.getResult()))));
     }