Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能(首发)复制粘贴即可使用,后续更新WebSocket实现聊天功能

程序员必备网站:

天梦星服务平台 (tmxkj.top)icon-default.png?t=N7T8https://tmxkj.top/#/

1.pom.xml

        <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></dependency><dependency><groupId>org.jetbrains</groupId><artifactId>annotations</artifactId><version>13.0</version><scope>compile</scope></dependency>
spark:ai:hostUrl: https://spark-api.xf-yun.com/v3.5/chatappId: ####apiSecret: #####apiKey: ######

2.实体类

import cn.hutool.json.JSONObject;
import lombok.Data;@Data
public class SparkDto {private JSONObject payload;private JSONObject parameter;private JSONObject header;
}
@Data
public class SparkParamDto {private String content;
}

 

3.Tool工具类


import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.example.springbootServiceNetwork.demos.web.Config.JwtInfo;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkDto;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkParamDto;
import okhttp3.HttpUrl;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;/*** 讯飞星火工具类*/
public class SparkUtil {/*** 构建 鉴权方法* @param hostUrl* @param apiKey* @param apiSecret* @return* @throws Exception*/public static String getAuthUrl(String hostUrl, String apiKey, String apiSecret) throws Exception {URL url = new URL(hostUrl);// 时间SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(new Date());// 拼接String preStr = "host: " + url.getHost() + "\n" +"date: " + date + "\n" +"GET " + url.getPath() + " HTTP/1.1";// System.err.println(preStr);// SHA256加密Mac mac = Mac.getInstance("hmacsha256");SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "hmacsha256");mac.init(spec);byte[] hexDigits = mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8));// Base64加密String sha = Base64.getEncoder().encodeToString(hexDigits);// System.err.println(sha);// 拼接String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);// 拼接地址HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().//addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).//addQueryParameter("date", date).//addQueryParameter("host", url.getHost()).//build();// System.err.println(httpUrl.toString());return httpUrl.toString();};/*** 构建请求参数* @param jwtInfo* @param appId* @param sparkParam* @return* @throws Exception*/public static String getSparkJson(JwtInfo jwtInfo, String appId, SparkParamDto sparkParam) throws Exception {SparkDto sprarkDto = new SparkDto();//----------------payload-----------------JSONObject payload=new JSONObject();JSONObject message=new JSONObject();JSONArray text=new JSONArray();JSONObject textObj=new JSONObject();textObj.put("role","user");textObj.put("content",sparkParam.getContent());text.add(textObj);message.put("text",text);payload.put("message",message);sprarkDto.setPayload(payload);//----------------parameter-----------------JSONObject parameter=new JSONObject(); // parameter参数JSONObject chat=new JSONObject();chat.put("domain","generalv2");chat.put("temperature",0.5);chat.put("max_tokens",2000);parameter.put("chat",chat);sprarkDto.setParameter(parameter);//----------------header-----------------JSONObject header = new JSONObject();header.put("app_id", appId);header.put("uid", jwtInfo.getUserId());sprarkDto.setHeader(header);return JSON.toJSONString(sprarkDto);}}

4.业务层

     图片解析

import com.example.springbootServiceNetwork.demos.web.Config.JwtInfo;
import com.example.springbootServiceNetwork.demos.web.Config.Result;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkParamDto;public interface SparkService {Result SparkChat(SparkParamDto sparkParam, JwtInfo jwtInfo);
}
@Service
public class SparkServiceImpl implements SparkService {@Value("${spark.ai.hostUrl}")private  String  hostUrl;@Value("${spark.ai.appId}")private  String appId;@Value("${spark.ai.apiSecret}")private  String apiSecret;@Value("${spark.ai.apiKey}")private  String apiKey;@Overridepublic Result SparkChat(SparkParamDto sparkParamDto, JwtInfo jwtInfo) {Result result = new Result();try {// 构建鉴权urlString authUrl = getAuthUrl(hostUrl, apiKey, apiSecret);OkHttpClient client = new OkHttpClient.Builder().build();String url = authUrl.toString().replace("http://", "ws://").replace("https://", "wss://");Request request = new Request.Builder().url(url).build();String body = getSparkJson(jwtInfo,appId,sparkParamDto);StringBuilder builderSb =new StringBuilder();CompletableFuture<String> messageReceived = new CompletableFuture<>();WebSocket webSocket = client.newWebSocket(request, new WebSocketListener(){@Overridepublic void onOpen(WebSocket webSocket, Response response) {webSocket.send(body);}@Overridepublic void onMessage(WebSocket webSocket, String res) {JSONObject obj = JSON.parseObject(res);String str= obj.getJSONObject("payload").getJSONObject("choices").getJSONArray("text").getJSONObject(0).getString("content");builderSb.append(str);if(obj.getJSONObject("header").getLong("status")==2){webSocket.close(1000, "Closing WebSocket connection");messageReceived.complete(res); // 将收到的消息传递给 CompletableFuture}}});String resItem = messageReceived.get(30, TimeUnit.SECONDS);; // 阻塞等待消息返回webSocket.close(1000, "Closing WebSocket connection");result.setData(builderSb.toString());result.setCode(200);result.setMsg("天梦星");}catch (Exception e){e.printStackTrace();}return result;}}

5.控制层

import com.example.springbootServiceNetwork.demos.web.Config.JwtInfo;
import com.example.springbootServiceNetwork.demos.web.Config.Result;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkParamDto;
import com.example.springbootServiceNetwork.demos.web.Service.JwtRedistService;
import com.example.springbootServiceNetwork.demos.web.Service.SparkService;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;@RestController
@RequestMapping("/Spark")
public class SparkController {@Resourceprivate SparkService sparkService;@Resourceprivate JwtRedistService jwtRedistService;@PostMapping("/chat")public Result SparkChatApi(@RequestBody SparkParamDto sparkParam, @RequestHeader("token") String token){JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);if(jwtInfo.getPass()){return sparkService.SparkChat(sparkParam,jwtInfo);}else {return jwtInfo.getResult();}}
}

6.测试

http://localhost:8082/Spark/chat{"content":"帮我写一份本地js模糊查询"
}{"code": 200,"msg": "天梦星","data": "以下是一个简单的本地 JavaScript 模糊查询的示例代码:\n\n```javascript\n// 假设有一个数据列表,包含商品的名称和价格\nconst products = [\n  { name: \"苹果\", price: 1.99 },\n  { name: \"香蕉\", price: 0.99 },\n  { name: \"橙子\", price: 2.49 },\n  { name: \"草莓\", price: 3.99 },\n];\n\n// 实现模糊查询函数\nfunction searchProducts(keyword) {\n  // 将关键字转换为小写,以忽略大小写的差异\n  const lowerCaseKeyword = keyword.toLowerCase();\n\n  // 使用数组的 filter 方法进行模糊查询\n  const results = products.filter((product) => {\n    // 将商品名称转换为小写,并使用 includes 方法检查是否包含关键字\n    return product.name.toLowerCase().includes(lowerCaseKeyword);\n  });\n\n  return results;\n}\n\n// 测试模糊查询函数\nconst keyword = \"果\"; // 输入要查询的关键字\nconst searchResults = searchProducts(keyword);\nconsole.log(searchResults);\n```\n\n上述代码中,我们首先定义了一个包含商品名称和价格的数据列表 `products`。然后实现了一个 `searchProducts` 函数,该函数接受一个关键字作为参数,并返回包含该关键字的商品列表。在函数内部,我们将关键字转换为小写,并使用数组的 `filter` 方法对商品列表进行模糊查询。最后,我们通过调用 `searchProducts` 函数并打印结果来进行测试。"
}

 备注:这步骤是我的业务流程,你可以省略不写

JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);

返回数据格式,已有忽略

@Data
public class Result {private Integer code;//状态码private Object msg;//状态信息或者报错信息private Object data;//返回数据private Integer count;//总条数
}

已经三天没吃饭了,大佬行行好

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻松拿下指针(5)

文章目录 一、回调函数是什么二、qsort使用举例三、qsort函数的模拟实现 一、回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#x…

肺部营养“救星”,让每次呼吸更自由

​#肺科营养#朗格力#班古营养#复合营养素#肺部营养# 正常的健康人,每天自由幸福的呼吸。但是对于肺病患者来说,特别是慢阻肺人群,每一次呼吸都可能是一场挑战,每一口气都显得弥足珍贵。 肺病患者号称沉默的“呼吸杀手”,它虽然沉默,但不代表它没能力,除了引起肺功能下降,氧气…

云商店如何让更多企业摘到技术普惠的“果实”?

文 | 智能相对论 作者 | 沈浪 现阶段&#xff0c;越是工业体系发达的地区&#xff0c;越需要加速技术普惠的步伐。比如&#xff0c;在苏州&#xff0c;华为云就在联合当地政府、企业伙伴打造以华为云云商店为重要链接的智能化商业增长底座。 华为云云商店以“电商式”的购物…

OpenAI春季发布会-免费多模态GPT4O-简介

前言 2024.5.14&#xff0c;OpenAI宣布即将发布一款性能更为强大的大模型GPT4o&#xff0c;虽然没有爆出些超级酷炫无敌吊炸天的新玩意&#xff0c;但是这次的多模态模型&#xff0c;大家可以免费用了~~&#xff08;但是&#xff09; 虽然是免费使用&#xff0c;但官方发布会上…

鸿蒙 DevEcoStudio:用户名密码获取保存

【使用首选项实现用户名密码保存获取】 打开src/main/ets/entryability路径下的EntryAbility.ts文件 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate);下边添加内容&…

分析 vs2019 c++ 中的 decltype 与 declval

&#xff08;1&#xff09; decltype 可以让推断其参数的类型。按住 ctrl 点击 decltype &#xff0c;会发现无法查阅 其定义 &#xff1a; &#xff08;2&#xff09; 但 STL 库里咱们可以查阅函数 declval 的 定义&#xff0c;很短&#xff0c;摘抄如下&#xff1a; templat…

【氮化镓】高温GaN HEMTs大信号模型——ASM-HEMT

这篇文章的标题是《An ASM-HEMT for Large-Signal Modeling of GaN HEMTs in High-Temperature Applications》&#xff0c;由Nicholas C. Miller等人撰写&#xff0c;发表于2023年9月29日。文章的主要内容是关于一种适用于高温应用的GaN HEMTs&#xff08;高电子迁移率晶体管&…

使用System.Drawing绘制基本几何图形

1.使用System.Drawing绘制一个正方形 using System; using System.Drawing; using System.Windows.Forms;public partial class MyForm : Form {public MyForm(){// 你可以在这里设置Form的双缓冲&#xff0c;以避免绘制时出现的闪烁 this.DoubleBuffered true;}protected o…

Linux——缓冲区

一、问题引入 我们先来看看下面的代码&#xff1a;我们使用了C语言接口和系统调用接口来进行文件操作。在代码的最后&#xff0c;我们还使用fork函数创建了一个子进程。 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h&…

将jar打包成exe可安装程序,并在html页面唤醒

一、exe4j将jar打包成exe 1.exe4j下载 下载地址&#xff1a;https://www.ej-technologies.com/download/exe4j/files 2.exe4j打包jar 2.1. welcome 可以选择历史配置&#xff0c;新增则直接下一步 2.2. project type选择“jar in exe” mode 2.3. application info设置应用…

【接口测试_03课_-接口自动化思维梳理及Requests库应用】

一、通过代码&#xff0c;实现Jmeter 1、项目要放在虚拟环境里面&#xff0c;解释器要使用虚拟环境的 上面是虚拟环境&#xff0c;下面是系统环境。2选一 venv目录 查看当前虚拟环境已存在的依赖包 2、安装Requests依赖包 1&#xff09;安装命令 pip install requests 如果…

防火墙技术的演进,什么是下一代防火墙(NGFW)?

防火墙技术的演进 防火墙技术的演进经历了不同阶段&#xff0c;从包过滤防火墙到状态检测防火墙&#xff0c;再到集成多种安全功能的UTM&#xff08;统一威胁管理&#xff09;设备&#xff0c;最终发展到具备应用识别能力的NGFW&#xff08;下一代防火墙&#xff09;。 包过滤…

DTAS 尺寸公差分析及尺寸链计算-建模神器 — 用户DIY装配

工业互联网&#xff08;工业4.0) 是未来智能制造的核心&#xff0c;工业软件是智能制造的灵魂。 相关工业软件及系统的自主研发是智能制造和质量升级转型亟需解决的卡脖子环节&#xff0c;而公差分析软件系统是前期质量研发精准设计、降本增效的关键。 数字化时代&#xff0…

知了汇智副总经理赵懋骏出席“走进阿里”CEO联席会,共话AI大模型新趋势

在智能科技日新月异的今天&#xff0c;汇智知了堂副总经理赵懋骏于3月28日受邀出席了在天府软件园举行的“走进阿里–2024年CEO联席会”&#xff0c;会议聚焦阿里云AI技术的最新进展与行业应用&#xff0c;特别是“AI技术正在加速变革&#xff1a;大模型的历史、现在与趋势”&a…

手撕C语言题典——环形链表的约瑟夫问题

目录 前言 一.故事背景 二.题目 ​编辑三.思路 1&#xff09;数组 ​编辑2&#xff09; 循环链表 四.代码实现 搭配食用更佳哦~~ 数据结构之单单单——链表-CSDN博客 数据结构之单链表的基本操作-CSDN博客 前面学了单链表的相关知识&#xff0c;我们来尝试做一下关于…

灌区信息化管理平台系统包含哪些内容?(全面介绍)

政策背景 2022年12月29日&#xff0c;水利部启动48处大中型灌区开展数字孪生灌区先行先试建设。 2023年2月24日&#xff0c;《2023年农村水利水电工作要点》:2023年农村水利水电工作的总体思路包括:紧盯保障国家粮食安全&#xff0c;加快推进大中型灌区现代化改造&#xff0c;…

bmi088-linux驱动(I2C)

电气特性&#xff1a; 在正常工作时&#xff0c;gyro 工作电流为5mA&#xff0c;acc 工作电流为150uA。 SPI 时钟和数据电平范围 0 -3.6 结构框图如下&#xff1a; 硬件连接图如下&#xff1a; note&#xff1a; 1. 通过PS引脚选择通讯协议&#xff0c;上拉引脚则选择的是I2C…

系统定期执行命令的方法

系统定期执行命令的方法 一、进入超级用户下 执行命令&#xff1a;sudo su 二、添加要执行的命令 例子&#xff1a;每天0点执行一次myapp.sh命令 先后输入&#xff1a;crontab -e、 1、 回车 设置每天0点执行一次myapp.sh操作&#xff0c;需要写绝对路径 含义&#xff1…

离线修复.dll,Microsoft Visual C++

在安装mysql时遇到下面的问题&#xff0c;如果是有网络的情况下微软管网下载安装就行了&#xff0c;用的服务器不允许连接互联网。 后面经过寻找&#xff0c;找到了一个修复工具&#xff0c;可一次修复所有的问题&#xff0c;特别好用分享给宝子们。 下载链接&#xff1a;http…

树莓派 4B putty远程连接登录显示拒绝访问,密码修改

putty显示拒绝访问 可能是树莓派的ip没有找到正确的 在下载系统镜像的时候&#xff0c;会提示设置wifi 这里设置的WiFi和密码需记住&#xff0c;主机名也需记住 可以在手机打开热点&#xff08;将热点的账号和密码改为跟你设置的wifi一样的&#xff09; 可以在手机后台查看…