QQBot/src/main/java/com/yutou/qqbot/gpt/SiliconGPTManager.java
Yutou 9e062976ac feat(gpt): 支持切换 GPT 模型
- 新增配置项 GPT 用于选择 GPT 模型类型
- 实现 BaiduGPT 和 SiliconGPT 两种模型的切换逻辑
- 优化 SiliconGPTManager 初始化,支持自定义模型配置
- 更新 QQBot 版本号至 1.7.12
2025-02-13 17:38:28 +08:00

125 lines
3.9 KiB
Java

package com.yutou.qqbot.gpt;
import com.yutou.okhttp.HttpLoggingInterceptor;
import com.yutou.qqbot.data.baidu.Message;
import com.yutou.qqbot.data.gpt.OpenAiBean;
import com.yutou.qqbot.http.GPTApi;
import com.yutou.qqbot.http.GPTBuilder;
import com.yutou.qqbot.utlis.ConfigTools;
import com.yutou.qqbot.utlis.StringUtils;
import lombok.val;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
public class SiliconGPTManager extends AbsGPTManager {
//生成单例模式
private volatile static SiliconGPTManager instance = new SiliconGPTManager();
private SiliconGPTManager() {
val load = ConfigTools.load(ConfigTools.CONFIG, ConfigTools.GPT_SILICON, String.class);
String defModel = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B";
if (!StringUtils.isEmpty(load)) {
defModel = load;
}
setModel(defModel);
}
public static SiliconGPTManager getInstance() {
if (instance == null) {
synchronized (SiliconGPTManager.class) {
if (instance == null) {
instance = new SiliconGPTManager();
}
}
}
return instance;
}
@Override
public synchronized Message sendMessage(String user, String message) {
// 获取或创建用户锁
AtomicBoolean lock = userLocks.computeIfAbsent(user, k -> new AtomicBoolean(false));
try {
// 尝试加锁(如果已被锁定则立即返回提示)
if (!lock.compareAndSet(false, true)) {
return Message.create("您有请求正在处理中,请稍后再试", true);
}
val builder = GPTBuilder.create(model);
List<Message> list = getMessageList(user);
list.add(Message.create(message));
for (Message msg : list) {
builder.addMessage(msg.getRole(), msg.getContent());
}
val response = GPTApi.getApi().completions(builder.build()).execute();
if (!response.isSuccessful()) {
return Message.create("API请求失败", true);
}
val body = response.body();
if (body == null || body.getData() == null) {
return Message.create("API请求为空", true);
}
if (body.getRetcode() != 0) {
return Message.create(body.getMsg(), true);
}
val choices = body.getData().getChoices();
if (choices == null || choices.isEmpty()) {
return Message.create("没有对话信息", true);
}
val choice = choices.get(choices.size() - 1);
val bot = Message.create(choice.getMessage().getContent(), true);
list.add(bot);
return bot;
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
lock.set(false);
userLocks.remove(user, lock);
}
}
@Override
public File textToImage(String user, String text) {
return null;
}
@Override
public String imageToText(String user, File file) {
return "";
}
@Override
public String getGPTVersion() {
return model;
}
@Override
public int setMaxMessageCount(int count) {
MAX_MESSAGE.set(count);
return count;
}
public static void main(String[] args) {
String model = "THUDM/glm-4-9b-chat";
val message = AbsGPTManager.getManager(SiliconGPTManager.class)
.setModel(model)
.sendMessage("user", "宫廷玉液酒的下一句是什么?");
System.out.println(message);
System.out.println(AbsGPTManager.getManager(SiliconGPTManager.class)
.setModel(model)
.sendMessage("user", "宫廷玉液酒减去大锤等于多少")
);
}
}