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")