diff --git a/CHANGELOG.md b/CHANGELOG.md
index a38724ece..627e89591 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,9 +2,10 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
-# 5.8.39(2025-05-13)
+# 5.8.39(2025-05-19)
### 🐣新特性
+* 【ai 】 增加SSE流式返回函数参数callback,豆包、grok新增文生图接口,豆包生成视频支持使用model
### 🐞Bug修复
* 【core 】 修复`NumberUtil`isNumber方法以L结尾没有小数点判断问题(issue#3938@Github)
* 【core 】 修复`CharsequenceUtil`toLowerCase方法拼写错误(issue#3941@Github)
diff --git a/hutool-ai/pom.xml b/hutool-ai/pom.xml
index 5efa669bc..fb1cc9a87 100644
--- a/hutool-ai/pom.xml
+++ b/hutool-ai/pom.xml
@@ -40,6 +40,11 @@
${project.parent.version}
compile
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.13.5
+
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/Models.java b/hutool-ai/src/main/java/cn/hutool/ai/Models.java
index dd3ac7364..e11a7f2a7 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/Models.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/Models.java
@@ -123,7 +123,12 @@ public class Models {
DOUBAO_VISION_LITE_32K("doubao-vision-lite-32k-241015"),
DOUBAO_EMBEDDING_LARGE("doubao-embedding-large-text-240915"),
DOUBAO_EMBEDDING_TEXT_240715("doubao-embedding-text-240715"),
- DOUBAO_EMBEDDING_VISION("doubao-embedding-vision-241215");
+ DOUBAO_EMBEDDING_VISION("doubao-embedding-vision-241215"),
+ DOUBAO_SEEDREAM_3_0_T2I("doubao-seedream-3-0-t2i-250415"),
+ Doubao_Seedance_1_0_lite_t2v("doubao-seedance-1-0-lite-t2v-250428"),
+ Doubao_Seedance_1_0_lite_i2v("doubao-seedance-1-0-lite-i2v-250428"),
+ Wan2_1_14B_t2v("wan2-1-14b-t2v-250225"),
+ Wan2_1_14B_i2v("wan2-1-14b-i2v-250225");
private final String model;
@@ -138,6 +143,23 @@ public class Models {
// Grok的模型
public enum Grok {
+ GROK_3_BETA_LATEST("grok-3-beta"),
+ GROK_3_BETA("grok-3-beta"),
+ GROK_3("grok-3-beta"),
+ GROK_3_MINI_FAST_LATEST("grok-3-mini-fast-beta"),
+ GROK_3_MINI_FAST_BETA("grok-3-mini-fast-beta"),
+ GROK_3_MINI_FAST("grok-3-mini-fast-beta"),
+ GROK_3_FAST_LATEST("grok-3-fast-beta"),
+ GROK_3_FAST_BETA("grok-3-fast-beta"),
+ GROK_3_FAST("grok-3-fast-beta"),
+ GROK_3_MINI_LATEST("grok-3-mini-beta"),
+ GROK_3_MINI_BETA("grok-3-mini-beta"),
+ GROK_3_MINI("grok-3-mini-beta"),
+ GROK_2_IMAGE_LATEST("grok-2-image-1212"),
+ GROK_2_IMAGE("grok-2-image-1212"),
+ GROK_2_IMAGE_1212("grok-2-image-1212"),
+ grok_2_latest("grok-2-1212"),
+ GROK_2("grok-2-1212"),
GROK_2_1212("grok-2-1212"),
GROK_2_VISION_1212("grok-2-vision-1212"),
GROK_BETA("grok-beta"),
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/core/AIService.java b/hutool-ai/src/main/java/cn/hutool/ai/core/AIService.java
index 8bff076f8..3805f0e4a 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/core/AIService.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/core/AIService.java
@@ -16,7 +16,9 @@
package cn.hutool.ai.core;
+import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
/**
* 模型公共的API功能,特有的功能在model.xx.XXService下定义
@@ -33,7 +35,25 @@ public interface AIService {
* @return AI回答
* @since 5.8.38
*/
- String chat(String prompt);
+ default String chat(String prompt){
+ final List messages = new ArrayList<>();
+ messages.add(new Message("system", "You are a helpful assistant"));
+ messages.add(new Message("user", prompt));
+ return chat(messages);
+ }
+
+ /**
+ * 对话-SSE流式输出
+ * @param prompt user题词
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ default void chat(String prompt, final Consumer callback){
+ final List messages = new ArrayList<>();
+ messages.add(new Message("system", "You are a helpful assistant"));
+ messages.add(new Message("user", prompt));
+ chat(messages, callback);
+ }
/**
* 对话
@@ -44,4 +64,12 @@ public interface AIService {
*/
String chat(final List messages);
+
+ /**
+ * 对话-SSE流式输出
+ * @param messages 由目前为止的对话组成的消息列表,可以设置role,content。详细参考官方文档
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ void chat(final List messages, final Consumer callback);
}
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/core/BaseAIService.java b/hutool-ai/src/main/java/cn/hutool/ai/core/BaseAIService.java
index 218db8012..a1944394a 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/core/BaseAIService.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/core/BaseAIService.java
@@ -18,8 +18,15 @@ package cn.hutool.ai.core;
import cn.hutool.ai.AIException;
import cn.hutool.http.*;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
import java.util.Map;
+import java.util.function.Consumer;
/**
* 基础AIService,包含基公共参数和公共方法
@@ -102,4 +109,50 @@ public class BaseAIService {
throw new AIException("Failed to send POST request:" + e.getMessage(), e);
}
}
+
+ /**
+ * 支持流式返回的 POST 请求
+ *
+ * @param endpoint 请求地址
+ * @param paramMap 请求参数
+ * @param callback 流式数据回调函数
+ */
+ protected void sendPostStream(final String endpoint, final Map paramMap, Consumer callback) {
+ HttpURLConnection connection = null;
+ try {
+ // 创建连接
+ URL apiUrl = new URL(config.getApiUrl() + endpoint);
+ connection = (HttpURLConnection) apiUrl.openConnection();
+ connection.setRequestMethod(Method.POST.name());
+ connection.setRequestProperty(Header.CONTENT_TYPE.getValue(), "application/json");
+ connection.setRequestProperty(Header.AUTHORIZATION.getValue(), "Bearer " + config.getApiKey());
+ connection.setDoOutput(true);
+ //5分钟
+ connection.setReadTimeout(300000);
+ //3分钟
+ connection.setConnectTimeout(180000);
+ // 发送请求体
+ try (OutputStream os = connection.getOutputStream()) {
+ String jsonInputString = new ObjectMapper().writeValueAsString(paramMap);
+ os.write(jsonInputString.getBytes());
+ os.flush();
+ }
+
+ // 读取流式响应
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ // 调用回调函数处理每一行数据
+ callback.accept(line);
+ }
+ }
+ } catch (Exception e) {
+ callback.accept("{\"error\": \"" + e.getMessage() + "\"}");
+ } finally {
+ // 关闭连接
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
}
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekService.java b/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekService.java
index b601d5934..d537a078d 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekService.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekService.java
@@ -17,6 +17,7 @@
package cn.hutool.ai.model.deepseek;
import cn.hutool.ai.core.AIService;
+import java.util.function.Consumer;
/**
* deepSeek支持的扩展接口
@@ -35,6 +36,14 @@ public interface DeepSeekService extends AIService {
*/
String beta(String prompt);
+ /**
+ * 模型beta功能-SSE流式输出
+ * @param prompt 题词
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ void beta(String prompt, final Consumer callback);
+
/**
* 列出所有模型列表
*
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekServiceImpl.java b/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekServiceImpl.java
index 54c38f9dc..624b97aab 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekServiceImpl.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/model/deepseek/DeepSeekServiceImpl.java
@@ -19,6 +19,7 @@ package cn.hutool.ai.model.deepseek;
import cn.hutool.ai.core.AIConfig;
import cn.hutool.ai.core.BaseAIService;
import cn.hutool.ai.core.Message;
+import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
@@ -26,6 +27,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
/**
* DeepSeek服务,AI具体功能的实现
@@ -54,15 +56,6 @@ public class DeepSeekServiceImpl extends BaseAIService implements DeepSeekServic
super(config);
}
- @Override
- public String chat(final String prompt) {
- // 定义消息结构
- final List messages = new ArrayList<>();
- messages.add(new Message("system", "You are a helpful assistant"));
- messages.add(new Message("user", prompt));
- return chat(messages);
- }
-
@Override
public String chat(final List messages) {
final String paramJson = buildChatRequestBody(messages);
@@ -70,6 +63,12 @@ public class DeepSeekServiceImpl extends BaseAIService implements DeepSeekServic
return response.body();
}
+ @Override
+ public void chat(final List messages, final Consumer callback) {
+ Map paramMap = buildChatStreamRequestBody(messages);
+ ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "deepseek-chat-sse").start();
+ }
+
@Override
public String beta(final String prompt) {
final String paramJson = buildBetaRequestBody(prompt);
@@ -77,6 +76,12 @@ public class DeepSeekServiceImpl extends BaseAIService implements DeepSeekServic
return response.body();
}
+ @Override
+ public void beta(final String prompt, final Consumer callback) {
+ Map paramMap = buildBetaStreamRequestBody(prompt);
+ ThreadUtil.newThread(() -> sendPostStream(BETA_ENDPOINT, paramMap, callback::accept), "deepseek-beta-sse").start();
+ }
+
@Override
public String models() {
final HttpResponse response = sendGet(MODELS_ENDPOINT);
@@ -101,6 +106,19 @@ public class DeepSeekServiceImpl extends BaseAIService implements DeepSeekServic
return JSONUtil.toJsonStr(paramMap);
}
+ // 构建chatStream请求体
+ private Map buildChatStreamRequestBody(final List messages) {
+ //使用JSON工具
+ final Map paramMap = new HashMap<>();
+ paramMap.put("stream", true);
+ paramMap.put("model", config.getModel());
+ paramMap.put("messages", messages);
+ //合并其他参数
+ paramMap.putAll(config.getAdditionalConfigMap());
+
+ return paramMap;
+ }
+
// 构建beta请求体
private String buildBetaRequestBody(final String prompt) {
// 定义消息结构
@@ -108,10 +126,23 @@ public class DeepSeekServiceImpl extends BaseAIService implements DeepSeekServic
final Map paramMap = new HashMap<>();
paramMap.put("model", config.getModel());
paramMap.put("prompt", prompt);
-// //合并其他参数
+ //合并其他参数
paramMap.putAll(config.getAdditionalConfigMap());
return JSONUtil.toJsonStr(paramMap);
}
+ // 构建betaStream请求体
+ private Map buildBetaStreamRequestBody(final String prompt) {
+ //使用JSON工具
+ final Map paramMap = new HashMap<>();
+ paramMap.put("stream", true);
+ paramMap.put("model", config.getModel());
+ paramMap.put("prompt", prompt);
+ //合并其他参数
+ paramMap.putAll(config.getAdditionalConfigMap());
+
+ return paramMap;
+ }
+
}
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoService.java b/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoService.java
index 14d087115..e94ae258f 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoService.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoService.java
@@ -19,7 +19,9 @@ package cn.hutool.ai.model.doubao;
import cn.hutool.ai.core.AIService;
import cn.hutool.ai.core.Message;
+import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
/**
* doubao支持的扩展接口
@@ -29,6 +31,30 @@ import java.util.List;
*/
public interface DoubaoService extends AIService {
+ /**
+ * 图像理解:模型会依据传入的图片信息以及问题,给出回复。
+ *
+ * @param prompt 提问
+ * @param images 传入的图片列表地址/或者图片Base64编码图片列表(URI形式)
+ * @return AI回答
+ * @since 5.8.38
+ */
+ default String chatVision(String prompt, final List images) {
+ return chatVision(prompt, images, DoubaoCommon.DoubaoVision.AUTO.getDetail());
+ }
+
+ /**
+ * 图像理解-SSE流式输出
+ *
+ * @param prompt 提问
+ * @param images 图片列表/或者图片Base64编码图片列表(URI形式)
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ default void chatVision(String prompt, final List images, final Consumer callback) {
+ chatVision(prompt, images, DoubaoCommon.DoubaoVision.AUTO.getDetail(), callback);
+ }
+
/**
* 图像理解:模型会依据传入的图片信息以及问题,给出回复。
*
@@ -41,16 +67,15 @@ public interface DoubaoService extends AIService {
String chatVision(String prompt, final List images, String detail);
/**
- * 图像理解:模型会依据传入的图片信息以及问题,给出回复。
+ * 图像理解-SSE流式输出
*
* @param prompt 提问
* @param images 传入的图片列表地址/或者图片Base64编码图片列表(URI形式)
- * @return AI回答
- * @since 5.8.38
+ * @param detail 手动设置图片的质量,取值范围high、low、auto,默认为auto
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
*/
- default String chatVision(String prompt, final List images) {
- return chatVision(prompt, images, DoubaoCommon.DoubaoVision.AUTO.getDetail());
- }
+ void chatVision(String prompt, final List images, String detail, final Consumer callback);
/**
* 创建视频生成任务
@@ -66,7 +91,7 @@ public interface DoubaoService extends AIService {
/**
* 创建视频生成任务
- * 注意:调用该方法时,配置config中的model为您创建的推理接入点(Endpoint)ID。详细参考官方文档
+ * 注意:调用该方法时,配置config中的model为生成视频的模型或者您创建的推理接入点(Endpoint)ID。详细参考官方文档
*
* @param text 文本提示词
* @param image 图片/或者图片Base64编码图片(URI形式)
@@ -114,6 +139,15 @@ public interface DoubaoService extends AIService {
*/
String botsChat(final List messages);
+ /**
+ * 应用(Bot)-SSE流式输出 config中model设置为您创建的应用ID
+ *
+ * @param messages 由对话组成的消息列表。如系统人设,背景信息等,用户自定义的信息
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ void botsChat(final List messages, final Consumer callback);
+
/**
* 分词:可以将文本转换为模型可理解的 token id,并返回文本的 tokens 数量、token id、 token 在原始文本中的偏移量等信息
*
@@ -132,7 +166,12 @@ public interface DoubaoService extends AIService {
* @return AI回答
* @since 5.8.38
*/
- String batchChat(String prompt);
+ default String batchChat(String prompt){
+ final List messages = new ArrayList<>();
+ messages.add(new Message("system", "You are a helpful assistant"));
+ messages.add(new Message("user", prompt));
+ return batchChat(messages);
+ }
/**
* 批量推理 Chat
@@ -179,7 +218,26 @@ public interface DoubaoService extends AIService {
* @return AI的回答
* @since 5.8.38
*/
- String chatContext(String prompt, String contextId);
+ default String chatContext(String prompt, String contextId){
+ final List messages = new ArrayList<>();
+ messages.add(new Message("user", prompt));
+ return chatContext(messages, contextId);
+ }
+
+ /**
+ * 上下文缓存对话-SSE流式输出
+ * 注意:配置config中的model可以为您创建的推理接入点(Endpoint)ID,也可以是支持chat的model
+ *
+ * @param prompt 对话的内容题词
+ * @param contextId 创建上下文缓存后获取的缓存id
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ default void chatContext(String prompt, String contextId, final Consumer callback){
+ final List messages = new ArrayList<>();
+ messages.add(new Message("user", prompt));
+ chatContext(messages, contextId, callback);
+ }
/**
* 上下文缓存对话: 向大模型发起带上下文缓存的请求
@@ -192,4 +250,25 @@ public interface DoubaoService extends AIService {
*/
String chatContext(final List messages, String contextId);
+ /**
+ * 上下文缓存对话-SSE流式输出
+ * 注意:配置config中的model可以为您创建的推理接入点(Endpoint)ID,也可以是支持chat的model
+ *
+ * @param messages 对话的信息 不支持最后一个元素的role设置为assistant。如使用session 缓存(mode设置为session)传入最新一轮对话的信息,无需传入历史信息
+ * @param contextId 创建上下文缓存后获取的缓存id
+ * @param callback 流式数据回调函数
+ * @since 5.8.39
+ */
+ void chatContext(final List messages, String contextId, final Consumer callback);
+
+ /**
+ * 文生图
+ * 请设置config中model为支持图片功能的模型,目前支持Doubao-Seedream-3.0-t2i
+ *
+ * @param prompt 题词
+ * @return 包含生成图片的url
+ * @since 5.8.39
+ */
+ String imagesGenerations(String prompt);
+
}
diff --git a/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoServiceImpl.java b/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoServiceImpl.java
index 88a24d218..c1836fec4 100644
--- a/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoServiceImpl.java
+++ b/hutool-ai/src/main/java/cn/hutool/ai/model/doubao/DoubaoServiceImpl.java
@@ -19,6 +19,7 @@ package cn.hutool.ai.model.doubao;
import cn.hutool.ai.core.AIConfig;
import cn.hutool.ai.core.BaseAIService;
import cn.hutool.ai.core.Message;
+import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
@@ -27,6 +28,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
/**
* Doubao服务,AI具体功能的实现
@@ -54,21 +56,14 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
private final String CHAT_CONTEXT = "/context/chat/completions";
//创建视频生成任务
private final String CREATE_VIDEO = "/contents/generations/tasks";
+ //文生图
+ private final String IMAGES_GENERATIONS = "/images/generations";
public DoubaoServiceImpl(final AIConfig config) {
//初始化doubao客户端
super(config);
}
- @Override
- public String chat(String prompt) {
- // 定义消息结构
- final List messages = new ArrayList<>();
- messages.add(new Message("system", "You are a helpful assistant"));
- messages.add(new Message("user", prompt));
- return chat(messages);
- }
-
@Override
public String chat(final List messages) {
String paramJson = buildChatRequestBody(messages);
@@ -76,6 +71,12 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return response.body();
}
+ @Override
+ public void chat(final List messages, final Consumer callback) {
+ Map paramMap = buildChatStreamRequestBody(messages);
+ ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "doubao-chat-sse").start();
+ }
+
@Override
public String chatVision(String prompt, final List images, String detail) {
String paramJson = buildChatVisionRequestBody(prompt, images, detail);
@@ -83,6 +84,12 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return response.body();
}
+ @Override
+ public void chatVision(String prompt, List images, String detail, Consumer callback) {
+ Map paramMap = buildChatVisionStreamRequestBody(prompt, images, detail);
+ ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "doubao-chatVision-sse").start();
+ }
+
@Override
public String videoTasks(String text, String image, final List videoParams) {
String paramJson = buildGenerationsTasksRequestBody(text, image, videoParams);
@@ -118,6 +125,12 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return response.body();
}
+ @Override
+ public void botsChat(List messages, Consumer callback) {
+ Map paramMap = buildBotsChatStreamRequestBody(messages);
+ ThreadUtil.newThread(() -> sendPostStream(BOTS_CHAT, paramMap, callback::accept), "doubao-botsChat-sse").start();
+ }
+
@Override
public String tokenization(String[] text) {
String paramJson = buildTokenizationRequestBody(text);
@@ -125,14 +138,6 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return response.body();
}
- @Override
- public String batchChat(String prompt) {
- // 定义消息结构
- final List messages = new ArrayList<>();
- messages.add(new Message("system", "You are a helpful assistant"));
- messages.add(new Message("user", prompt));
- return batchChat(messages);
- }
@Override
public String batchChat(final List messages) {
@@ -148,14 +153,6 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return response.body();
}
- @Override
- public String chatContext(String prompt, String contextId) {
- // 定义消息结构
- final List messages = new ArrayList<>();
- messages.add(new Message("user", prompt));
- return chatContext(messages, contextId);
- }
-
@Override
public String chatContext(final List messages, String contextId) {
String paramJson = buildChatContentRequestBody(messages, contextId);
@@ -163,6 +160,19 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return response.body();
}
+ @Override
+ public void chatContext(final List messages, String contextId, final Consumer callback) {
+ Map paramMap = buildChatContentStreamRequestBody(messages, contextId);
+ ThreadUtil.newThread(() -> sendPostStream(CHAT_CONTEXT, paramMap, callback::accept), "doubao-chatContext-sse").start();
+ }
+
+ @Override
+ public String imagesGenerations(String prompt) {
+ String paramJson = buildImagesGenerationsRequestBody(prompt);
+ final HttpResponse response = sendPost(IMAGES_GENERATIONS, paramJson);
+ return response.body();
+ }
+
// 构建chat请求体
private String buildChatRequestBody(final List messages) {
//使用JSON工具
@@ -175,6 +185,19 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return JSONUtil.toJsonStr(paramMap);
}
+ // 构建chatStream请求体
+ private Map buildChatStreamRequestBody(final List messages) {
+ //使用JSON工具
+ final Map paramMap = new HashMap<>();
+ paramMap.put("stream", true);
+ paramMap.put("model", config.getModel());
+ paramMap.put("messages", messages);
+ //合并其他参数
+ paramMap.putAll(config.getAdditionalConfigMap());
+
+ return paramMap;
+ }
+
//构建chatVision请求体
private String buildChatVisionRequestBody(String prompt, final List images, String detail) {
// 定义消息结构
@@ -206,6 +229,37 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return JSONUtil.toJsonStr(paramMap);
}
+ private Map buildChatVisionStreamRequestBody(String prompt, final List images, String detail) {
+ // 定义消息结构
+ final List messages = new ArrayList<>();
+ final List