139 lines
4.0 KiB
Java
139 lines
4.0 KiB
Java
package com.yutou.qqbot.gpt;
|
|
|
|
import com.yutou.qqbot.data.baidu.Message;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
public abstract class AbsGPTManager {
|
|
protected static final AtomicInteger MAX_MESSAGE = new AtomicInteger(20);
|
|
protected final ConcurrentHashMap<String, List<Message>> msgMap= new ConcurrentHashMap<>();
|
|
// 新增锁映射表
|
|
protected final ConcurrentHashMap<String, AtomicBoolean> userLocks = new ConcurrentHashMap<>();
|
|
protected String model ;
|
|
|
|
|
|
/**
|
|
* 清除与GPT管理器相关的所有缓存或状态信息。
|
|
*/
|
|
/**
|
|
* 这里确实是需要清空所有数据
|
|
*/
|
|
public synchronized void clear() { // 添加同步
|
|
msgMap.clear();
|
|
for (AtomicBoolean value : userLocks.values()) {
|
|
value.set(false);
|
|
}
|
|
userLocks.forEachValue(1, atomicBoolean -> atomicBoolean.set(false));
|
|
userLocks.clear();
|
|
}
|
|
|
|
/**
|
|
* 发送消息到指定用户。
|
|
*
|
|
* @param user 接收消息的用户标识符。
|
|
* @param message 要发送的消息内容。
|
|
* @return 包含消息发送结果的Message对象。
|
|
*/
|
|
public abstract Message sendMessage(String user, String message);
|
|
|
|
/**
|
|
* 将文本转换为图像。
|
|
*
|
|
* @param user 用户标识符。
|
|
* @param text 要转换为图像的文本内容。
|
|
* @return 包含生成图像的File对象。
|
|
*/
|
|
public abstract File textToImage(String user, String text);
|
|
|
|
/**
|
|
* 将图像转换为文本。
|
|
*
|
|
* @param user 用户标识符。
|
|
* @param file 包含要转换为文本的图像文件。
|
|
* @return 提取的文本内容。
|
|
*/
|
|
public abstract String imageToText(String user, File file);
|
|
|
|
/**
|
|
* 获取当前使用的GPT版本信息。
|
|
*
|
|
* @return GPT版本字符串。
|
|
*/
|
|
public abstract String getGPTVersion();
|
|
|
|
/**
|
|
* 设置最大消息数量。
|
|
*
|
|
* @param count 最大消息数量。
|
|
* @return 设置后的最大消息数量。
|
|
*/
|
|
public abstract int setMaxMessageCount(int count);
|
|
|
|
public List<Message> getMessageList(String user){
|
|
List<Message> list = msgMap.computeIfAbsent(user, k -> Collections.synchronizedList(new ArrayList<>()));
|
|
// 限制历史消息的最大数量
|
|
synchronized (list) {
|
|
if (list.size() >= MAX_MESSAGE.get()) {
|
|
int removeCount = list.size() - MAX_MESSAGE.get() + 1; // 腾出空间给新消息
|
|
list.subList(0, removeCount).clear();
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
/**
|
|
* 根据指定的类获取相应的GPT管理器实例。
|
|
*
|
|
* @param tClass GPT管理器的具体实现类。
|
|
* @return GPT管理器实例。
|
|
*/
|
|
public static <T extends AbsGPTManager> AbsGPTManager getManager(Class<?> tClass) {
|
|
if (tClass == BaiduGPTManager.class) {
|
|
return BaiduGPTManager.getManager();
|
|
}else if(tClass== SiliconGPTManager.class){
|
|
return SiliconGPTManager.getInstance();
|
|
}
|
|
return new AbsGPTManager() {
|
|
@Override
|
|
public void clear() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public Message sendMessage(String user, String message) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public File textToImage(String user, String text) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public String imageToText(String user, File file) {
|
|
return "";
|
|
}
|
|
|
|
@Override
|
|
public String getGPTVersion() {
|
|
return "";
|
|
}
|
|
|
|
@Override
|
|
public int setMaxMessageCount(int count) {
|
|
return 0;
|
|
}
|
|
};
|
|
}
|
|
|
|
public AbsGPTManager setModel(String model) {
|
|
this.model=model;
|
|
return this;
|
|
}
|
|
}
|