# 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项目(附源码)

## 一、项目介绍
本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换。

在这里主要是完整地描述前后端开发和第三方调用的过程,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

其中使用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
=======================================================================