package cc.mrbird.febs.ai.controller.memberTalk; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkAnswerDto; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkStreamDto; import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo; import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo; import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo; import cc.mrbird.febs.ai.service.AiMemberTalkService; import cc.mrbird.febs.common.entity.FebsResponse; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import reactor.core.publisher.Flux; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.List; /** * @author Administrator */ @Slf4j @Validated @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/ai/memberTalk") @Api(value = "ApiMemberTalkController", tags = "AI-用户陪练") public class ApiMemberTalkController { private final AiMemberTalkService aiMemberTalkService; @ApiOperation(value = "开始陪练", notes = "开始陪练") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMemberTalkVo.class) }) @PostMapping(value = "/start") public FebsResponse start(@RequestBody @Validated ApiMemberTalkDto dto) { return aiMemberTalkService.start(dto); } @ApiOperation(value = "回答", notes = "回答") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMemberTalkVo.class) }) @PostMapping(value = "/answer") public FebsResponse answer(@RequestBody @Validated ApiMemberTalkAnswerDto dto) { return aiMemberTalkService.answer(dto); } @ApiOperation(value = "对话记录分页查询", notes = "对话记录分页查询") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMemberTalkItemVo.class) }) @PostMapping(value = "/historyPage") public FebsResponse historyPage(@RequestBody @Validated ApiMemberTalkItemPageDto dto) { return aiMemberTalkService.historyPage(dto); } @PostMapping("/start-stream") @ApiOperation("开始AI对话(流式)") @ApiResponses({ @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkVo.class), @ApiResponse(code = 500, message = "系统错误") }) public SseEmitter startStream( @ApiParam(value = "对话请求参数", required = true) @RequestBody ApiMemberTalkDto dto) { SseEmitter emitter = new SseEmitter(0L); // 0表示永不超时 aiMemberTalkService.startStream(dto, response -> { try { emitter.send(SseEmitter.event().data(response)); // 如果包含report,说明是最终结果,关闭连接 if (response.getCode() != null && "200".equals(response.getCode())) { emitter.complete(); } } catch (IOException e) { emitter.completeWithError(e); } }); return emitter; } // 修改接口定义 @ApiOperation("开始AI对话(流式)") @ApiResponses({ @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class), }) @GetMapping("/answer-stream") public Flux answerStream(@RequestParam String question) { return aiMemberTalkService.answerStream(question); } }