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; + } }