From bbc21deae26bff1798f5a583917c42056d30e980 Mon Sep 17 00:00:00 2001 From: msslulu <1484036491@qq.com> Date: Wed, 24 Dec 2025 22:17:44 -0800 Subject: [PATCH 1/4] feat:add AIChat endpoint --- .../it/controller/AiChatController.java | 82 +++++++++++++------ 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java index e0086c78..538f1264 100644 --- a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java +++ b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java @@ -1,13 +1,12 @@ /** * Copyright (c) 2023 - present TinyEngine Authors. * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. - * + *

* Use of this source code is governed by an MIT-style license. - * + *

* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. - * */ package com.tinyengine.it.controller; @@ -18,6 +17,9 @@ import com.tinyengine.it.model.dto.AiToken; import com.tinyengine.it.model.dto.ChatRequest; +import com.tinyengine.it.rag.entity.EmbeddingMatchDto; +import com.tinyengine.it.rag.entity.SearchRequest; +import com.tinyengine.it.rag.service.StorageService; import com.tinyengine.it.service.app.v1.AiChatV1Service; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -37,6 +39,8 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; +import java.util.List; + /** * The type Ai chat controller. * @@ -52,6 +56,11 @@ public class AiChatController { */ @Autowired private AiChatV1Service aiChatV1Service; + /** + * vector storage service + */ + @Autowired + private StorageService vectorStorageService; /** * AI api @@ -60,17 +69,17 @@ public class AiChatController { * @return ai回答信息 result */ @Operation(summary = "获取ai回答信息", description = "获取ai回答信息", - parameters = { - @Parameter(name = "ChatRequest", description = "入参对象") - }, responses = { + parameters = { + @Parameter(name = "ChatRequest", description = "入参对象") + }, responses = { @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), + content = @Content(mediaType = "application/json", schema = @Schema())), @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI chat") @PostMapping("/ai/chat") public ResponseEntity aiChat(@RequestBody ChatRequest request, - @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { + @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { if (authorization != null && authorization.startsWith("Bearer ")) { String token = authorization.replace("Bearer ", ""); @@ -81,16 +90,36 @@ public ResponseEntity aiChat(@RequestBody ChatRequest request, if (request.isStream()) { return ResponseEntity.ok() - .contentType(MediaType.TEXT_EVENT_STREAM) - .header("Cache-Control", "no-cache") - .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 - .body((StreamingResponseBody) response); + .contentType(MediaType.TEXT_EVENT_STREAM) + .header("Cache-Control", "no-cache") + .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 + .body((StreamingResponseBody) response); } else { return ResponseEntity.ok(response); } } + /** + * search in collection + * + * @param searchDto the searchDto + * @return result + */ + @Operation(summary = "在指定集合中搜索", description = "在指定集合中搜索", + parameters = { + @Parameter(name = "searchDto", description = "搜索请求参数体"), + }, responses = { + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") + }) + @SystemControllerLog(description = "AI search in collection") + @PostMapping("/ai/search") + public Result> searchInCollection(@RequestBody SearchRequest searchDto) { + List results = vectorStorageService.search(searchDto); + return Result.success(results); + } /** * AI api v1 @@ -99,17 +128,17 @@ public ResponseEntity aiChat(@RequestBody ChatRequest request, * @return ai回答信息 result */ @Operation(summary = "获取ai回答信息", description = "获取ai回答信息", - parameters = { - @Parameter(name = "ChatRequest", description = "入参对象") - }, responses = { + parameters = { + @Parameter(name = "ChatRequest", description = "入参对象") + }, responses = { @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), + content = @Content(mediaType = "application/json", schema = @Schema())), @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI completions") @PostMapping("/chat/completions") public ResponseEntity completions(@RequestBody ChatRequest request, - @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { + @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { if (authorization != null && authorization.startsWith("Bearer ")) { String token = authorization.replace("Bearer ", ""); request.setApiKey(token); @@ -119,14 +148,15 @@ public ResponseEntity completions(@RequestBody ChatRequest request, if (request.isStream()) { return ResponseEntity.ok() - .contentType(MediaType.TEXT_EVENT_STREAM) - .header("Cache-Control", "no-cache") - .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 - .body((StreamingResponseBody) response); + .contentType(MediaType.TEXT_EVENT_STREAM) + .header("Cache-Control", "no-cache") + .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 + .body((StreamingResponseBody) response); } else { return ResponseEntity.ok(response); } } + /** * get token * @@ -134,18 +164,18 @@ public ResponseEntity completions(@RequestBody ChatRequest request, * @return ai回答信息 result */ @Operation(summary = "获取加密key信息", description = "获取加密key信息", - parameters = { - @Parameter(name = "request", description = "入参对象") - }, responses = { + parameters = { + @Parameter(name = "request", description = "入参对象") + }, responses = { @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), + content = @Content(mediaType = "application/json", schema = @Schema())), @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "get token") @PostMapping("/encrypt-key") public Result getToken(@RequestBody ChatRequest request) throws Exception { String apiKey = request.getApiKey(); - if(apiKey == null || apiKey.isEmpty()) { + if (apiKey == null || apiKey.isEmpty()) { return Result.failed(ExceptionEnum.CM320); } String token = aiChatV1Service.getToken(apiKey); From bd750f8c945ff33f5376391b5a8b38fc7884fdc3 Mon Sep 17 00:00:00 2001 From: msslulu <1484036491@qq.com> Date: Thu, 25 Dec 2025 19:59:40 -0800 Subject: [PATCH 2/4] feat:add AIChat endpoint --- .../it/controller/AiChatController.java | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java index 538f1264..a9ed590e 100644 --- a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java +++ b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java @@ -1,12 +1,13 @@ /** * Copyright (c) 2023 - present TinyEngine Authors. * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. - *

+ * * Use of this source code is governed by an MIT-style license. - *

+ * * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * */ package com.tinyengine.it.controller; @@ -56,9 +57,7 @@ public class AiChatController { */ @Autowired private AiChatV1Service aiChatV1Service; - /** - * vector storage service - */ + @Autowired private StorageService vectorStorageService; @@ -100,26 +99,6 @@ public ResponseEntity aiChat(@RequestBody ChatRequest request, } - /** - * search in collection - * - * @param searchDto the searchDto - * @return result - */ - @Operation(summary = "在指定集合中搜索", description = "在指定集合中搜索", - parameters = { - @Parameter(name = "searchDto", description = "搜索请求参数体"), - }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") - }) - @SystemControllerLog(description = "AI search in collection") - @PostMapping("/ai/search") - public Result> searchInCollection(@RequestBody SearchRequest searchDto) { - List results = vectorStorageService.search(searchDto); - return Result.success(results); - } /** * AI api v1 @@ -156,7 +135,6 @@ public ResponseEntity completions(@RequestBody ChatRequest request, return ResponseEntity.ok(response); } } - /** * get token * @@ -175,10 +153,31 @@ public ResponseEntity completions(@RequestBody ChatRequest request, @PostMapping("/encrypt-key") public Result getToken(@RequestBody ChatRequest request) throws Exception { String apiKey = request.getApiKey(); - if (apiKey == null || apiKey.isEmpty()) { + if(apiKey == null || apiKey.isEmpty()) { return Result.failed(ExceptionEnum.CM320); } String token = aiChatV1Service.getToken(apiKey); return Result.success(new AiToken(token)); } + + /** + * search in collection + * + * @param searchDto the searchDto + * @return result + */ + @Operation(summary = "在指定集合中搜索", description = "在指定集合中搜索", + parameters = { + @Parameter(name = "searchDto", description = "搜索请求参数体"), + }, responses = { + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") + }) + @SystemControllerLog(description = "AI search in collection") + @PostMapping("/ai/search") + public Result> searchInCollection(@RequestBody SearchRequest searchDto) { + List results = vectorStorageService.search(searchDto); + return Result.success(results); + } } From bd4167bf9e9e7110e001b05c0e6dcfc079c0040e Mon Sep 17 00:00:00 2001 From: msslulu <1484036491@qq.com> Date: Thu, 25 Dec 2025 22:36:35 -0800 Subject: [PATCH 3/4] feat:AiChatController optimize code formatting --- .../it/controller/AiChatController.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java index a9ed590e..0c4296dd 100644 --- a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java +++ b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java @@ -68,17 +68,17 @@ public class AiChatController { * @return ai回答信息 result */ @Operation(summary = "获取ai回答信息", description = "获取ai回答信息", - parameters = { - @Parameter(name = "ChatRequest", description = "入参对象") - }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + parameters = { + @Parameter(name = "ChatRequest", description = "入参对象") + }, responses = { + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI chat") @PostMapping("/ai/chat") public ResponseEntity aiChat(@RequestBody ChatRequest request, - @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { + @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { if (authorization != null && authorization.startsWith("Bearer ")) { String token = authorization.replace("Bearer ", ""); @@ -89,10 +89,10 @@ public ResponseEntity aiChat(@RequestBody ChatRequest request, if (request.isStream()) { return ResponseEntity.ok() - .contentType(MediaType.TEXT_EVENT_STREAM) - .header("Cache-Control", "no-cache") - .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 - .body((StreamingResponseBody) response); + .contentType(MediaType.TEXT_EVENT_STREAM) + .header("Cache-Control", "no-cache") + .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 + .body((StreamingResponseBody) response); } else { return ResponseEntity.ok(response); } @@ -107,17 +107,17 @@ public ResponseEntity aiChat(@RequestBody ChatRequest request, * @return ai回答信息 result */ @Operation(summary = "获取ai回答信息", description = "获取ai回答信息", - parameters = { - @Parameter(name = "ChatRequest", description = "入参对象") - }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + parameters = { + @Parameter(name = "ChatRequest", description = "入参对象") + }, responses = { + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI completions") @PostMapping("/chat/completions") public ResponseEntity completions(@RequestBody ChatRequest request, - @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { + @RequestHeader(value = "Authorization", required = false) String authorization) throws Exception { if (authorization != null && authorization.startsWith("Bearer ")) { String token = authorization.replace("Bearer ", ""); request.setApiKey(token); @@ -127,10 +127,10 @@ public ResponseEntity completions(@RequestBody ChatRequest request, if (request.isStream()) { return ResponseEntity.ok() - .contentType(MediaType.TEXT_EVENT_STREAM) - .header("Cache-Control", "no-cache") - .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 - .body((StreamingResponseBody) response); + .contentType(MediaType.TEXT_EVENT_STREAM) + .header("Cache-Control", "no-cache") + .header("X-Accel-Buffering", "no") // 禁用Nginx缓冲 + .body((StreamingResponseBody) response); } else { return ResponseEntity.ok(response); } @@ -142,12 +142,12 @@ public ResponseEntity completions(@RequestBody ChatRequest request, * @return ai回答信息 result */ @Operation(summary = "获取加密key信息", description = "获取加密key信息", - parameters = { - @Parameter(name = "request", description = "入参对象") - }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + parameters = { + @Parameter(name = "request", description = "入参对象") + }, responses = { + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "get token") @PostMapping("/encrypt-key") @@ -167,12 +167,12 @@ public Result getToken(@RequestBody ChatRequest request) throws Excepti * @return result */ @Operation(summary = "在指定集合中搜索", description = "在指定集合中搜索", - parameters = { - @Parameter(name = "searchDto", description = "搜索请求参数体"), - }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + parameters = { + @Parameter(name = "searchDto", description = "搜索请求参数体"), + }, responses = { + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI search in collection") @PostMapping("/ai/search") From b6a37dbee7d0903dd8e733f38ef5e518390503d0 Mon Sep 17 00:00:00 2001 From: msslulu <1484036491@qq.com> Date: Thu, 25 Dec 2025 22:42:19 -0800 Subject: [PATCH 4/4] feat:AiChatController optimize code formatting --- .../it/controller/AiChatController.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java index 0c4296dd..ff129fa0 100644 --- a/base/src/main/java/com/tinyengine/it/controller/AiChatController.java +++ b/base/src/main/java/com/tinyengine/it/controller/AiChatController.java @@ -71,9 +71,9 @@ public class AiChatController { parameters = { @Parameter(name = "ChatRequest", description = "入参对象") }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI chat") @PostMapping("/ai/chat") @@ -110,9 +110,9 @@ public ResponseEntity aiChat(@RequestBody ChatRequest request, parameters = { @Parameter(name = "ChatRequest", description = "入参对象") }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI completions") @PostMapping("/chat/completions") @@ -145,9 +145,9 @@ public ResponseEntity completions(@RequestBody ChatRequest request, parameters = { @Parameter(name = "request", description = "入参对象") }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "get token") @PostMapping("/encrypt-key") @@ -170,9 +170,9 @@ public Result getToken(@RequestBody ChatRequest request) throws Excepti parameters = { @Parameter(name = "searchDto", description = "搜索请求参数体"), }, responses = { - @ApiResponse(responseCode = "200", description = "返回信息", - content = @Content(mediaType = "application/json", schema = @Schema())), - @ApiResponse(responseCode = "400", description = "请求失败") + @ApiResponse(responseCode = "200", description = "返回信息", + content = @Content(mediaType = "application/json", schema = @Schema())), + @ApiResponse(responseCode = "400", description = "请求失败") }) @SystemControllerLog(description = "AI search in collection") @PostMapping("/ai/search")