首页 > 编程语言 >java接入科大讯飞的星火模型(ChatSparkDesk)

java接入科大讯飞的星火模型(ChatSparkDesk)

时间:2023-06-14 17:13:00浏览次数:44  
标签:java String ChatSparkDesk JsonObject static 科大 new public

目前智能AI比较火热,国外的chatgpt,国内的文言一心,科飞的ChatSparkDesk,之前博客已经写了openai的chatgpt由网友需求,现在分享科大讯飞的星火模型,复制可以修改key可以直接使用

不熟悉或者不理解可以加入微信  nlks2023交流,文字聊天简单版,具体可以根据业务修改

public class ChatSparkDesk  extends WebSocketListener {
private final Logger logger =Logger.getLogger(ChatSparkDesk.class);
public final static String authorizationHostUrl = "https://spark-api.xf-yun.com/v1.1/chat";
public final static String APPID = "xxxxxxxxxxxxx";
public final static String APIKEY = "xxxxxxxxxxxxxxxxxxxxxxx";
public final static String APISECRET = "xxxxxxxxxxxxxxxxxxxxxxxxx";
public final static Gson json = new Gson();
public static String answer = "";
public static String question = "中国面积有多大";
public static String questionAnswer = "";

public static void main(String[] args) throws Exception {
ChatSparkDesk.chatSparkDesk(question,getAuthorizationUrl());
String answer = ChatSparkDesk.answer;
long start = System.currentTimeMillis();
while (StringUtils.isBlank(answer)) {
answer = ChatSparkDesk.answer;
if ((System.currentTimeMillis() - start) > 5000) {
break;
}
}
System.out.println(answer);
}

public static void chatSparkDesk(String question, String url) {
ChatSparkDesk.question = question;
ChatSparkDesk.answer = "";
ChatSparkDesk.questionAnswer = "";
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();
okHttpClient.newWebSocket(request, new ChatSparkDesk());
}

@Override
public void onOpen(WebSocket webSocket, @NotNull Response response) {
JsonObject frame = new JsonObject();
JsonObject header = new JsonObject();
JsonObject chat = new JsonObject();
JsonObject parameter = new JsonObject();
JsonObject payload = new JsonObject();
JsonObject message = new JsonObject();
JsonObject text = new JsonObject();
JsonArray ja = new JsonArray();
header.addProperty("app_id", APPID);
chat.addProperty("domain", "general");
chat.addProperty("max_tokens", 1024);
parameter.add("chat", chat);
text.addProperty("role", "user");
text.addProperty("content", question);
ja.add(text);
message.add("text", ja);
payload.add("message", message);
frame.add("header", header);
frame.add("parameter", parameter);
frame.add("payload", payload);
webSocket.send(frame.toString());
}


@Override
public void onMessage(WebSocket webSocket, String text) {
super.onMessage(webSocket, text);
ResponseData responseData = json.fromJson(text,ResponseData.class);
if(0 == responseData.getHeader().get("code").getAsInt()){
if(2 != responseData.getHeader().get("status").getAsInt()){
Payload pl = json.fromJson(responseData.getPayload(),Payload.class);
JsonArray temp = (JsonArray) pl.getChoices().get("text");
JsonObject jo = (JsonObject) temp.get(0);
questionAnswer += jo.get("content").getAsString();
}else {
Payload pl1 = json.fromJson(responseData.getPayload(),Payload.class);
JsonArray temp1 = (JsonArray) pl1.getChoices().get("text");
JsonObject jo = (JsonObject) temp1.get(0);
questionAnswer += jo.get("content").getAsString();
ChatSparkDesk.answer=questionAnswer;
webSocket.close(3,"客户端主动断开链接");
}
}else{
logger.error("返回结果错误:=======code:" + responseData.getHeader().get("code") + responseData.getHeader().get("message"));
webSocket.close(3, "客户端主动断开链接");
}
}

//鉴权url
public static String getAuthorizationUrl() throws Exception {
URL url = new URL(authorizationHostUrl);
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());
Charset charset = StandardCharsets.UTF_8;
Mac mac = Mac.getInstance("hmacsha256");
SecretKeySpec sp = new SecretKeySpec(APISECRET.getBytes(charset), "hmacsha256");
mac.init(sp);
String builder = "host: " + url.getHost() + "\n" +
"date: " + date + "\n" +
"GET " + url.getPath() + " HTTP/1.1";
byte[] basebefore = mac.doFinal(builder.getBytes(charset));
String signature = Base64.getEncoder().encodeToString(basebefore);
String authorization_origin = String.format("api_key=\"%s\",algorithm=\"%s\",headers=\"%s\",signature=\"%s\"", APIKEY, "hmac-sha256", "host date request-line", signature);
String authorization = Base64.getEncoder().encodeToString(authorization_origin.getBytes(charset));
HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().//
addQueryParameter("authorization", authorization).//
addQueryParameter("date", date).//
addQueryParameter("host", url.getHost()).//
build();
return httpUrl.toString().replace("https://", "wss://").replace("http://", "ws://");
}

@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
if(response!=null&&response.code()==403){
answer="403";
}
if(response!=null&&response.code()==11200){
MailInfo mailInfo= SpringMailUtil.sendPrepare("xxxxxxx","xxxxxx","科飞tokens可能不够");
SpringMailUtil.sendTxtMail(mailInfo);
answer="11200";
}
}
}

标签:java,String,ChatSparkDesk,JsonObject,static,科大,new,public
From: https://www.cnblogs.com/yswsxf/p/17480799.html

相关文章

  • Java中时间戳的使用
    原文链接当前时间importjava.sql.Timestamp;//导包TimestampnowTime=newTimestamp(System.currentTimeMillis());System.out.println(nowTime);输出:2022-06-0811:15:51.014Long型时间戳LongtimeLong=System.currentTimeMillis();System.out.println("timeLon......
  • java正则多个IP从中找出来匹配结果
    packagecom.yunfatong.evidence.utils;importcn.hutool.core.collection.CollUtil;importcn.hutool.poi.excel.ExcelBase;importcn.hutool.poi.excel.ExcelUtil;importcn.hutool.poi.excel.ExcelWriter;importcn.hutool.poi.excel.StyleSet;importorg.apache.po......
  • java修改Set中的元素
    java修改Set中的元素一.问题的提出在java中,有以下代码:publicclassTest{publicstaticvoidmain(String[]args){Set<Stu>set=newHashSet<>();Stus1=newStu(1);Stus2=newStu(2);set.add(s1);set.add(s2);......
  • Java集合去重的几种方法
    一、List的contains方法去重示例代码如下:importjava.util.ArrayList;importjava.util.List;/***@authorqinxun*@date2023-06-13*@Descripion:List集合去重*/publicclassRepeatDemo{publicstaticvoidmain(String[]args){longstart=S......
  • java面试算法:设计搜索输入框的输入提示功能
    我们使用搜索引擎时,需要在搜索框输入关键字,当你在框中输入头几个字符时,搜索框会出现一个下拉框,里面包含着以当前输入字符为前缀的字符串,如果里面包含你想要输入的内容,那么你就可以直接选取,而不必要把关键字的所有字符依次输入,这种功能极大的提高了搜索体验。本次算法题的题目是,你如......
  • JavaScript 动态编辑元素某属性值(例如:元素div的class属性)
    元素<divclass="h5-box-search-itemusimglistnodisplay"id="usimglist"></div>(满足条件)动态更新div元素的class属性值://获取目标容器letusimglist=document.getElementById('usimglist');//获取其class的属性值letclassinfo=usimglist.ge......
  • Java8-Consumer的使用场景
    Java8的Consumer比较抽象。结合几个例子来看看常用的使用场景有以下几个:把方法作为函数的入参Java8中可以使用Consumer来实现在函数的入参中传递方法,这个如果熟悉js的话可能会比较好理解一些。在某些情况下,不能直接使用某个对象的方法,需要把方法传递到另一个函数里面去执行,那么......
  • Java8-Predicate 策略模式的替代品消灭 if else
    使用策略模式消灭ifelse,可以利用Java8的新特性来实现策略模式。利用Java8的Predicate消灭ifelse。首先定义一个map,key是不同的服务代码,value是需要做校验的条件,然后针对不同的服务代码做校验。当然Supplier、Consumer都可以做类似的实现。//定义校验的策略映射关系staticM......
  • Java8-并行流的使用
    Java8中的并行流使用publicclassStreamTest{publicList<Person>constructPersons(){List<Person>persons=newArrayList<Person>();for(inti=0;i<5;i++){Personp=newPerson(i,"name"+......
  • JavaScript中数组(Array)与对象(Object)中的检索方式
    这里只是要说明一点,数组(Array)和对象(Object)都可以用[...]的方式来进行检索[...]中包含的需要是一个表达式,这个表达式的值最终会以字符串的形式被使用因为不论是数组(Array)还是对象(Object),他们都是以键值对的形式存储内容的,而所有的键的数据类型都是字符串(Array好像不是,但是先这样......