# spring-gpt **Repository Path**: lml_1992/spring-gpt ## Basic Information - **Project Name**: spring-gpt - **Description**: 本项目是Spring AI第三方调用整合智谱请言案例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-02-20 - **Last Updated**: 2025-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring-GPT智谱清言AI项目(附源码) ![chatAI](asses/chatAI.gif) ## 一、项目介绍 ​ 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换。 ![image-20250218111720935](asses/image-20250218111720935.png) ​ 在这里主要是完整地描述前后端开发和第三方调用的过程,SSE流式请求响应,MD稳定渲染显示等。 ## 二、后端开发 ​ 后端使用的是Java,版本是JDK17,spring-boot版本是3.0.2,下面是```pom.xml```配置文件: ```xml 4.0.0 com spring-gpt-service 0.0.9 spring-gpt-service spring-gpt-service 17 UTF-8 UTF-8 3.0.2 org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test cn.bigmodel.openapi oapi-java-sdk release-V4-2.3.0 com.squareup.okhttp3 okhttp 4.9.3 com.google.code.gson gson 2.8.8 com.alibaba fastjson 1.2.75 org.springframework.boot spring-boot-starter-webflux org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.apache.maven.plugins maven-compiler-plugin 3.8.1 17 17 UTF-8 org.springframework.boot spring-boot-maven-plugin ${spring-boot.version} repackage ``` ​ 由于Get请求参数直接在链接上会受到换行符\n或\r的限制,改用Post请求,使用json封装请求参数,下面是```RequestData```类: ```java import lombok.Data; @Data public class RequestData { private String msg; } ``` ​ 接口层accumulator.getDelta().getContent()这句代码是返回每次的具体结果 ```java /** * 通过ModelApiResponse.getFlowable()获取流式数据,最后通过blockingGet()获取最终结果 * System.out.print(accumulator.getDelta().getContent()); // 这句代码是返回的具体结果 * 因为直接SSE传text,受结束符\n影响,可以使用base64传输 */ @PostMapping(value = "/zp2", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux testSseInvoke(@RequestBody RequestData requestData) { String msg = requestData.getMsg(); List messages = new ArrayList<>(); ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), msg); messages.add(chatMessage); String requestId = String.format(requestIdTemplate, System.currentTimeMillis()); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model(Constants.ModelChatGLM4) .stream(Boolean.TRUE) .messages(messages) .requestId(requestId) .build(); Flux flux = Flux.create(emitter -> { ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest); if (sseModelApiResp.isSuccess()) { AtomicBoolean isFirst = new AtomicBoolean(true); mapStreamToAccumulator(sseModelApiResp.getFlowable()) .doOnNext(accumulator -> { // if (isFirst.getAndSet(false)) { // String base64Msg = Base64.getEncoder().encodeToString("Response: ".getBytes(StandardCharsets.UTF_8)); // emitter.next(base64Msg); // } if (accumulator.getDelta() != null && accumulator.getDelta().getTool_calls() != null) { try { String jsonString = mapper.writeValueAsString(accumulator.getDelta().getTool_calls()); String tool = "tool_calls: " + jsonString; String base64Msg = Base64.getEncoder().encodeToString(tool.getBytes(StandardCharsets.UTF_8)); emitter.next(base64Msg); } catch (Exception e) { String err = "Error converting tool_calls to JSON: " + e.getMessage(); String base64Msg = Base64.getEncoder().encodeToString(err.getBytes(StandardCharsets.UTF_8)); emitter.next(base64Msg); } } if (accumulator.getDelta() != null && accumulator.getDelta().getContent() != null) { String content = accumulator.getDelta().getContent(); String base64Msg = Base64.getEncoder().encodeToString(content.getBytes(StandardCharsets.UTF_8)); // 具体结果 // System.out.print(content); emitter.next(base64Msg); } }) .doOnComplete(() -> { emitter.next("\n"); emitter.complete(); }) .subscribe(); } else { emitter.next("Error: " + sseModelApiResp.getError() + "\n"); emitter.complete(); } }); return flux; } ``` ## 三、前端实现 ​ 前端使用Vue3,具体其他库详见项目的`package.json`文件 pnpm create vue@latest ![image-20250218113454003](asses/image-20250218113454003.png) ​ 其中使用md-editor-v3来做MD文档格式显示 pnpm add md-editor-v3 ​ 下面是在组件中的具体使用: ```vue
``` ## 四、源码仓库 ======================================================================= 联系开发者:2013994940@qq.com CSDN博客教程地址:https://blog.csdn.net/yueyue763184/article/details/145702359 Gitee源码地址:https://gitee.com/BuLiangShuai01033/spring-gpt =======================================================================