Spring Ai 对接智谱清言结合vue(清测成功)

news/2024/10/23 0:28:23/

智谱文档:智谱AI开放平台

注意:springboot版本要在3.0以上,pom.xml要配置下载的源。

pml文件如下

建议使用下科学上网~~~ 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>ai-puzhi</artifactId><version>0.0.1-SNAPSHOT</version><name>ai-puzhi</name><description>ai-puzhi</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><fastjson2.version>2.0.52</fastjson2.version><java.version>17</java.version><spring-ai.version>1.0.3</spring-ai.version><testcontainers.version>1.20.1</testcontainers.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- For Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- For Commons --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><!-- For Caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency><!-- For FastJson2 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>${fastjson2.version}</version></dependency><dependency><groupId>io.springboot.ai</groupId><artifactId>spring-ai-zhipu-ai-spring-boot-starter</artifactId><version>${spring-ai.version}</version></dependency><dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.0.2</version><scope>test</scope></dependency><!-- For Web Server --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>spring-boot-starter-tomcat</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>test</scope></dependency></dependencies><!--    配置下载地址--><!-- 设定远程主仓库,按设定顺序进行查找。 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><id>central</id><name>Maven Central</name><url>https://repo.maven.apache.org/maven2</url></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

yml配置文件

spring:application:name: ai-puzhiai:zhipuai:api-key: 82770a63b944ae2789b679332cf32
#      model: glm-4-plusmodel: codegeex-4retry:backoff:max-interval: 3000multiplier: 2initial-interval: 2000
server:port: 9090

 获取key地址:智谱AI开放平台

 

主要代码

 

@RestController
@CrossOrigin
public class ChatController {private final ZhipuAiChatClient chatClient;@Autowiredpublic ChatController(ZhipuAiChatClient chatClient) {this.chatClient = chatClient;}@GetMapping(value = "/v1/generate", produces = "application/json")public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String call = chatClient.call(message);System.out.println(call);return Map.of("generation", call);}@GetMapping("/v1/prompt")public List<Generation> prompt(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {PromptTemplate promptTemplate = new PromptTemplate("Tell me a {adjective} joke about {topic}");Prompt prompt = promptTemplate.create(Map.of("adjective", "funny", "topic", "cats"));return chatClient.call(prompt).getResults();}@GetMapping("/v1/chat/completions")public Flux<ChatResponse> chatCompletions(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatClient.stream(prompt);}@GetMapping("/v1/chat/completionsTow")public SseEmitter chatCompletionsTow(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {SseEmitter emitter = new SseEmitter();Prompt prompt = new Prompt(new UserMessage(message));// 订阅Flux并处理数据chatClient.stream(prompt).subscribe(data -> {try {emitter.send(data);} catch (IOException e) {emitter.completeWithError(e);}},emitter::completeWithError,emitter::complete);return emitter;}@PostMapping("/v1/chat/completionsPost")public Flux<ChatResponse> completionsPost(@RequestBody Message msg) {Prompt prompt = new Prompt(new UserMessage(msg.getMsg()));return chatClient.stream(prompt);}@PostMapping(value = "/completionsPost", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public void completionsPost(@RequestBody Message msg, HttpServletResponse response) throws IOException {Prompt prompt = new Prompt(new UserMessage(msg.getMsg()));// 获取 SSE 的 flux 流Flux<ChatResponse> flux = chatClient.stream(prompt);// 设置必要的 SSE 头部response.setHeader("Cache-Control", "no-cache");response.setHeader("Connection", "keep-alive");response.setHeader("Content-Type", "text/event-stream");// 获取响应输出流PrintWriter writer = response.getWriter();flux.doOnNext(chatResponse -> {try {// 将 ChatResponse 转换为 SSE 格式并写入响应流Generation result = chatResponse.getResult();AssistantMessage output = result.getOutput();String content = output.getContent();System.out.println("content: " + content);writer.write("data: " + content + "\n\n");writer.flush();} catch (Exception e) {// 处理异常e.printStackTrace();}}).doOnError(throwable -> {try {// 在出现错误时关闭响应流writer.write("event: error\ndata: " + throwable.getMessage() + "\n\n");writer.flush();writer.close();} catch (Exception e) {// 处理异常e.printStackTrace();}}).doOnComplete(() -> {try {// 在流完成时关闭响应流writer.write("event: complete\ndata: Stream completed\n\n");writer.flush();writer.close();} catch (Exception e) {// 处理异常e.printStackTrace();}}).subscribe(); // 订阅以启动流}@PostMapping(value = "/completionsPostNew", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter completionsPostNew(@RequestBody Message msg, HttpServletResponse response) {SseEmitter emitter = new SseEmitter();UserMessage userMessage = new UserMessage(msg.getMsg());SystemMessage systemMessage = new SystemMessage("你是一位智能编程助手,你叫CSBlogAi。你会为用户回答关于编程、代码、计算机方面的任何问题," +"并提供格式规范、可以执行、准确安全的代码,并在必要时提供详细的解释。" +"任务:请为输入代码提供格式规范的注释,包含多行注释和单行注释," +"请注意不要改动原始代码,只需要添加注释。 请用中文回答。");List<org.springframework.ai.chat.messages.Message> messages = List.of(userMessage, systemMessage);Prompt prompt = new Prompt(messages);// 设置响应头response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);// 订阅Flux并处理数据chatClient.stream(prompt).subscribe(data -> {try {// 发送 JSON 格式的 SSE 事件emitter.send(data);} catch (IOException e) {emitter.completeWithError(e);}},emitter::completeWithError,emitter::complete);return emitter;}}

前端主要代码

javascript">//get使用 
getChatCompletions() {// 关闭之前的SSE连接(如果存在)if (this.eventSource) {this.eventSource.close();}let msg = this.userInput.replace(/\s+/g, '')let url = `http://localhost:9090/v1/chat/completionsTow?message=${msg}`// // 创建一个新的EventSource连接this.eventSource = new EventSource(url);let user = this.$store.state.UserInfolet userObj = {user: {userName: user.nickname,avatar: user.avatar,content: this.userInput},chat: {avatar: "https://blog-chen.oss-cn-shanghai.aliyuncs.com/favicon.ico",aiName: "CsBlog-Ai",content: []}}this.chatResponses.push(userObj)this.userInput = ''; // 清空输入框// 监听消息事件this.eventSource.onmessage = event => {const chatResponse = JSON.parse(event.data);if (chatResponse.result.output.content.trim() != '') {// 获取最后有的数组let length = this.chatResponses.lengththis.chatResponses[length - 1].chat.content.push(chatResponse.result.output.content)// this.chatResponses.push(chatResponse.result.output.content);this.$nextTick(() => {prism.highlightAll();// 全局代码高亮// 滚动到底部this.observeContentChanges()});}};// 监听错误事件this.eventSource.onerror = error => {// 将chatResponses添加到localStorage中console.log("关闭eventSource");if (this.chatResponses.length != 0) {localStorage.setItem(user.id, JSON.stringify(this.chatResponses))}this.eventSource.close();};},
//post使用SendAi() {this.abortController = new AbortController();const signal = this.abortController.signal;console.log(signal);// 添加到数组中let user = this.$store.state.UserInfolet userObj = {user: {userName: user.nickname,avatar: user.avatar,content: this.userInput},chat: {avatar: "https://blog-c",aiName: "CsBlog-Ai",content: []}}this.chatResponses.push(userObj)let sendMsg = this.userInput.replace(/\s+/g, '')this.userInput = ''; // 清空输入框fetchEventSource('http://localhost:9090/completionsPostNew', {method: 'POST',headers: {'Content-Type': 'application/json','Cache-Control': 'no-cache','Connection': 'keep-alive'},body: JSON.stringify({ msg: sendMsg }),onmessage: (event) => {const chatResponse = JSON.parse(event.data);if (chatResponse.result.output.content.trim() != '') {// 获取最后有的数组let length = this.chatResponses.lengththis.chatResponses[length - 1].chat.content.push(chatResponse.result.output.content)this.$nextTick(() => {prism.highlightAll();// 全局代码高亮// 滚动到底部this.observeContentChanges()});}},onopen: async (response) => {if (response.ok && response.headers.get('content-type') === 'text/event-stream') {return; // 连接成功} else if (response.status >= 400 && response.status < 500 && response.status === 429) {this.abortController.abort();throw new Error('Client-side error');} else {this.abortController.abort();throw new Error('Retriable error');}},onerror: (event) => {if (event.target.readyState === EventSource.CLOSED) {console.error('Connection was closed by the server.');} else {console.error('Error occurred:', event);}},onclose: () => {if (this.chatResponses.length != 0) {localStorage.setItem(user.id, JSON.stringify(this.chatResponses))}console.log('Connection closed.');},signal: signal});}},beforeDestroy() {this.abortController.abort();},

 需要源码的私信~~~


http://www.ppmy.cn/news/1541193.html

相关文章

linux 查看CPU信息 核心数 逻辑核心数

cat /proc/cpuinfo Linux操作系统的CPU信息被保存在/proc/cpuinfo文件中&#xff0c; processor: 这是逻辑CPU的编号&#xff0c;从0开始。 physical id: 如果你有多个物理CPU&#xff0c;每个物理CPU都会有一个唯一的ID。 core id: 每个核心的唯一ID。有了HT技术后&#xf…

svn安装完成,但在cmd窗口运行是报错svn不是内部或外部命令

已经安装了svn&#xff0c;但是在cmd中输入svn命令的时候提示svn不是内部或外部命令是因为没有安装svn client。 解决办法&#xff1a; windows安装svn的时候默认是不安装 svn comand line这个东西的&#xff0c;重新安装svn客户端&#xff0c;将“command line client tools”…

Lua字符串

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua作为一种轻量级、高效的脚本语言&#xff0c;在字符串处理方面提供了丰富的功能和灵活的操作方式。字符串在Lua中是一系列的字节&#xff0c;可以包含任意…

OpenLayers:构建现代Web地图应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 OpenLayers&#xff1a;构建现代Web地图应用 文章目录 OpenLayers&#xff1a;构建现代Web地图应用1. 简介2. 为什么选择 OpenLa…

常见Web知识1

List item 常见Web知识1 JSON&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人类阅读和编写&#xff0c;同时也易于机器解析和生成。它通常用于客户端和服务器之间的数据传输。 JSON 结构 JSON 主要由两…

day02 -- docker

1.docker的介绍 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使…

Python爬虫进阶:高效数据采集的艺术

在当今数据驱动的世界里&#xff0c;高效的网络爬虫技术已经成为每个数据科学家和后端工程师的必备技能。本文将深入探讨一些高级的Python爬虫技术&#xff0c;这些技术不仅能够大幅提升你的爬虫效率&#xff0c;还能帮助你应对各种复杂的爬虫场景。 1. 异步爬虫&#xff1a;协…

视频转换成图像的脚本

视频转换成图像的脚本 from moviepy.editor import VideoFileClip import os# 视频文件路径 video_file 2024_10_21_16_06_IMG_2357.MOV # 输出文件夹路径 output_folder output_images # 每秒转换的帧率 fps 2# 从视频文件名中提取基本名称 base_filename os.path.splitex…