package com.vincent.rsf.server.ai.controller;
|
|
import com.vincent.rsf.framework.common.R;
|
import com.vincent.rsf.server.ai.dto.AiChatSessionPinRequest;
|
import com.vincent.rsf.server.ai.dto.AiChatSessionRenameRequest;
|
import com.vincent.rsf.server.ai.dto.AiChatRequest;
|
import com.vincent.rsf.server.ai.service.AiChatService;
|
import com.vincent.rsf.server.system.controller.BaseController;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.http.MediaType;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.util.StringUtils;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
|
import java.util.UUID;
|
|
@RestController
|
@Slf4j
|
@RequiredArgsConstructor
|
public class AiChatController extends BaseController {
|
|
private final AiChatService aiChatService;
|
|
@PreAuthorize("isAuthenticated()")
|
@GetMapping("/ai/chat/runtime")
|
public R runtime(@RequestParam(required = false) String promptCode,
|
@RequestParam(required = false) Long sessionId) {
|
return R.ok().add(aiChatService.getRuntime(promptCode, sessionId, getLoginUserId(), getTenantId()));
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@GetMapping("/ai/chat/sessions")
|
public R sessions(@RequestParam(required = false) String promptCode,
|
@RequestParam(required = false) String keyword) {
|
return R.ok().add(aiChatService.listSessions(promptCode, keyword, getLoginUserId(), getTenantId()));
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@PostMapping("/ai/chat/session/remove/{sessionId}")
|
public R removeSession(@PathVariable Long sessionId) {
|
aiChatService.removeSession(sessionId, getLoginUserId(), getTenantId());
|
return R.ok("Delete Success").add(sessionId);
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@PostMapping("/ai/chat/session/rename/{sessionId}")
|
public R renameSession(@PathVariable Long sessionId, @RequestBody AiChatSessionRenameRequest request) {
|
return R.ok("Update Success").add(aiChatService.renameSession(sessionId, request, getLoginUserId(), getTenantId()));
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@PostMapping("/ai/chat/session/pin/{sessionId}")
|
public R pinSession(@PathVariable Long sessionId, @RequestBody AiChatSessionPinRequest request) {
|
return R.ok("Update Success").add(aiChatService.pinSession(sessionId, request, getLoginUserId(), getTenantId()));
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@PostMapping("/ai/chat/session/memory/clear/{sessionId}")
|
public R clearSessionMemory(@PathVariable Long sessionId) {
|
aiChatService.clearSessionMemory(sessionId, getLoginUserId(), getTenantId());
|
return R.ok("Clear Success").add(sessionId);
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@PostMapping("/ai/chat/session/memory/retain-latest/{sessionId}")
|
public R retainLatestRound(@PathVariable Long sessionId) {
|
aiChatService.retainLatestRound(sessionId, getLoginUserId(), getTenantId());
|
return R.ok("Retain Success").add(sessionId);
|
}
|
|
@PreAuthorize("isAuthenticated()")
|
@PostMapping(value = "/ai/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
|
public SseEmitter stream(@RequestBody AiChatRequest request) {
|
String requestId = StringUtils.hasText(request.getRequestId())
|
? request.getRequestId().trim()
|
: UUID.randomUUID().toString().replace("-", "");
|
request.setRequestId(requestId);
|
log.info("AI chat request accepted, requestId={}, userId={}, tenantId={}, sessionId={}",
|
requestId, getLoginUserId(), getTenantId(), request.getSessionId());
|
return aiChatService.stream(request, getLoginUserId(), getTenantId());
|
}
|
}
|