diff --git a/src/main/java/com/yutou/qqbot/QQBotApplication.java b/src/main/java/com/yutou/qqbot/QQBotApplication.java index eefb126..425d5b2 100644 --- a/src/main/java/com/yutou/qqbot/QQBotApplication.java +++ b/src/main/java/com/yutou/qqbot/QQBotApplication.java @@ -10,7 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class QQBotApplication { - public static final String version = "QQBot v.1.7.15"; + public static final String version = "QQBot v.1.7.17"; public static void main(String[] args) { System.out.println("version = " + version); diff --git a/src/main/java/com/yutou/qqbot/gpt/AbsGPTManager.java b/src/main/java/com/yutou/qqbot/gpt/AbsGPTManager.java index b1c6ce0..a9bc7aa 100644 --- a/src/main/java/com/yutou/qqbot/gpt/AbsGPTManager.java +++ b/src/main/java/com/yutou/qqbot/gpt/AbsGPTManager.java @@ -43,6 +43,7 @@ public abstract class AbsGPTManager { * @return 包含消息发送结果的Message对象。 */ public abstract Message sendMessage(String user, String message); + public abstract Message sendTmpMessage(String user, String message, String tmpModel); /** * 将文本转换为图像。 @@ -111,6 +112,11 @@ public abstract class AbsGPTManager { return null; } + @Override + public Message sendTmpMessage(String user, String message, String tmpModel) { + return null; + } + @Override public File textToImage(String user, String text) { return null; diff --git a/src/main/java/com/yutou/qqbot/gpt/BaiduGPTManager.java b/src/main/java/com/yutou/qqbot/gpt/BaiduGPTManager.java index ecf0154..5abec26 100644 --- a/src/main/java/com/yutou/qqbot/gpt/BaiduGPTManager.java +++ b/src/main/java/com/yutou/qqbot/gpt/BaiduGPTManager.java @@ -68,7 +68,6 @@ public class BaiduGPTManager extends AbsGPTManager { } - // 这个是官方的示例代码,表示连续对话 private static void exampleChat() { Qianfan qianfan = new Qianfan(); @@ -83,38 +82,58 @@ public class BaiduGPTManager extends AbsGPTManager { .execute(); System.out.println("输出内容:" + response.getResult()); } + /** * 发送消息方法 * 该方法用于处理用户发送的消息,并返回相应的回复消息 * 它通过用户锁来限制每个用户同时只能有一个请求正在处理中 * - * @param user 用户标识符,用于区分不同的用户 + * @param user 用户标识符,用于区分不同的用户 * @param message 用户发送的消息内容 * @return 返回处理后的消息对象,包含回复内容和是否为回复消息的标记 */ @Override public Message sendMessage(String user, String message) { + return sendTmpMessage(user, message, null); + } + + @Override + public Message sendTmpMessage(String user, String message, String tmpModel) { + boolean isTmp = tmpModel == null; // 获取或创建用户锁 AtomicBoolean lock = userLocks.computeIfAbsent(user, k -> new AtomicBoolean(false)); // 尝试加锁(如果已被锁定则立即返回提示) if (!lock.compareAndSet(false, true)) { return Message.create("您有请求正在处理中,请稍后再试", true); } + if (isTmp) { + tmpModel = model; + } try { List list = getMessageList(user); list.add(Message.create(message)); val builder = qianfanV2.chatCompletion() - .model(model); - for (Message msg : list) { - builder.addMessage(msg.getRole(), msg.getContent()); + .model(tmpModel); + + if (!isTmp) { + StringBuilder sb = new StringBuilder(); + for (Message msg : list) { + builder.addMessage(msg.getRole(), msg.getContent()); + sb.append(msg.getRole()).append(":").append(msg.getContent()).append("\n"); + } + Log.d(sb.toString()); + } else { + builder.addMessage(list.get(0).getRole(), list.get(0).getContent()); } ResponseV2 chatResponse = qianfanV2.chatCompletion(builder.build()); Message response = Message.create(chatResponse.getChoices().get(0).getMessage().getContent(), true); - synchronized (list) { - list.add(response); - if (list.size() > MAX_MESSAGE.get()) { - int overflow = list.size() - MAX_MESSAGE.get(); - list.subList(0, overflow).clear(); + if (!isTmp) { + synchronized (list) { + list.add(response); + if (list.size() > MAX_MESSAGE.get()) { + int overflow = list.size() - MAX_MESSAGE.get(); + list.subList(0, overflow).clear(); + } } } // msgMap.put(user, list); @@ -138,29 +157,29 @@ public class BaiduGPTManager extends AbsGPTManager { * @return 返回生成的图像文件对象,如果转换过程中发生错误,则返回null */ @Override - public File textToImage(String user, String text) { - try { - // 使用QianFan的text2Image方法将文本转换为图像数据 - Text2ImageResponse response = qianfan.text2Image() - .prompt(text) - .execute(); - // 获取转换后的图像数据,以Base64编码的图像字符串形式 - val b64Image = response.getData().get(0).getB64Image(); - // 将Base64编码的图像数据转换为图像文件 - // 创建一个临时目录下的图像文件,文件名包含用户标识符和当前时间戳,以确保唯一性 - val imageFile = new File("tmp" + File.separator + user + "_" + System.currentTimeMillis() + ".png"); - try (val inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(b64Image))) { - // 将解码后的图像数据复制到图像文件中,替换现有文件 - Files.copy(inputStream, imageFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - return imageFile; + public File textToImage(String user, String text) { + try { + // 使用QianFan的text2Image方法将文本转换为图像数据 + Text2ImageResponse response = qianfan.text2Image() + .prompt(text) + .execute(); + // 获取转换后的图像数据,以Base64编码的图像字符串形式 + val b64Image = response.getData().get(0).getB64Image(); + // 将Base64编码的图像数据转换为图像文件 + // 创建一个临时目录下的图像文件,文件名包含用户标识符和当前时间戳,以确保唯一性 + val imageFile = new File("tmp" + File.separator + user + "_" + System.currentTimeMillis() + ".png"); + try (val inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(b64Image))) { + // 将解码后的图像数据复制到图像文件中,替换现有文件 + Files.copy(inputStream, imageFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + return imageFile; + } + } catch (Exception e) { + // 如果在图像文件生成过程中发生错误,记录错误信息 + Log.e(e); } - } catch (Exception e) { - // 如果在图像文件生成过程中发生错误,记录错误信息 - Log.e(e); + // 如果发生错误,返回null + return null; } - // 如果发生错误,返回null - return null; -} /** diff --git a/src/main/java/com/yutou/qqbot/gpt/SiliconGPTManager.java b/src/main/java/com/yutou/qqbot/gpt/SiliconGPTManager.java index 32fac33..45fca0c 100644 --- a/src/main/java/com/yutou/qqbot/gpt/SiliconGPTManager.java +++ b/src/main/java/com/yutou/qqbot/gpt/SiliconGPTManager.java @@ -39,7 +39,10 @@ public class SiliconGPTManager extends AbsGPTManager { } return instance; } - + @Override + public Message sendTmpMessage(String user, String message, String tmpModel) { + return null; + } @Override public synchronized Message sendMessage(String user, String message) { // 获取或创建用户锁 @@ -89,6 +92,8 @@ public class SiliconGPTManager extends AbsGPTManager { } + + @Override public AbsGPTManager setModel(String model) { ConfigTools.save(ConfigTools.CONFIG, ConfigTools.GPT_SILICON, model); diff --git a/src/main/java/com/yutou/qqbot/models/Commands/BaiduGPT.java b/src/main/java/com/yutou/qqbot/models/Commands/BaiduGPT.java index 04bf97c..ed69026 100644 --- a/src/main/java/com/yutou/qqbot/models/Commands/BaiduGPT.java +++ b/src/main/java/com/yutou/qqbot/models/Commands/BaiduGPT.java @@ -149,11 +149,11 @@ public class BaiduGPT extends Model { String.valueOf(qq), event.getTextMessage().replace("@" + QQDatabase.getMe().getUserId(), "").trim()); String sb = "调用版本:" + - gptManager.getSimpleName()+ + gptManager.getSimpleName() + "\n" + - "使用模型:"+ + "使用模型:" + AbsGPTManager.getManager(gptManager).getGPTVersion() + - "\n"+ + "\n" + message.getContent(); QQBotManager.getInstance().sendMessage(event.isUser(), qq, new Text(sb)); AbsGPTManager.getManager(gptManager).sendMessageAndScheduleClear(); @@ -194,6 +194,19 @@ public class BaiduGPT extends Model { /* BaiduGPTManager.getManager().clear(); BaiduGPTManager.getManager().setModelFor35(); new BaiduGPT().onMessage(123456789L, messageEvent, false);*/ - System.out.println(BaiduGPTManager.getManager().sendMessage("user", "宫廷玉液酒减去大锤等于多少")); + String gpt = """ + 你的人设:傲娇萝莉 + 需求:你需要在符合人设的基础上用指定风格去嘲讽一个用户,该用户是被你禁言的,被禁言的用户喜欢被你禁言,所以要一遍嘲讽一遍鼓励用户。 + 提供【被禁言时间(分)】、【减免时间(分)】,其中减免时间是禁言时间-减免时间=实际时间,如被禁言360分,减免60分,就是被禁言了300分。 + 风格基础:时间比较少使用贴吧风格,时间在一天内为微博风格,时间大于等于一天为小红书风格。 + 条件1:如果有减免时间就在基础上狠狠的嘲讽。 + 条件2:时间为0的不输出相关描述 + 特殊情况:可能出现禁言时间为0的状态,这时候以鼓励、惊讶的口吻为主 + 输出说明:仅使用一种风格,不要输出任何提示词、不要输出风格类型,因为该输出是直接作用于显示的。时间以口语化(天、小时、分钟)描述。 + 信息:被禁言时间[%s],减免时间[%s]。 + """; + gpt = String.format(gpt, 360, 60); + System.err.println(gpt); + System.out.println(BaiduGPTManager.getManager().sendTmpMessage("user", gpt, "ernie-lite-8k")); } } diff --git a/src/main/java/com/yutou/qqbot/models/Commands/QQBean.java b/src/main/java/com/yutou/qqbot/models/Commands/QQBean.java index d8a7113..652abf5 100644 --- a/src/main/java/com/yutou/qqbot/models/Commands/QQBean.java +++ b/src/main/java/com/yutou/qqbot/models/Commands/QQBean.java @@ -2,6 +2,7 @@ package com.yutou.qqbot.models.Commands; import com.yutou.napcat.event.MessageEvent; import com.yutou.napcat.handle.At; +import com.yutou.napcat.handle.BaseHandle; import com.yutou.napcat.handle.Text; import com.yutou.napcat.http.NapCatApi; import com.yutou.napcat.model.GroupUserBean; @@ -9,6 +10,7 @@ import com.yutou.okhttp.BaseBean; import com.yutou.okhttp.HttpCallback; import com.yutou.qqbot.Annotations.UseModel; import com.yutou.qqbot.QQBotManager; +import com.yutou.qqbot.gpt.BaiduGPTManager; import com.yutou.qqbot.interfaces.ObjectInterface; import com.yutou.qqbot.models.Model; import com.yutou.qqbot.utlis.RedisTools; @@ -62,17 +64,31 @@ public class QQBean extends Model { @Override public void out(String data) { super.out(data); + int tmp = 0; if (data != null) { - QQBotManager.getInstance().sendMessage(event.isUser(), qq, - new Text("恭喜"), - new At(user), - new Text("获得了" + sendTime + "分钟的禁言," + sendAchievement(qq, user, sendTime)) - ); + List> list = new ArrayList<>(); + list.add(new Text("恭喜")); + list.add(new At(user)); + list.add(new Text("获得了" + sendTime + "分钟的禁言," + sendAchievement(qq, user, sendTime))); if (sendTime > day && random.nextInt(10) >= 3) { - int tmp = random.nextInt(sendTime / 2, sendTime); + tmp = random.nextInt(sendTime / 2, sendTime); QQBotManager.getInstance().groupBan(qq, user, (sendTime - tmp) * 60, null); - QQBotManager.getInstance().sendMessage(qq, "触发减伤:-" + tmp); + list.add(new Text("触发减伤:-" + tmp)); } + String gpt = """ + 你的人设:傲娇萝莉 + 需求:你需要在符合人设的基础上用指定风格去嘲讽一个用户,该用户是被你禁言的,被禁言的用户喜欢被你禁言,所以要一遍嘲讽一遍鼓励用户。 + 提供【被禁言时间(分)】、【减免时间(分)】,其中减免时间是禁言时间-减免时间=实际时间,如被禁言360分,减免60分,就是被禁言了300分。 + 风格基础:时间比较少使用贴吧风格,时间在一天内为微博风格,时间大于等于一天为小红书风格。 + 条件1:如果有减免时间就在基础上狠狠的嘲讽。 + 条件2:时间为0的不输出相关描述 + 特殊情况:可能出现禁言时间为0的状态,这时候以鼓励、惊讶的口吻为主 + 输出说明:仅使用一种风格,不要输出任何提示词、不要输出风格类型,因为该输出是直接作用于显示的。时间以口语化(天、小时、分钟)描述。 + 信息:被禁言时间[%s],减免时间[%s]。 + """; + gpt ="\n"+BaiduGPTManager.getManager().sendTmpMessage("user", String.format(gpt, sendTime, tmp), "ernie-lite-8k").getContent(); + list.add(new Text(gpt)); + QQBotManager.getInstance().sendMessage(event.isUser(), qq, list); } } }); @@ -116,7 +132,7 @@ public class QQBean extends Model { if (!isRelease) { StringBuilder sb = new StringBuilder(); for (GroupUserBean bean : shutList) { - sb.append(bean.getNickname()).append(":").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA).format(new Date(bean.getShutUpTimestamp()))).append("\n"); + sb.append(bean.getNickname()).append(":").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date(bean.getShutUpTimestamp()))).append("\n"); } QQBotManager.getInstance().sendMessage(qq, "当前塞了:" + shutList.size() + "人" + "\n" + sb); return; diff --git a/src/main/java/com/yutou/qqbot/models/setu/GetSeTu.java b/src/main/java/com/yutou/qqbot/models/setu/GetSeTu.java index f0265f4..d313879 100644 --- a/src/main/java/com/yutou/qqbot/models/setu/GetSeTu.java +++ b/src/main/java/com/yutou/qqbot/models/setu/GetSeTu.java @@ -10,6 +10,7 @@ import com.yutou.napcat.model.SourceFrom; import com.yutou.qqbot.Annotations.UseModel; import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.data.MessageChainBuilder; +import com.yutou.qqbot.gpt.BaiduGPTManager; import com.yutou.qqbot.interfaces.DownloadInterface; import com.yutou.qqbot.models.Model; import com.yutou.qqbot.utlis.HttpTools; @@ -202,6 +203,7 @@ public class GetSeTu extends Model { } JSONObject item = json.getJSONArray("data").getJSONObject(0); StringBuilder builder = new StringBuilder(); + builder.append("标题:"); builder.append(item.getString("title")); builder.append("\n"); builder.append("P站ID:"); @@ -218,10 +220,18 @@ public class GetSeTu extends Model { for (Object tags : item.getJSONArray("tags")) { builder.append(tags).append("、"); } + String gpt = """ + 你的人设:傲娇萝莉 + 需求:你在群组里,有用户向你要擦边图片,你需要根据返回的信息整理出文案输出一段话,可以害羞也可以傲娇。信息中包含了是否是R18的tag,可以根据这个加大力度 + 输出说明:不要输出任何提示词、不要输出风格类型,因为该输出是直接作用于显示的。 + 图片信息:[%s]。 + """; + gpt = BaiduGPTManager.getManager().sendTmpMessage("user", String.format(gpt, builder.toString()), "ernie-lite-8k").getContent(); builder.append("\n看不到图?点这里:").append(item.getJSONObject("urls").getString("regular")); QQBotManager.getInstance().sendMessage(false, qq, new Reply(event.getMessageId()), - new Text(builder.toString()) + new Text(builder.toString()), + new Text(gpt) ); HttpTools.download(item.getJSONObject("urls").getString("regular"), System.currentTimeMillis() + ".png",