fix comment

This commit is contained in:
Looly
2025-06-25 17:03:22 +08:00
parent 9d83869d85
commit bb607e30ae
21 changed files with 484 additions and 142 deletions

View File

@@ -40,6 +40,9 @@ import java.util.function.Consumer;
*/ */
public class BaseAIService { public class BaseAIService {
/**
* AI配置
*/
protected final AIConfig config; protected final AIConfig config;
/** /**
@@ -122,11 +125,11 @@ public class BaseAIService {
* @param paramMap 请求参数 * @param paramMap 请求参数
* @param callback 流式数据回调函数 * @param callback 流式数据回调函数
*/ */
protected void sendPostStream(final String endpoint, final Map<String, Object> paramMap, Consumer<String> callback) { protected void sendPostStream(final String endpoint, final Map<String, Object> paramMap, final Consumer<String> callback) {
HttpURLConnection connection = null; HttpURLConnection connection = null;
try { try {
// 创建连接 // 创建连接
URL apiUrl = new URL(config.getApiUrl() + endpoint); final URL apiUrl = new URL(config.getApiUrl() + endpoint);
connection = (HttpURLConnection) apiUrl.openConnection(); connection = (HttpURLConnection) apiUrl.openConnection();
connection.setRequestMethod(Method.POST.name()); connection.setRequestMethod(Method.POST.name());
connection.setRequestProperty(HeaderName.CONTENT_TYPE.getValue(), "application/json"); connection.setRequestProperty(HeaderName.CONTENT_TYPE.getValue(), "application/json");
@@ -137,21 +140,21 @@ public class BaseAIService {
//设置连接超时 //设置连接超时
connection.setConnectTimeout(config.getTimeout()); connection.setConnectTimeout(config.getTimeout());
// 发送请求体 // 发送请求体
try (OutputStream os = connection.getOutputStream()) { try (final OutputStream os = connection.getOutputStream()) {
String jsonInputString = JSONUtil.toJsonStr(paramMap); final String jsonInputString = JSONUtil.toJsonStr(paramMap);
os.write(jsonInputString.getBytes()); os.write(jsonInputString.getBytes());
os.flush(); os.flush();
} }
// 读取流式响应 // 读取流式响应
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { try (final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
// 调用回调函数处理每一行数据 // 调用回调函数处理每一行数据
callback.accept(line); callback.accept(line);
} }
} }
} catch (Exception e) { } catch (final Exception e) {
callback.accept("{\"error\": \"" + e.getMessage() + "\"}"); callback.accept("{\"error\": \"" + e.getMessage() + "\"}");
} finally { } finally {
// 关闭连接 // 关闭连接

View File

@@ -27,17 +27,29 @@ import java.util.concurrent.ConcurrentHashMap;
*/ */
public class BaseConfig implements AIConfig { public class BaseConfig implements AIConfig {
//apiKey /**
* API Key
*/
protected volatile String apiKey; protected volatile String apiKey;
//API请求地址 /**
* API请求地址
*/
protected volatile String apiUrl; protected volatile String apiUrl;
//具体模型 /**
* 模型名称
*/
protected volatile String model; protected volatile String model;
//动态扩展字段 /**
* 额外的配置
*/
protected final Map<String, Object> additionalConfig = new ConcurrentHashMap<>(); protected final Map<String, Object> additionalConfig = new ConcurrentHashMap<>();
//连接超时时间 /**
* 请求超时
*/
protected volatile int timeout = 180000; protected volatile int timeout = 180000;
//读取超时时间 /**
* 读取超时
*/
protected volatile int readTimeout = 300000; protected volatile int readTimeout = 300000;
@Override @Override

View File

@@ -27,20 +27,37 @@ import cn.hutool.v7.ai.core.BaseConfig;
*/ */
public class DeepSeekConfig extends BaseConfig { public class DeepSeekConfig extends BaseConfig {
private final String API_URL = "https://api.deepseek.com"; /**
* 定义API的基础URL用于后续的所有API请求
*/
public final String API_URL = "https://api.deepseek.com";
private final String DEFAULT_MODEL = Models.DeepSeek.DEEPSEEK_CHAT.getModel(); /**
* 定义默认的模型名称,用于在没有指定模型时使用
*/
public final String DEFAULT_MODEL = Models.DeepSeek.DEEPSEEK_CHAT.getModel();
/**
* 默认构造函数用于初始化DeepSeek配置对象
* 设置API的基础URL和默认的模型名称
*/
public DeepSeekConfig() { public DeepSeekConfig() {
setApiUrl(API_URL); setApiUrl(API_URL);
setModel(DEFAULT_MODEL); setModel(DEFAULT_MODEL);
} }
public DeepSeekConfig(String apiKey) { /**
this(); * 带API密钥参数的构造函数
* 用于初始化DeepSeek配置对象并设置API密钥
*
* @param apiKey 用户的API密钥用于认证和授权
*/
public DeepSeekConfig(final String apiKey) {
this(); // 调用默认构造函数初始化API_URL和DEFAULT_MODEL
setApiKey(apiKey); setApiKey(apiKey);
} }
@Override @Override
public String getModelName() { public String getModelName() {
return "deepSeek"; return "deepSeek";

View File

@@ -24,70 +24,139 @@ package cn.hutool.v7.ai.model.doubao;
*/ */
public class DoubaoCommon { public class DoubaoCommon {
//doubao上下文缓存参数 /**
* doubao上下文缓存参数
*/
public enum DoubaoContext { public enum DoubaoContext {
/**
* session
*/
SESSION("session"), SESSION("session"),
/**
* common_prefix
*/
COMMON_PREFIX("common_prefix"); COMMON_PREFIX("common_prefix");
private final String mode; private final String mode;
DoubaoContext(String mode) { DoubaoContext(final String mode) {
this.mode = mode; this.mode = mode;
} }
/**
* 获取参数
*
* @return 参数
*/
public String getMode() { public String getMode() {
return mode; return mode;
} }
} }
//doubao视觉参数 /**
* doubao视觉参数
*/
public enum DoubaoVision { public enum DoubaoVision {
/**
* 自动
*/
AUTO("auto"), AUTO("auto"),
/**
* 低
*/
LOW("low"), LOW("low"),
/**
* 高
*/
HIGH("high"); HIGH("high");
private final String detail; private final String detail;
DoubaoVision(String detail) { DoubaoVision(final String detail) {
this.detail = detail; this.detail = detail;
} }
/**
* 获取参数
*
* @return 参数
*/
public String getDetail() { public String getDetail() {
return detail; return detail;
} }
} }
//doubao视频生成参数 /**
* doubao视频生成参数
*/
public enum DoubaoVideo { public enum DoubaoVideo {
//宽高比例 //宽高比例
/**
* 视频比例16:9适用于横向宽屏显示常用作标准视频比例
*/
RATIO_16_9("--rt", "16:9"),//[1280, 720] RATIO_16_9("--rt", "16:9"),//[1280, 720]
/**
* 视频比例4:3传统电视屏幕比例适用于标准清晰度的视频内容
*/
RATIO_4_3("--rt", "4:3"),//[960, 720] RATIO_4_3("--rt", "4:3"),//[960, 720]
/**
* 视频比例1:1正方形画面适用于社交媒体平台上的短视频内容
*/
RATIO_1_1("--rt", "1:1"),//[720, 720] RATIO_1_1("--rt", "1:1"),//[720, 720]
/**
* 视频比例3:4竖向视频比例适用于手机端的视频播放场景
*/
RATIO_3_4("--rt", "3:4"),//[720, 960] RATIO_3_4("--rt", "3:4"),//[720, 960]
/**
* 视频比例9:16常见的竖屏视频比例广泛用于短视频应用
*/
RATIO_9_16("--rt", "9:16"),//[720, 1280] RATIO_9_16("--rt", "9:16"),//[720, 1280]
/**
* 视频比例21:9超宽屏幕比例提供更广阔的视野适合电影和游戏体验
*/
RATIO_21_9("--rt", "21:9"),//[1280, 544] RATIO_21_9("--rt", "21:9"),//[1280, 544]
//生成视频时长 //生成视频时长
DURATION_5("--dur", 5),//文生视频,图生视频 /**
DURATION_10("--dur", 10),//文生视频 * 文生视频,图生视频
*/
DURATION_5("--dur", 5),
/**
* 文生视频
*/
DURATION_10("--dur", 10),
//帧率,即一秒时间内视频画面数量 /**
* 帧率,即一秒时间内视频画面数量
*/
FPS_5("--fps", 24), FPS_5("--fps", 24),
//视频分辨率 /**
* 视频分辨率
*/
RESOLUTION_5("--rs", "720p"), RESOLUTION_5("--rs", "720p"),
//生成视频是否包含水印 /**
* 生成视频包含水印
*/
WATERMARK_TRUE("--wm", true), WATERMARK_TRUE("--wm", true),
/**
* 生成视频不包含水印
*/
WATERMARK_FALSE("--wm", false); WATERMARK_FALSE("--wm", false);
private final String type; private final String type;
private final Object value; private final Object value;
DoubaoVideo(String type, Object value) { DoubaoVideo(final String type, final Object value) {
this.type = type; this.type = type;
this.value = value; this.value = value;
} }

View File

@@ -27,20 +27,33 @@ import cn.hutool.v7.ai.core.BaseConfig;
*/ */
public class DoubaoConfig extends BaseConfig { public class DoubaoConfig extends BaseConfig {
private final String API_URL = "https://ark.cn-beijing.volces.com/api/v3"; // 定义API的基础URL用于和服务器通信
private static final String API_URL = "https://ark.cn-beijing.volces.com/api/v3";
private final String DEFAULT_MODEL = Models.Doubao.DOUBAO_1_5_LITE_32K.getModel(); // 定义默认的模型配置,用于初始化配置对象时设定
private static final String DEFAULT_MODEL = Models.Doubao.DOUBAO_1_5_LITE_32K.getModel();
/**
* 无参构造函数用于创建DoubaoConfig对象
* 初始化时会设置API_URL和DEFAULT_MODEL
*/
public DoubaoConfig() { public DoubaoConfig() {
setApiUrl(API_URL); setApiUrl(API_URL);
setModel(DEFAULT_MODEL); setModel(DEFAULT_MODEL);
} }
public DoubaoConfig(String apiKey) { /**
this(); * 带有apiKey参数的构造函数用于创建DoubaoConfig对象并设置API密钥
setApiKey(apiKey); * 初始化时会设置API_URL、DEFAULT_MODEL以及传入的apiKey
*
* @param apiKey 用户的API密钥用于验证用户身份
*/
public DoubaoConfig(final String apiKey) {
this(); // 先调用无参构造函数初始化API_URL和DEFAULT_MODEL
setApiKey(apiKey); // 设置用户的API密钥
} }
@Override @Override
public String getModelName() { public String getModelName() {
return "doubao"; return "doubao";

View File

@@ -39,25 +39,25 @@ import java.util.function.Consumer;
public class DoubaoServiceImpl extends BaseAIService implements DoubaoService { public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
//对话 //对话
private final String CHAT_ENDPOINT = "/chat/completions"; private static final String CHAT_ENDPOINT = "/chat/completions";
//文本向量化 //文本向量化
private final String EMBEDDING_TEXT = "/embeddings"; private static final String EMBEDDING_TEXT = "/embeddings";
//图文向量化 //图文向量化
private final String EMBEDDING_VISION = "/embeddings/multimodal"; private static final String EMBEDDING_VISION = "/embeddings/multimodal";
//应用bots //应用bots
private final String BOTS_CHAT = "/bots/chat/completions"; private static final String BOTS_CHAT = "/bots/chat/completions";
//分词 //分词
private final String TOKENIZATION = "/tokenization"; private static final String TOKENIZATION = "/tokenization";
//批量推理chat //批量推理chat
private final String BATCH_CHAT = "/batch/chat/completions"; private static final String BATCH_CHAT = "/batch/chat/completions";
//创建上下文缓存 //创建上下文缓存
private final String CREATE_CONTEXT = "/context/create"; private static final String CREATE_CONTEXT = "/context/create";
//上下文缓存对话 //上下文缓存对话
private final String CHAT_CONTEXT = "/context/chat/completions"; private static final String CHAT_CONTEXT = "/context/chat/completions";
//创建视频生成任务 //创建视频生成任务
private final String CREATE_VIDEO = "/contents/generations/tasks"; private static final String CREATE_VIDEO = "/contents/generations/tasks";
//文生图 //文生图
private final String IMAGES_GENERATIONS = "/images/generations"; private static final String IMAGES_GENERATIONS = "/images/generations";
public DoubaoServiceImpl(final AIConfig config) { public DoubaoServiceImpl(final AIConfig config) {
//初始化doubao客户端 //初始化doubao客户端
@@ -66,109 +66,109 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
@Override @Override
public String chat(final List<Message> messages) { public String chat(final List<Message> messages) {
String paramJson = buildChatRequestBody(messages); final String paramJson = buildChatRequestBody(messages);
Response response = sendPost(CHAT_ENDPOINT, paramJson); final Response response = sendPost(CHAT_ENDPOINT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public void chat(List<Message> messages, Consumer<String> callback) { public void chat(final List<Message> messages, final Consumer<String> callback) {
Map<String, Object> paramMap = buildChatStreamRequestBody(messages); final Map<String, Object> paramMap = buildChatStreamRequestBody(messages);
ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "doubao-chat-sse").start(); ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "doubao-chat-sse").start();
} }
@Override @Override
public String chatVision(String prompt, final List<String> images, String detail) { public String chatVision(final String prompt, final List<String> images, final String detail) {
String paramJson = buildChatVisionRequestBody(prompt, images, detail); final String paramJson = buildChatVisionRequestBody(prompt, images, detail);
Response response = sendPost(CHAT_ENDPOINT, paramJson); final Response response = sendPost(CHAT_ENDPOINT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public void chatVision(String prompt, List<String> images, String detail, Consumer<String> callback) { public void chatVision(final String prompt, final List<String> images, final String detail, final Consumer<String> callback) {
Map<String, Object> paramMap = buildChatVisionStreamRequestBody(prompt, images, detail); final Map<String, Object> paramMap = buildChatVisionStreamRequestBody(prompt, images, detail);
ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "doubao-chatVision-sse").start(); ThreadUtil.newThread(() -> sendPostStream(CHAT_ENDPOINT, paramMap, callback::accept), "doubao-chatVision-sse").start();
} }
@Override @Override
public String videoTasks(String text, String image, final List<DoubaoCommon.DoubaoVideo> videoParams) { public String videoTasks(final String text, final String image, final List<DoubaoCommon.DoubaoVideo> videoParams) {
String paramJson = buildGenerationsTasksRequestBody(text, image, videoParams); final String paramJson = buildGenerationsTasksRequestBody(text, image, videoParams);
Response response = sendPost(CREATE_VIDEO, paramJson); final Response response = sendPost(CREATE_VIDEO, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String getVideoTasksInfo(String taskId) { public String getVideoTasksInfo(final String taskId) {
Response response = sendGet(CREATE_VIDEO + "/" + taskId); final Response response = sendGet(CREATE_VIDEO + "/" + taskId);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String embeddingText(String[] input) { public String embeddingText(final String[] input) {
String paramJson = buildEmbeddingTextRequestBody(input); final String paramJson = buildEmbeddingTextRequestBody(input);
Response response = sendPost(EMBEDDING_TEXT, paramJson); final Response response = sendPost(EMBEDDING_TEXT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String embeddingVision(String text, String image) { public String embeddingVision(final String text, final String image) {
String paramJson = buildEmbeddingVisionRequestBody(text, image); final String paramJson = buildEmbeddingVisionRequestBody(text, image);
Response response = sendPost(EMBEDDING_VISION, paramJson); final Response response = sendPost(EMBEDDING_VISION, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String botsChat(final List<Message> messages) { public String botsChat(final List<Message> messages) {
String paramJson = buildBotsChatRequestBody(messages); final String paramJson = buildBotsChatRequestBody(messages);
Response response = sendPost(BOTS_CHAT, paramJson); final Response response = sendPost(BOTS_CHAT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public void botsChat(List<Message> messages, Consumer<String> callback) { public void botsChat(final List<Message> messages, final Consumer<String> callback) {
Map<String, Object> paramMap = buildBotsChatStreamRequestBody(messages); final Map<String, Object> paramMap = buildBotsChatStreamRequestBody(messages);
ThreadUtil.newThread(() -> sendPostStream(BOTS_CHAT, paramMap, callback::accept), "doubao-botsChat-sse").start(); ThreadUtil.newThread(() -> sendPostStream(BOTS_CHAT, paramMap, callback::accept), "doubao-botsChat-sse").start();
} }
@Override @Override
public String tokenization(String[] text) { public String tokenization(final String[] text) {
String paramJson = buildTokenizationRequestBody(text); final String paramJson = buildTokenizationRequestBody(text);
Response response = sendPost(TOKENIZATION, paramJson); final Response response = sendPost(TOKENIZATION, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String batchChat(final List<Message> messages) { public String batchChat(final List<Message> messages) {
String paramJson = buildBatchChatRequestBody(messages); final String paramJson = buildBatchChatRequestBody(messages);
Response response = sendPost(BATCH_CHAT, paramJson); final Response response = sendPost(BATCH_CHAT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String createContext(final List<Message> messages, String mode) { public String createContext(final List<Message> messages, final String mode) {
String paramJson = buildCreateContextRequest(messages, mode); final String paramJson = buildCreateContextRequest(messages, mode);
Response response = sendPost(CREATE_CONTEXT, paramJson); final Response response = sendPost(CREATE_CONTEXT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public String chatContext(final List<Message> messages, String contextId) { public String chatContext(final List<Message> messages, final String contextId) {
String paramJson = buildChatContentRequestBody(messages, contextId); final String paramJson = buildChatContentRequestBody(messages, contextId);
Response response = sendPost(CHAT_CONTEXT, paramJson); final Response response = sendPost(CHAT_CONTEXT, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@Override @Override
public void chatContext(List<Message> messages, String contextId, Consumer<String> callback) { public void chatContext(final List<Message> messages, final String contextId, final Consumer<String> callback) {
Map<String, Object> paramMap = buildChatContentStreamRequestBody(messages, contextId); final Map<String, Object> paramMap = buildChatContentStreamRequestBody(messages, contextId);
ThreadUtil.newThread(() -> sendPostStream(CHAT_CONTEXT, paramMap, callback::accept), "doubao-chatContext-sse").start(); ThreadUtil.newThread(() -> sendPostStream(CHAT_CONTEXT, paramMap, callback::accept), "doubao-chatContext-sse").start();
} }
@Override @Override
public String imagesGenerations(String prompt) { public String imagesGenerations(final String prompt) {
String paramJson = buildImagesGenerationsRequestBody(prompt); final String paramJson = buildImagesGenerationsRequestBody(prompt);
Response response = sendPost(IMAGES_GENERATIONS, paramJson); final Response response = sendPost(IMAGES_GENERATIONS, paramJson);
return response.bodyStr(); return response.bodyStr();
} }
@@ -198,7 +198,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建chatVision请求体 //构建chatVision请求体
private String buildChatVisionRequestBody(String prompt, final List<String> images, String detail) { private String buildChatVisionRequestBody(final String prompt, final List<String> images, final String detail) {
// 定义消息结构 // 定义消息结构
final List<Message> messages = new ArrayList<>(); final List<Message> messages = new ArrayList<>();
final List<Object> content = new ArrayList<>(); final List<Object> content = new ArrayList<>();
@@ -207,10 +207,10 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
contentMap.put("type", "text"); contentMap.put("type", "text");
contentMap.put("text", prompt); contentMap.put("text", prompt);
content.add(contentMap); content.add(contentMap);
for (String img : images) { for (final String img : images) {
HashMap<String, Object> imgUrlMap = new HashMap<>(); final HashMap<String, Object> imgUrlMap = new HashMap<>();
imgUrlMap.put("type", "image_url"); imgUrlMap.put("type", "image_url");
HashMap<String, String> urlMap = new HashMap<>(); final HashMap<String, String> urlMap = new HashMap<>();
urlMap.put("url", img); urlMap.put("url", img);
urlMap.put("detail", detail); urlMap.put("detail", detail);
imgUrlMap.put("image_url", urlMap); imgUrlMap.put("image_url", urlMap);
@@ -228,7 +228,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return JSONUtil.toJsonStr(paramMap); return JSONUtil.toJsonStr(paramMap);
} }
private Map<String, Object> buildChatVisionStreamRequestBody(String prompt, final List<String> images, String detail) { private Map<String, Object> buildChatVisionStreamRequestBody(final String prompt, final List<String> images, final String detail) {
// 定义消息结构 // 定义消息结构
final List<Message> messages = new ArrayList<>(); final List<Message> messages = new ArrayList<>();
final List<Object> content = new ArrayList<>(); final List<Object> content = new ArrayList<>();
@@ -237,10 +237,10 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
contentMap.put("type", "text"); contentMap.put("type", "text");
contentMap.put("text", prompt); contentMap.put("text", prompt);
content.add(contentMap); content.add(contentMap);
for (String img : images) { for (final String img : images) {
HashMap<String, Object> imgUrlMap = new HashMap<>(); final HashMap<String, Object> imgUrlMap = new HashMap<>();
imgUrlMap.put("type", "image_url"); imgUrlMap.put("type", "image_url");
HashMap<String, String> urlMap = new HashMap<>(); final HashMap<String, String> urlMap = new HashMap<>();
urlMap.put("url", img); urlMap.put("url", img);
urlMap.put("detail", detail); urlMap.put("detail", detail);
imgUrlMap.put("image_url", urlMap); imgUrlMap.put("image_url", urlMap);
@@ -260,7 +260,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建文本向量化请求体 //构建文本向量化请求体
private String buildEmbeddingTextRequestBody(String[] input) { private String buildEmbeddingTextRequestBody(final String[] input) {
//使用JSON工具 //使用JSON工具
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
@@ -271,7 +271,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建图文向量化请求体 //构建图文向量化请求体
private String buildEmbeddingVisionRequestBody(String text, String image) { private String buildEmbeddingVisionRequestBody(final String text, final String image) {
//使用JSON工具 //使用JSON工具
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
@@ -311,7 +311,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建分词请求体 //构建分词请求体
private String buildTokenizationRequestBody(String[] text) { private String buildTokenizationRequestBody(final String[] text) {
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
paramMap.put("text", text); paramMap.put("text", text);
@@ -328,7 +328,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建创建上下文缓存请求体 //构建创建上下文缓存请求体
private String buildCreateContextRequest(final List<Message> messages, String mode) { private String buildCreateContextRequest(final List<Message> messages, final String mode) {
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("messages", messages); paramMap.put("messages", messages);
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
@@ -340,7 +340,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建上下文缓存对话请求体 //构建上下文缓存对话请求体
private String buildChatContentRequestBody(final List<Message> messages, String contextId) { private String buildChatContentRequestBody(final List<Message> messages, final String contextId) {
//使用JSON工具 //使用JSON工具
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
@@ -352,7 +352,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
return JSONUtil.toJsonStr(paramMap); return JSONUtil.toJsonStr(paramMap);
} }
private Map<String, Object> buildChatContentStreamRequestBody(final List<Message> messages, String contextId) { private Map<String, Object> buildChatContentStreamRequestBody(final List<Message> messages, final String contextId) {
//使用JSON工具 //使用JSON工具
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("stream", true); paramMap.put("stream", true);
@@ -366,7 +366,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建创建视频任务请求体 //构建创建视频任务请求体
private String buildGenerationsTasksRequestBody(String text, String image, final List<DoubaoCommon.DoubaoVideo> videoParams) { private String buildGenerationsTasksRequestBody(final String text, final String image, final List<DoubaoCommon.DoubaoVideo> videoParams) {
//使用JSON工具 //使用JSON工具
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
@@ -392,10 +392,10 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
//添加视频参数 //添加视频参数
if (videoParams != null && !videoParams.isEmpty()) { if (videoParams != null && !videoParams.isEmpty()) {
//如果有文本参数就加在后面 //如果有文本参数就加在后面
if (textMap != null && !textMap.isEmpty()) { if (!textMap.isEmpty()) {
int textIndex = content.indexOf(textMap); final int textIndex = content.indexOf(textMap);
StringBuilder textBuilder = new StringBuilder(text); final StringBuilder textBuilder = new StringBuilder(text);
for (DoubaoCommon.DoubaoVideo videoParam : videoParams) { for (final DoubaoCommon.DoubaoVideo videoParam : videoParams) {
textBuilder.append(" ").append(videoParam.getType()).append(" ").append(videoParam.getValue()); textBuilder.append(" ").append(videoParam.getType()).append(" ").append(videoParam.getValue());
} }
textMap.put("type", "text"); textMap.put("type", "text");
@@ -408,8 +408,8 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
} else { } else {
//如果没有文本参数就重新增加 //如果没有文本参数就重新增加
StringBuilder textBuilder = new StringBuilder(); final StringBuilder textBuilder = new StringBuilder();
for (DoubaoCommon.DoubaoVideo videoParam : videoParams) { for (final DoubaoCommon.DoubaoVideo videoParam : videoParams) {
textBuilder.append(videoParam.getType()).append(videoParam.getValue()).append(" "); textBuilder.append(videoParam.getType()).append(videoParam.getValue()).append(" ");
} }
textMap.put("type", "text"); textMap.put("type", "text");
@@ -426,7 +426,7 @@ public class DoubaoServiceImpl extends BaseAIService implements DoubaoService {
} }
//构建文生图请求体 //构建文生图请求体
private String buildImagesGenerationsRequestBody(String prompt) { private String buildImagesGenerationsRequestBody(final String prompt) {
final Map<String, Object> paramMap = new HashMap<>(); final Map<String, Object> paramMap = new HashMap<>();
paramMap.put("model", config.getModel()); paramMap.put("model", config.getModel());
paramMap.put("prompt", prompt); paramMap.put("prompt", prompt);

View File

@@ -34,6 +34,9 @@ public class BoolArrayMatcher implements PartMatcher {
* 用户定义此字段的最小值 * 用户定义此字段的最小值
*/ */
protected final int minValue; protected final int minValue;
/**
* 匹配值列表
*/
protected final boolean[] bValues; protected final boolean[] bValues;
/** /**

View File

@@ -25,6 +25,7 @@ import cn.hutool.v7.db.sql.*;
import cn.hutool.v7.db.sql.Condition.LikeType; import cn.hutool.v7.db.sql.Condition.LikeType;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -43,13 +44,20 @@ import java.util.Map;
* @author Looly * @author Looly
*/ */
public abstract class AbstractDb<R extends AbstractDb<R>> extends DefaultConnectionHolder implements Serializable { public abstract class AbstractDb<R extends AbstractDb<R>> extends DefaultConnectionHolder implements Serializable {
@Serial
private static final long serialVersionUID = 3858951941916349062L; private static final long serialVersionUID = 3858951941916349062L;
/** /**
* 是否支持事务 * 是否支持事务
*/ */
protected Boolean isSupportTransaction = null; protected Boolean isSupportTransaction = null;
/**
* 数据库执行器
*/
protected DialectRunner runner; protected DialectRunner runner;
/**
* 数据库配置
*/
protected DbConfig dbConfig; protected DbConfig dbConfig;
/** /**
* 是否大小写不敏感(默认大小写不敏感) * 是否大小写不敏感(默认大小写不敏感)

View File

@@ -27,6 +27,9 @@ import java.sql.SQLException;
*/ */
public class DefaultConnectionHolder implements ConnectionHolder { public class DefaultConnectionHolder implements ConnectionHolder {
/**
* 数据源
*/
protected final DataSource ds; protected final DataSource ds;
/** /**

View File

@@ -25,12 +25,66 @@ import cn.hutool.v7.core.text.StrUtil;
* @author Looly * @author Looly
*/ */
public enum DialectName { public enum DialectName {
ANSI, MYSQL, ORACLE, POSTGRESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX, DM, HANA; /**
* ANSI标准SQL数据库类型代表使用ANSI SQL标准的数据库系统
*/
ANSI,
/**
* MySQL数据库类型代表MySQL数据库系统
*/
MYSQL,
/**
* Oracle数据库类型代表Oracle数据库系统
*/
ORACLE,
/**
* PostgreSQL数据库类型代表PostgreSQL数据库系统
*/
POSTGRESQL,
/**
* SQLite3数据库类型代表SQLite 3.x版本的轻量级嵌入式数据库
*/
SQLITE3,
/**
* H2数据库类型代表H2内存或磁盘数据库系统
*/
H2,
/**
* SQL Server数据库类型代表Microsoft SQL Server数据库系统
*/
SQLSERVER,
/**
* SQL Server 2012数据库类型代表Microsoft SQL Server 2012版本的数据库系统
*/
SQLSERVER2012,
/**
* Phoenix数据库类型代表Apache Phoenix数据库系统基于HBase
*/
PHOENIX,
/**
* 达梦数据库类型代表国产达梦DM数据库系统
*/
DM,
/**
* SAP HANA数据库类型代表SAP HANA实时内存数据库系统
*/
HANA;
/** /**
* 是否为指定数据库方言,检查时不分区大小写 * 是否为指定数据库方言,检查时不分区大小写
* *
* @param dialectName 方言名 * @param dialectName 方言名
* @return 是否时Oracle数据库 * @return 是否时Oracle数据库
* @since 5.7.2 * @since 5.7.2
*/ */

View File

@@ -30,6 +30,7 @@ import cn.hutool.v7.db.sql.Query;
import cn.hutool.v7.db.sql.QuoteWrapper; import cn.hutool.v7.db.sql.QuoteWrapper;
import cn.hutool.v7.db.sql.SqlBuilder; import cn.hutool.v7.db.sql.SqlBuilder;
import java.io.Serial;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -39,9 +40,16 @@ import java.sql.PreparedStatement;
* @author loolly * @author loolly
*/ */
public class AnsiSqlDialect implements Dialect { public class AnsiSqlDialect implements Dialect {
@Serial
private static final long serialVersionUID = 2088101129774974580L; private static final long serialVersionUID = 2088101129774974580L;
/**
* ANSI SQL 方言
*/
protected DbConfig dbConfig; protected DbConfig dbConfig;
/**
* 默认的QuoteWrapper
*/
protected QuoteWrapper quoteWrapper = new QuoteWrapper(); protected QuoteWrapper quoteWrapper = new QuoteWrapper();
/** /**

View File

@@ -18,32 +18,21 @@ package cn.hutool.v7.db.ds.pooled;
import cn.hutool.v7.core.lang.wrapper.Wrapper; import cn.hutool.v7.core.lang.wrapper.Wrapper;
import java.sql.Array; import java.sql.*;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
/** /**
* 连接包装,用于丰富功能 * 连接包装,用于丰富功能
* @author Looly
* *
* @author Looly
*/ */
public abstract class ConnectionWrapper implements Connection, Wrapper<Connection> { public abstract class ConnectionWrapper implements Connection, Wrapper<Connection> {
/**
* 原始的连接
*/
protected Connection raw;//真正的连接 protected Connection raw;//真正的连接
@Override @Override
@@ -307,7 +296,7 @@ public abstract class ConnectionWrapper implements Connection, Wrapper<Connectio
} }
@Override @Override
public Connection getRaw(){ public Connection getRaw() {
return this.raw; return this.raw;
} }
} }

View File

@@ -28,7 +28,13 @@ import java.sql.SQLException;
*/ */
public abstract class AbsRowHandler<R> implements RowHandler<R> { public abstract class AbsRowHandler<R> implements RowHandler<R> {
/**
* {@link ResultSetMetaData}
*/
protected final ResultSetMetaData meta; protected final ResultSetMetaData meta;
/**
* 列数
*/
protected final int columnCount; protected final int columnCount;
/** /**

View File

@@ -33,6 +33,9 @@ import java.util.List;
*/ */
public abstract class AbstractFtp implements Ftp { public abstract class AbstractFtp implements Ftp {
/**
* FTP配置
*/
protected FtpConfig ftpConfig; protected FtpConfig ftpConfig;
@Override @Override

View File

@@ -27,15 +27,47 @@ import oshi.util.Util;
*/ */
public class CpuTicks { public class CpuTicks {
/**
* 空闲时间表示CPU没有执行任何任务的时间
*/
long idle; long idle;
/**
* 优先级较低的进程时间表示CPU在执行优先级较低的进程时所花费的时间
*/
long nice; long nice;
/**
* 中断请求时间表示CPU处理中断请求所花费的时间
*/
long irq; long irq;
/**
* 软中断请求时间表示CPU处理软中断请求所花费的时间
*/
long softIrq; long softIrq;
/**
* 被虚拟机偷走的时间表示在虚拟化环境中CPU被其他虚拟机使用的时间
*/
long steal; long steal;
/**
* 系统时间表示CPU在执行操作系统内核指令时所花费的时间
*/
long cSys; long cSys;
/**
* 用户时间表示CPU在执行用户进程时所花费的时间
*/
long user; long user;
/**
* I/O等待时间表示CPU等待I/O操作完成所花费的时间
*/
long ioWait; long ioWait;
/** /**
* 构造等待时间为用于计算在一定时长内的CPU负载情况如传入1000表示最近1秒的负载情况 * 构造等待时间为用于计算在一定时长内的CPU负载情况如传入1000表示最近1秒的负载情况
* *
@@ -59,70 +91,167 @@ public class CpuTicks {
this.ioWait = tick(prevTicks, ticks, CentralProcessor.TickType.IOWAIT); this.ioWait = tick(prevTicks, ticks, CentralProcessor.TickType.IOWAIT);
} }
/**
* 获取CPU空闲时间
*
* @return CPU空闲时间
*/
public long getIdle() { public long getIdle() {
return idle; return idle;
} }
public void setIdle(final long idle) { /**
* 设置CPU空闲时间
*
* @param idle CPU空闲时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setIdle(final long idle) {
this.idle = idle; this.idle = idle;
return this;
} }
/**
* 获取CPU在nice模式下花费的时间
*
* @return CPU在nice模式下花费的时间
*/
public long getNice() { public long getNice() {
return nice; return nice;
} }
public void setNice(final long nice) { /**
* 设置CPU在nice模式下花费的时间
*
* @param nice CPU在nice模式下花费的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setNice(final long nice) {
this.nice = nice; this.nice = nice;
return this;
} }
/**
* 获取CPU在处理中断请求上花费的时间
*
* @return CPU在处理中断请求上花费的时间
*/
public long getIrq() { public long getIrq() {
return irq; return irq;
} }
public void setIrq(final long irq) { /**
* 设置CPU在处理中断请求上花费的时间
*
* @param irq CPU在处理中断请求上花费的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setIrq(final long irq) {
this.irq = irq; this.irq = irq;
return this;
} }
/**
* 获取CPU在处理软中断上花费的时间
*
* @return CPU在处理软中断上花费的时间
*/
public long getSoftIrq() { public long getSoftIrq() {
return softIrq; return softIrq;
} }
public void setSoftIrq(final long softIrq) { /**
* 设置CPU在处理软中断上花费的时间
*
* @param softIrq CPU在处理软中断上花费的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setSoftIrq(final long softIrq) {
this.softIrq = softIrq; this.softIrq = softIrq;
return this;
} }
/**
* 获取CPU被其他虚拟处理器占用的时间
*
* @return CPU被其他虚拟处理器占用的时间
*/
public long getSteal() { public long getSteal() {
return steal; return steal;
} }
public void setSteal(final long steal) { /**
* 设置CPU被其他虚拟处理器占用的时间
*
* @param steal CPU被其他虚拟处理器占用的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setSteal(final long steal) {
this.steal = steal; this.steal = steal;
return this;
} }
/**
* 获取CPU在系统模式下花费的时间
*
* @return CPU在系统模式下花费的时间
*/
public long getcSys() { public long getcSys() {
return cSys; return cSys;
} }
public void setcSys(final long cSys) { /**
* 设置CPU在系统模式下花费的时间
*
* @param cSys CPU在系统模式下花费的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setcSys(final long cSys) {
this.cSys = cSys; this.cSys = cSys;
return this;
} }
/**
* 获取CPU在用户模式下花费的时间
*
* @return CPU在用户模式下花费的时间
*/
public long getUser() { public long getUser() {
return user; return user;
} }
public void setUser(final long user) { /**
* 设置CPU在用户模式下花费的时间
*
* @param user CPU在用户模式下花费的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setUser(final long user) {
this.user = user; this.user = user;
return this;
} }
/**
* 获取CPU在等待I/O完成上花费的时间
*
* @return CPU在等待I/O完成上花费的时间
*/
public long getIoWait() { public long getIoWait() {
return ioWait; return ioWait;
} }
public void setIoWait(final long ioWait) { /**
* 设置CPU在等待I/O完成上花费的时间
*
* @param ioWait CPU在等待I/O完成上花费的时间
* @return 当前对象实例,用于链式调用
*/
public CpuTicks setIoWait(final long ioWait) {
this.ioWait = ioWait; this.ioWait = ioWait;
return this;
} }
/** /**
* 获取CPU总的使用率 * 获取CPU总的使用率
* *
@@ -135,15 +264,15 @@ public class CpuTicks {
@Override @Override
public String toString() { public String toString() {
return "CpuTicks{" + return "CpuTicks{" +
"idle=" + idle + "idle=" + idle +
", nice=" + nice + ", nice=" + nice +
", irq=" + irq + ", irq=" + irq +
", softIrq=" + softIrq + ", softIrq=" + softIrq +
", steal=" + steal + ", steal=" + steal +
", cSys=" + cSys + ", cSys=" + cSys +
", user=" + user + ", user=" + user +
", ioWait=" + ioWait + ", ioWait=" + ioWait +
'}'; '}';
} }
/** /**

View File

@@ -29,9 +29,15 @@ import cn.hutool.v7.http.client.cookie.CookieStoreSpi;
* @author Looly * @author Looly
* @since 6.0.0 * @since 6.0.0
*/ */
public abstract class AbstractClientEngine implements ClientEngine{ public abstract class AbstractClientEngine implements ClientEngine {
/**
* 配置
*/
protected ClientConfig config; protected ClientConfig config;
/**
* Cookie存储器
*/
protected CookieStoreSpi cookieStore; protected CookieStoreSpi cookieStore;
/** /**

View File

@@ -26,7 +26,13 @@ import cn.hutool.v7.http.server.handler.HttpHandler;
*/ */
public abstract class AbstractServerEngine implements ServerEngine { public abstract class AbstractServerEngine implements ServerEngine {
/**
* 配置
*/
protected ServerConfig config; protected ServerConfig config;
/**
* 处理器
*/
protected HttpHandler handler; protected HttpHandler handler;
@Override @Override

View File

@@ -29,6 +29,9 @@ import cn.hutool.v7.poi.excel.reader.ExcelReadConfig;
*/ */
public abstract class AbstractSheetReader<T> implements SheetReader<T> { public abstract class AbstractSheetReader<T> implements SheetReader<T> {
/**
* 读取范围
*/
protected final CellRangeAddress cellRangeAddress; protected final CellRangeAddress cellRangeAddress;
/** /**
* Excel配置 * Excel配置

View File

@@ -42,7 +42,13 @@ public class AioServer implements Closeable {
private AsynchronousChannelGroup group; private AsynchronousChannelGroup group;
private AsynchronousServerSocketChannel channel; private AsynchronousServerSocketChannel channel;
/**
* IO处理
*/
protected IoAction<ByteBuffer> ioAction; protected IoAction<ByteBuffer> ioAction;
/**
* 配置
*/
protected final SocketConfig config; protected final SocketConfig config;

View File

@@ -27,6 +27,10 @@ import java.util.Map;
* @author Tom Xin * @author Tom Xin
*/ */
public abstract class AnsiLabMapping { public abstract class AnsiLabMapping {
/**
* ANSI颜色和Lab颜色对应表
*/
protected Map<AnsiElement, LabColor> ansiLabMap; protected Map<AnsiElement, LabColor> ansiLabMap;
/** /**

View File

@@ -210,7 +210,7 @@
<encoding>UTF-8</encoding> <encoding>UTF-8</encoding>
<source>${compile.version}</source> <source>${compile.version}</source>
<release>${compile.version}</release> <release>${compile.version}</release>
<failOnError>false</failOnError> <failOnError>true</failOnError>
</configuration> </configuration>
</plugin> </plugin>
<!-- 统一更新pom版本 --> <!-- 统一更新pom版本 -->