diff --git a/src/main/java/com/unfbx/sparkdesk/constant/SparkDesk.java b/src/main/java/com/unfbx/sparkdesk/constant/SparkDesk.java
index afbe01b..30a8b42 100644
--- a/src/main/java/com/unfbx/sparkdesk/constant/SparkDesk.java
+++ b/src/main/java/com/unfbx/sparkdesk/constant/SparkDesk.java
@@ -22,4 +22,12 @@ public class SparkDesk {
* 星火v2.1地址:wss协议
*/
public final static String SPARK_API_HOST_WSS_V2_1 = "https://spark-api.xf-yun.com/v2.1/chat";
+ /**
+ * 星火v3.1地址:ws协议
+ */
+ public final static String SPARK_API_HOST_WS_V3_1 = "http://spark-api.xf-yun.com/v3.1/chat";
+ /**
+ * 星火v3.1地址:wss协议
+ */
+ public final static String SPARK_API_HOST_WSS_V3_1 = "https://spark-api.xf-yun.com/v3.1/chat";
}
diff --git a/src/main/java/com/unfbx/sparkdesk/entity/Chat.java b/src/main/java/com/unfbx/sparkdesk/entity/Chat.java
index d973408..cf6a186 100644
--- a/src/main/java/com/unfbx/sparkdesk/entity/Chat.java
+++ b/src/main/java/com/unfbx/sparkdesk/entity/Chat.java
@@ -17,8 +17,8 @@
@JsonIgnoreProperties(ignoreUnknown = true)
public class Chat {
/**
- * 取值为[general,generalv2]
- * 指定访问的领域,general指向V1.5版本 generalv2指向V2版本。注意:不同的取值对应的url也不一样!
+ * 取值为[general,generalv2,generalv3]
+ * 指定访问的领域,general指向V1.5版本,generalv2指向V2版本,generalv3指向V3版本 。注意:不同的取值对应的url也不一样!
*/
private String domain;
/**
@@ -26,7 +26,11 @@ public class Chat {
*/
private double temperature;
/**
- * 取值为[1,4096],默认为2048
+ * 模型回答的tokens的最大长度
+ *
+ * V1.5取值为[1,4096]
+ * V2.0取值为[1,8192],默认为2048。
+ * V3.0取值为[1,8192],默认为2048。
*/
@JsonProperty("max_tokens")
private Integer maxTokens;
diff --git a/src/main/java/com/unfbx/sparkdesk/entity/Function.java b/src/main/java/com/unfbx/sparkdesk/entity/Function.java
new file mode 100644
index 0000000..d5e9feb
--- /dev/null
+++ b/src/main/java/com/unfbx/sparkdesk/entity/Function.java
@@ -0,0 +1,85 @@
+package com.unfbx.sparkdesk.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author cnzbq
+ * @since 11/30/2023
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Function {
+ /**
+ * 列表形式,列表中的元素是json格式
+ * 元素中包含name、description、parameters属性
+ */
+ private List text;
+
+ @Data
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class Text {
+ /**
+ * function名称 用户输入命中后,会返回该名称
+ */
+ private String name;
+ /**
+ * function功能描述 描述function功能即可,越详细越有助于大模型理解该function
+ */
+ private String description;
+ /**
+ * function参数列表
+ */
+ private Parameter parameters;
+ }
+
+ @Data
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class Parameter {
+ /**
+ * 参数类型
+ */
+ private String type;
+ /**
+ * 参数信息描述
+ * 该内容由用户定义,命中该方法时需要返回哪些参数
+ */
+ private Map properties;
+ /**
+ * 必须返回的参数列表
+ * 该内容由用户定义,命中方法时必须返回的字段
+ */
+ private List required;
+ }
+
+
+ @Data
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class Properties {
+ /**
+ * 参数类型描述
+ * 该内容由用户定义,需要返回的参数是什么类型
+ */
+ private String type;
+ /**
+ * 参数详细描述
+ * 该内容由用户定义,需要返回的参数的具体描述
+ */
+ private String description;
+ }
+}
diff --git a/src/main/java/com/unfbx/sparkdesk/entity/FunctionCall.java b/src/main/java/com/unfbx/sparkdesk/entity/FunctionCall.java
new file mode 100644
index 0000000..9b25df3
--- /dev/null
+++ b/src/main/java/com/unfbx/sparkdesk/entity/FunctionCall.java
@@ -0,0 +1,27 @@
+package com.unfbx.sparkdesk.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author cnzbq
+ * @since 11/30/2023
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FunctionCall {
+ /**
+ * 客户在请求体中定义的参数及参数值
+ */
+ private String arguments;
+ /**
+ * 客户在请求体中定义的方法名称
+ */
+ private String name;
+}
diff --git a/src/main/java/com/unfbx/sparkdesk/entity/InPayload.java b/src/main/java/com/unfbx/sparkdesk/entity/InPayload.java
index 549452f..a49c82f 100644
--- a/src/main/java/com/unfbx/sparkdesk/entity/InPayload.java
+++ b/src/main/java/com/unfbx/sparkdesk/entity/InPayload.java
@@ -16,4 +16,5 @@
@JsonIgnoreProperties(ignoreUnknown = true)
public class InPayload {
private Message message;
+ private Function functions;
}
diff --git a/src/main/java/com/unfbx/sparkdesk/entity/Text.java b/src/main/java/com/unfbx/sparkdesk/entity/Text.java
index 648ba57..a80568c 100644
--- a/src/main/java/com/unfbx/sparkdesk/entity/Text.java
+++ b/src/main/java/com/unfbx/sparkdesk/entity/Text.java
@@ -1,6 +1,7 @@
package com.unfbx.sparkdesk.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
/**
@@ -24,6 +25,16 @@ public class Text {
* 结果序号,取值为[0,10]; 当前为保留字段,开发者可忽略
*/
private Integer index;
+ /**
+ * /
+ */
+ @JsonProperty("content_type")
+ private String contentType;
+ /**
+ * function call 返回结果
+ */
+ @JsonProperty("function_call")
+ private FunctionCall functionCall;
@Getter
public enum Role {
diff --git a/src/test/java/com/unfbx/AppTest.java b/src/test/java/com/unfbx/AppTest.java
index 8e553b9..ca4ca48 100644
--- a/src/test/java/com/unfbx/AppTest.java
+++ b/src/test/java/com/unfbx/AppTest.java
@@ -8,9 +8,7 @@
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
import java.util.concurrent.CountDownLatch;
/**
@@ -22,16 +20,16 @@ public class AppTest {
@Test
public void test() {
SparkDeskClient sparkDeskClient = SparkDeskClient.builder()
- .host(SparkDesk.SPARK_API_HOST_WS_V2_1)
+ .host(SparkDesk.SPARK_API_HOST_WS_V3_1)
.appid("****")
.apiKey("************************")
.apiSecret("************************")
.build();
- InHeader header = InHeader.builder().uid(UUID.randomUUID().toString().substring(0, 10)).appid("****").build();
- Parameter parameter = Parameter.builder().chat(Chat.builder().domain("generalv2").maxTokens(2048).temperature(0.3).build()).build();
+ InHeader header = InHeader.builder().uid(UUID.randomUUID().toString().substring(0, 10)).appid(sparkDeskClient.getAppid()).build();
+ Parameter parameter = Parameter.builder().chat(Chat.builder().domain("generalv3").maxTokens(2048).temperature(0.3).build()).build();
List text = new ArrayList<>();
- text.add(Text.builder().role(Text.Role.USER.getName()).content("使用md文档格式写出一个三行三列的表格,表头包含:姓名,性别,爱好。数据随机即可。").build());
- InPayload payload = InPayload.builder().message(Message.builder().text(text).build()).build();
+ text.add(Text.builder().role(Text.Role.USER.getName()).content("北京天气").build());
+ InPayload payload = InPayload.builder().message(Message.builder().text(text).build()).functions(buildFunction()).build();
AIChatRequest aiChatRequest = AIChatRequest.builder().header(header).parameter(parameter).payload(payload).build();
sparkDeskClient.chat(new ChatListener(aiChatRequest) {
@@ -64,4 +62,29 @@ public void onChatToken(Usage usage) {
e.printStackTrace();
}
}
+
+ private Function buildFunction() {
+ Function function = new Function();
+ Function.Text text1 = new Function.Text();
+ function.setText(Collections.singletonList(text1));
+
+ text1.setName("天气查询");
+ text1.setDescription("天气插件可以提供天气相关信息。你可以提供指定的地点信息、指定的时间点或者时间段信息,来检索诗词库,精准检索到天气信息。");
+
+ Function.Parameter parameter = new Function.Parameter();
+ text1.setParameters(parameter);
+
+ parameter.setType("object");
+
+ Function.Properties location = Function.Properties.builder().type("string").description("地点,比如北京。").build();
+ Function.Properties date = Function.Properties.builder().type("string").description("日期。").build();
+
+ Map map = new HashMap<>();
+ map.put("location", location);
+ map.put("date", date);
+ parameter.setProperties(map);
+
+ parameter.setRequired(Collections.singletonList("location"));
+ return function;
+ }
}