上传问题改写、意图识别模块代码
This commit is contained in:
@@ -0,0 +1,256 @@
|
||||
import os
|
||||
import random
|
||||
import time
|
||||
from typing import List, Optional, Dict
|
||||
from threading import Lock
|
||||
|
||||
API_KEY_LIST=[
|
||||
"sk-xxaiabmfhzwwpijuledllkmkzhzwsqeicjxmjwnvriqpwmpk",
|
||||
"sk-lldcprpqjhgdimiwewgbthngfbrazhkiuioubmaatrcpjjum",
|
||||
"sk-bppugibbtvujomvoysnbcdzpcwndxtwrkfvmgbkbzcmobdon",
|
||||
"sk-hnqitgdlfrrnpimcfxigqibstqquintnzpiidsshpajjyxqd",
|
||||
"sk-hrojkkkrrkmsajtnizokbcgexsfggdiqavbtvbayuwqbnmom",
|
||||
"sk-kkdklmnyompoiotzkfqahpayzlkgogfudjkyaebehtsowvid",
|
||||
"sk-sfxzvllifafbyfduupcdtcrjwhdyiyojnksyopnfslurnhsp",
|
||||
"sk-faqirxiszukfswqvzqawxnemqfacrkyurbxxkzwbbujqacdp",
|
||||
"sk-vonaanuueqiczppkntjuphateshrcpqpnvxmwxorkyihjmrb",
|
||||
"sk-qfpeoodgupcukcdstjcxgegwxnuhtxkkrupkogkcvhavxgny",
|
||||
"sk-fsvjnbpfgoadixympaabaukupuhjvbturcbxaqfdzjznemtr",
|
||||
"sk-fltvnbiqntfawjwkfnnhmyfiimzgzxkweqmefcfqkbucwrhi",
|
||||
"sk-oosswdriwyqkglwdigvcxgmcpyplcyowicbaugpizoscevdl",
|
||||
"sk-jswtxhkiralnyiukqimtyuurcaepulxdrfijadtxzrgsajyc",
|
||||
"sk-dcjuhoukdyrbneadtxtnyxzmigkpiqgtqqnreiprxpioftsv",
|
||||
"sk-yrhezyuxjblpaxzzudbowqmvcoxcammupcubghbodolikbdk",
|
||||
"sk-dsgvwpfagmarilmnewwbzhfzlqehburoupjaopucdvybpbdo",
|
||||
"sk-oljjlspuaurtoczyekztiidwtoerugadgepiufclpmrbdfqc",
|
||||
"sk-crgrimubjesthvxuqwedqqdoetljyrgeahxxpctfefgnkpyo",
|
||||
"sk-tubqhwgycxrdhwsqzjopxgeaqpsjdfppckckayvzornaluwq",
|
||||
"sk-amcxlmsdnadptpnehqnkvseolacipztmvovnmxojzohbjjil",
|
||||
"sk-pdyymhshpzmdduwxsezthnrgarnnhgzvmiflbpisfzxkiayt",
|
||||
"sk-qhwoorywmejumyudfxbrkegxtqifsbgcdkmpjckezepgyqnz",
|
||||
"sk-cpoctrgcnstaybeyuieuwjdgeakudhqdnnwdjavjudcbvvem",
|
||||
]
|
||||
|
||||
class APIKeyManager:
|
||||
"""
|
||||
API密钥管理器,用于解析环境变量中的多个API密钥并提供获取接口
|
||||
支持密钥轮转使用
|
||||
"""
|
||||
# 类变量,用于保存单例实例
|
||||
_instance = None
|
||||
_lock = Lock()
|
||||
|
||||
# 密钥使用计数和上次使用时间
|
||||
_key_usage: Dict[str, Dict] = {}
|
||||
# 当前正在使用的密钥索引
|
||||
_current_index = 0
|
||||
|
||||
@classmethod
|
||||
def get_instance(cls, env_var_name: str = "OPENAI_API_KEY", separator: str = ";"):
|
||||
"""
|
||||
获取单例实例
|
||||
|
||||
Args:
|
||||
env_var_name: 环境变量名称,默认为'OPENAI_API_KEY'
|
||||
separator: 密钥分隔符,默认为分号
|
||||
|
||||
Returns:
|
||||
APIKeyManager实例
|
||||
"""
|
||||
if cls._instance is None:
|
||||
with cls._lock:
|
||||
if cls._instance is None:
|
||||
cls._instance = cls(env_var_name, separator)
|
||||
return cls._instance
|
||||
|
||||
@classmethod
|
||||
def get_api_key(cls) -> Optional[str]:
|
||||
"""
|
||||
静态方法:获取一个API密钥,使用轮转策略
|
||||
|
||||
Returns:
|
||||
API密钥,如果没有可用的密钥则返回None
|
||||
"""
|
||||
instance = cls.get_instance()
|
||||
return instance._get_next_api_key()
|
||||
|
||||
@classmethod
|
||||
def get_random_api_key(cls) -> Optional[str]:
|
||||
"""
|
||||
静态方法:随机获取一个API密钥
|
||||
|
||||
Returns:
|
||||
API密钥,如果没有可用的密钥则返回None
|
||||
"""
|
||||
instance = cls.get_instance()
|
||||
return instance._get_random_api_key()
|
||||
|
||||
@classmethod
|
||||
def get_valid_api_keys(cls) -> List[str]:
|
||||
"""
|
||||
静态方法:获取有效的API密钥列表
|
||||
|
||||
Returns:
|
||||
"""
|
||||
# 验证每一个apikey是否有效,无效则删除并打印日志。地址https://api.siliconflow.cn/v1/
|
||||
import requests
|
||||
import logging
|
||||
|
||||
valid_api_keys = []
|
||||
url = "https://api.siliconflow.cn/v1/chat/completions"
|
||||
headers_template = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
data = {
|
||||
"model": "deepseek-ai/DeepSeek-V3",
|
||||
"messages": [
|
||||
{"role": "user", "content": "ping"}
|
||||
],
|
||||
"max_tokens": 1
|
||||
}
|
||||
for key in API_KEY_LIST:
|
||||
headers = headers_template.copy()
|
||||
headers["Authorization"] = f"Bearer {key}"
|
||||
try:
|
||||
resp = requests.post(url, headers=headers, json=data, timeout=8)
|
||||
if resp.status_code == 200:
|
||||
valid_api_keys.append(key)
|
||||
else:
|
||||
logging.warning(f"API密钥无效(被移除): {key}, 状态码: {resp.status_code}, 响应: {resp.text}")
|
||||
except Exception as e:
|
||||
logging.warning(f"API密钥验证异常(被移除): {key}, 错误: {e}")
|
||||
return valid_api_keys
|
||||
|
||||
@classmethod
|
||||
def count(cls) -> int:
|
||||
"""
|
||||
静态方法:获取API密钥数量
|
||||
|
||||
Returns:
|
||||
API密钥数量
|
||||
"""
|
||||
instance = cls.get_instance()
|
||||
return len(instance.api_keys)
|
||||
|
||||
def __init__(self, env_var_name: str = "OPENAI_API_KEY", separator: str = ";"):
|
||||
"""
|
||||
初始化API密钥管理器
|
||||
|
||||
Args:
|
||||
env_var_name: 环境变量名称,默认为'OPENAI_API_KEY'
|
||||
separator: 密钥分隔符,默认为分号
|
||||
"""
|
||||
self.env_var_name = env_var_name
|
||||
self.separator = separator
|
||||
self.api_keys = self._load_api_keys()
|
||||
|
||||
# 初始化密钥使用统计
|
||||
for key in self.api_keys:
|
||||
if key not in self._key_usage:
|
||||
self._key_usage[key] = {
|
||||
"count": 0,
|
||||
"last_used": 0
|
||||
}
|
||||
|
||||
def _load_api_keys(self) -> List[str]:
|
||||
"""
|
||||
从环境变量加载API密钥
|
||||
|
||||
Returns:
|
||||
API密钥列表
|
||||
"""
|
||||
# api_keys = []
|
||||
# env_value = os.environ.get(self.env_var_name)
|
||||
|
||||
# if env_value:
|
||||
# # 分割环境变量并移除空白字符
|
||||
# keys = [key.strip() for key in env_value.split(self.separator)]
|
||||
# # 过滤掉空字符串
|
||||
# api_keys = [key for key in keys if key]
|
||||
|
||||
# return api_keys
|
||||
return API_KEY_LIST
|
||||
|
||||
def _get_next_api_key(self) -> Optional[str]:
|
||||
"""
|
||||
获取下一个API密钥,使用轮转策略
|
||||
|
||||
Returns:
|
||||
API密钥,如果没有可用的密钥则返回None
|
||||
"""
|
||||
if not self.api_keys:
|
||||
return None
|
||||
|
||||
with self._lock:
|
||||
# 轮转到下一个密钥
|
||||
self._current_index = (self._current_index + 1) % len(self.api_keys)
|
||||
selected_key = self.api_keys[self._current_index]
|
||||
|
||||
# 更新使用统计
|
||||
self._key_usage[selected_key]["count"] += 1
|
||||
self._key_usage[selected_key]["last_used"] = time.time()
|
||||
|
||||
return selected_key
|
||||
|
||||
def _get_random_api_key(self) -> Optional[str]:
|
||||
"""
|
||||
随机获取一个API密钥
|
||||
|
||||
Returns:
|
||||
API密钥,如果没有可用的密钥则返回None
|
||||
"""
|
||||
if not self.api_keys:
|
||||
return None
|
||||
|
||||
with self._lock:
|
||||
selected_key = random.choice(self.api_keys)
|
||||
|
||||
# 更新使用统计
|
||||
self._key_usage[selected_key]["count"] += 1
|
||||
self._key_usage[selected_key]["last_used"] = time.time()
|
||||
|
||||
return selected_key
|
||||
|
||||
def get_all_api_keys(self) -> List[str]:
|
||||
"""
|
||||
获取所有API密钥
|
||||
|
||||
Returns:
|
||||
API密钥列表
|
||||
"""
|
||||
return self.api_keys.copy()
|
||||
|
||||
def is_valid(self) -> bool:
|
||||
"""
|
||||
检查是否有可用的API密钥
|
||||
|
||||
Returns:
|
||||
如果有可用的API密钥则返回True,否则返回False
|
||||
"""
|
||||
return len(self.api_keys) > 0
|
||||
|
||||
def get_usage_stats(self) -> Dict:
|
||||
"""
|
||||
获取密钥使用统计信息
|
||||
|
||||
Returns:
|
||||
密钥使用统计信息
|
||||
"""
|
||||
return self._key_usage.copy()
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == "__main__":
|
||||
|
||||
# 获取有效的API密钥列表
|
||||
valid_keys = APIKeyManager.get_valid_api_keys()
|
||||
print(f"有效的API密钥列表:\n" + "\n".join(valid_keys))
|
||||
|
||||
# 查看总密钥数
|
||||
print(f"总共有 {APIKeyManager.count()} 个API密钥")
|
||||
|
||||
# 获取实例并查看使用统计
|
||||
instance = APIKeyManager.get_instance()
|
||||
stats = instance.get_usage_stats()
|
||||
for key, data in stats.items():
|
||||
print(f"密钥 {key[:5]}... 使用次数: {data['count']}")
|
||||
Reference in New Issue
Block a user