QChatGPT/pkg/openai/keymgr.py

90 lines
2.3 KiB
Python
Raw Normal View History

2022-12-15 17:59:25 +08:00
# 此模块提供了维护api-key的各种功能
import hashlib
import logging
2023-01-14 22:36:48 +08:00
import pkg.plugin.host as plugin_host
import pkg.plugin.models as plugin_models
2022-12-15 17:59:25 +08:00
2023-03-05 15:39:13 +08:00
2022-12-15 17:59:25 +08:00
class KeysManager:
api_key = {}
2023-03-05 15:39:13 +08:00
"""所有api-key"""
2022-12-15 17:59:25 +08:00
using_key = ""
2023-04-03 00:19:28 +08:00
"""当前使用的api-key"""
2022-12-15 17:59:25 +08:00
alerted = []
2023-03-05 15:39:13 +08:00
"""已提示过超额的key
记录在此以避免重复提示
"""
2022-12-15 17:59:25 +08:00
exceeded = []
2023-03-05 15:39:13 +08:00
"""已超额的key
供自动切换功能识别
"""
2022-12-15 17:59:25 +08:00
def get_using_key(self):
return self.using_key
def get_using_key_md5(self):
return hashlib.md5(self.using_key.encode('utf-8')).hexdigest()
2022-12-15 17:59:25 +08:00
def __init__(self, api_key):
2022-12-15 17:59:25 +08:00
if type(api_key) is dict:
self.api_key = api_key
elif type(api_key) is str:
self.api_key = {
"default": api_key
}
elif type(api_key) is list:
for i in range(len(api_key)):
self.api_key[str(i)] = api_key[i]
# 从usage中删除未加载的api-key的记录
# 不删了也许会运行时添加曾经有记录的api-key
self.auto_switch()
def auto_switch(self) -> tuple[bool, str]:
2023-03-05 15:39:13 +08:00
"""尝试切换api-key
Returns:
是否切换成功, 切换后的api-key的别名
"""
2022-12-15 17:59:25 +08:00
for key_name in self.api_key:
if self.api_key[key_name] not in self.exceeded:
2022-12-15 17:59:25 +08:00
self.using_key = self.api_key[key_name]
2023-01-14 22:36:48 +08:00
2022-12-15 17:59:25 +08:00
logging.info("使用api-key:" + key_name)
2023-01-14 22:36:48 +08:00
# 触发插件事件
args = {
"key_name": key_name,
"key_list": self.api_key.keys()
}
_ = plugin_host.emit(plugin_models.KeySwitched, **args)
2022-12-15 17:59:25 +08:00
return True, key_name
self.using_key = list(self.api_key.values())[0]
logging.info("使用api-key:" + list(self.api_key.keys())[0])
2022-12-15 17:59:25 +08:00
return False, ""
def add(self, key_name, key):
self.api_key[key_name] = key
def set_current_exceeded(self):
2023-04-03 00:19:28 +08:00
"""设置当前使用的api-key使用量超限"""
self.exceeded.append(self.using_key)
def get_key_name(self, api_key):
"""根据api-key获取其别名"""
for key_name in self.api_key:
if self.api_key[key_name] == api_key:
return key_name
2023-03-10 23:14:32 +08:00
return ""