更新.gitignore文件以忽略日志文件,新增api_key.txt文件以管理API密钥,并在对话转工单和查询完整性判断模块中添加日志记录和堆栈跟踪功能,提升错误处理和调试能力。

This commit is contained in:
2025-06-20 09:43:37 +08:00
parent e0e893eb09
commit 450a632ad2
6 changed files with 196 additions and 127 deletions
+45 -111
View File
@@ -17,104 +17,6 @@ import requests
# sk-bdagppigfxexcofiossccywvcqggbpywjapkdbtqycbgvqpz
# sk-dvbaktabkdwdpjgxyoozlwnejosjyhdgqwllfeborqahndxs
API_KEY_LIST=[
"sk-kvgfuqeqvpmfsccykyoohheshclcrtvjlnewratvrjpkpbkc",
"sk-kzhxlqvqcxlnbdgnpalqnzumkmspepkttkgbophnkqanainw",
"sk-tovmogiablsoeabwgqyvevpcfichyjpuzqdymmvksspdrtqt",
"sk-yvyvoiegjrdlgihnxlaaznzdhnvpmfowtwmofomcodaoeaqs",
"sk-vccwuaomxhjcszjhheipoqqmsnuetasiveombkyrptstesbi",
"sk-mxbapcczwjsyrictwgigxgcvdgptyfrlynrewqioegqwrggv",
"sk-dujjzxrknevesbagqgqmuffxsosjoueviubnmodoormlmlzt",
"sk-rpptsvdeifcnyfkkrwnphgkrlchrqrbkglxrmztdzvfutdor",
"sk-lsukfggzghmdhtfhqcbmlfqabbtapwpuxnvtwshqqqlaesie",
"sk-aulumxzhvaladchcwgmsxidtdsvzytbpvzqgfuvcxlwbwcgl",
"sk-tzdqzroakecvseclcmrbhdnepveatybhhzxfpzxzgirpqcdy",
"sk-otxxemniwhxkdvroszmmkitswwuykosnqoldrkzdoflqpgvw",
"sk-zlruqobfdbjebyyvkmehakpcvfgnlfbdlbfrepusazzckbnv",
"sk-zryimztrlkgvcaiolarhvbcewmhwruhqfcndbylonzlqvdox",
"sk-rczjqufgdisqplkrmvhaxmdgcboluvxympvzljlreuqeeviq",
"sk-xfnvcksdgwufsktvmhpqrwpgovsxxtaeehtxnaqjtxmubqzl",
"sk-gcostftlutooxzsnqefcgyfxqytidvfjpxhbuxppgatwczoq",
"sk-wwonvjnowbcxmoyoluynnkjwerghspzdulyidskunkordaft",
"sk-rbuykocecbdoqteveeggwzvrhbvisgaerffexjsnyvjefhdk",
"sk-qmrkfvvbbfssuoreyvwqawoveyowuvxviqzqknotyweqmuog",
"sk-nprpuknjmikvoaxnwgyshwwwtnifvixpuqtzkzmcacdnvoib",
"sk-xanwnicepdxfqrfejzuxjcrhdsglfypkoxlcmmtamrtjkork",
"sk-lvtdgodiaurqyiwdxtdrgxifguychhccqlqkhqctscvqbfgi",
"sk-aedlbtlmqcttxwnvlfmxzaysamocamqxjceoyqjfgpcowybw",
"sk-fahdvndjblyjlizamvwcrxnilsgmbgbvwssxgquhkezgpqne",
"sk-tzludgttzxvpvwayazdbppbauvathdtccafjrhojpemucgyi",
"sk-hrbroidbfusidwnsmxenuzljxgdzzxiimlezygxplavnxjik",
"sk-ylgoiqxmtxeojdnonthxtweungyzldaqarvjxlqyztlvyrff",
"sk-asuqbqwdhjcqnvtjlwufyrkrwkobnrbmukzarvcctsgjipdp",
"sk-dpgpymiydutoexgvkajwgahagnfmcqzafwulccudnzvleifz",
"sk-nbksjgcngsayoumnsdbkcpnqivnvxjenwpzuazzrkhnsgeoo",
"sk-iaafvpjyqiocgzchbdldbkgcffqniahkcbgoviuevuogulcm",
"sk-muvjguqeshyimzowqnqgxwpsgujlpkqgrisxsimthtyrpypx",
"sk-jgybgyayxlwoxeijgrjcneqlyusleohgbliuwpsuhocrjsmk",
"sk-wzjsmwxcbbpcrqivqfzjwufqqjtlwejtncnvbpeicznkwiuh",
"sk-izdjicdoyillktsihkiapuvwebisehtlgykozrvzfkgncwsc",
"sk-fcsfmyivfuojsqsditvobfqprdpeunukycpcfnoxkraqevpx",
"sk-szyjgyxrcvyxpvzfwgmbxnflxngxvcplitcctsdvvrqjgftk",
"sk-jzbodthsnvjwbyrnynsxrudtqfnbdbrcxebjwjgajocnzqse",
"sk-fxepossfzpmccibfwqpkluorzqlbtcaplepeugtfzfsctcbl",
"sk-ympnflocrkxjrbubsxqdjqwicuyavvvysctlpfhunkcrzxjx",
"sk-flhqvziknntednkcgjaxlyzzsrfzjhrzrmteqonajpbiinni",
"sk-xfregpbbquqbxpiobjzanydsjivrjrnbokzxcqtnhxhyghhe",
"sk-jrdzerhmvrtvzawkksowbgkggkubwfquplmrxbdhespqgtis",
"sk-jjbpnkbeupsxyclcivbhizcfpfjrppddunbqynyjkqhtmpwu",
"sk-oqehupcveovkjqqtxypqyifidcdissuyehwrkdwgruoyjkpq",
"sk-jnnmltwtqwuoyagoogzzeraczmyfxhoairiddgayksqdfnbr",
"sk-eghuepxnbcollzrjwbzqvbnhiiwagkejaclyhvaodeqgwrog",
"sk-poszkbjdmamimconjustnrxxqusuzlryxkrzkpronlenrmen",
"sk-zolvcegarsrwqhwgvwzgtqupodsdmckjiocyvoyldbkusbzc",
"sk-ywfafulcniaqdgdcsnbtqquaqeuiqlkcnknkaflwxyuemcow",
"sk-hhedmocgtfpywbbpwamgfkygrahiqsuurntlbqqbmjwfipmm",
"sk-gzdqfoyvulrqscdpjlwlufdecrsyjpmwpkknuhnjsvtyftox",
"sk-bkcufidsebujopqqwexwxwpmevrpelmvxzdymncvllcyojce",
"sk-olabhscekudzkyudypkcjvehwqunagubwdmtppugrjmcptwv",
"sk-zpdqyocliebhqpkuwvebpgcnfjdkvavdltimllmgkthwnwph",
"sk-gvhchlfelocjniuydusyhhwacnomxnvucjonzkhtqoplnbcr",
"sk-lzneagvdxhisodndnxnpkntghpkimjmjsebiqdzaoqzuhbla",
"sk-xotcfdkigykevngedupitbcatjqppxmcibjtcebyoglykuxz",
"sk-ufydqsdqnwsegaqwtappzwdyzqnoblyunfvslomnnmykedgk",
"sk-jwasykftbkyjzdqlwcxuicrwzxsbhttilxfefbrozrznpwlv",
"sk-xngteojwkxmftyaabjdwwgyoadspsowmcpcqobteutdcfmnr",
"sk-akzkgniebruqrtuqskvlibkpcxjuazhcatysptkfyqivldfn",
"sk-vpqkxtmcgkggllexchzysuewyfaoexzasoumxngdplzgwksw",
"sk-fvcsqdbqmdlwxzjyofrilusqcypbfyczogaqwqrjrwvojmer",
"sk-htjprscvfgskjtjzpxxxjhyymshagogykpawxekrrfbgftyx",
"sk-vtlgznzanapdinnlpuuygdidejxvlvlziolumckxwntzvxcn",
"sk-npwaykpqovytxhihxepeaxuwgnzvqvscirwbiffudyebibwe",
"sk-kduozskjwsbxytajaedemqemimflzoqdrfbbuopuogbxptos",
"sk-cmyaaofqksxeccaiswwholizxtdhqoszpilbqhmwwablwtwl",
"sk-zltwpyvzodfszrvqcmjxycfshshmqmgtpghiaulcrtrilqup",
"sk-svpublkronxohqmjvtdemtyqopuwyknynmxvurkmmoqsfesk",
"sk-tindfeurhffenyetmblplxgytcgqnbbruatchpddtstnajvq",
"sk-ttwgosljnfdqbevvfkjewspoasountxeyiesuuwwpuoseatw",
"sk-ikzwjzfxxnocfqvkhbolmmnojdqfvdxzmlruynfoneahgraq",
"sk-zomatpdlatgtzvuoeabofeandiiespmsinosenjlmdigkvjk",
"sk-xypcnibvqgebhwvsudjuxlycwombofshifpltstezflountf",
"sk-vhtbtqsdyhwsrsitpppjpulbpnwlhjeeaujccggdjvjtucru",
"sk-ygqyapfsdpxxzihadttugvofrcgwlnsrqjvrqfrsrlgqidch",
"sk-cczurtilupwyrnqnjpdjltzamjbpyaxnwgzqoykvfwecezhs",
"sk-hsalsmvnzmvlknpzldciqligtjrvhcjdbjtcqhorptsgoisr",
"sk-ierjdccoycmipzflzvzjqdmjazmbczxhwejwrjmuouxpcqev",
"sk-rlthtjzrxkdlfsemijumxiwwsoxkwnjovobtqwprhnducsqi",
"sk-doocedvfjsmwysxyzpptojnwwuoucxvrknlrdsnomffljems",
"sk-tgxnplgtwawfnnetghvlzoinksickbynzsgovbrmlrkzzrsy",
"sk-aggkwzdteggbcgyzimiivphpzibnpmqfbkmgtwyggsjfdymg",
"sk-tzynazayiglcpzejedpfdftqvtuqynygluorjbbcvrnmsbfl",
"sk-mcaqucnscgznmtvtzhooxbdafzhcgjgpusnjfbftroedzujk",
"sk-mlfnxfmwwhturavnsbyedkgrhxfspbfitfyqkllezgdtzhwn",
"sk-meaqykzphtqqoiswdtbxfqndddmtgvwrdnzdxprozlumrojs",
"sk-vrtfrtioocmrylrrqpburhkgwmyxfipnissumgufmjpzjqoo",
"sk-rhknxievjjjzcmkvfwqosnaiglsoufytfkbhhgconiibwriy",
"sk-wzsvxjfnvpceeoapbzdimpwecckpmcsqmflocttnqyvqvrsr",
"sk-lflfajincbdljrfwkhrjunyolzuxtcfdbzmspyfizpbdwvvh",
"sk-siujvueppvhhokbofqlcdxudpswdfwpetvxyittpbarddhsu",
"sk-avpyhivanabvdyorypdmlqnfetivlwoovfvgsgklumxeqgzy",
]
class APIKeyManager:
"""
@@ -129,6 +31,8 @@ class APIKeyManager:
_key_usage: Dict[str, Dict] = {}
# 当前正在使用的密钥索引
_current_index = 0
api_file_path = "api_key.txt"
@classmethod
def get_instance(cls, env_var_name: str = "OPENAI_API_KEY", separator: str = ";"):
@@ -193,7 +97,8 @@ class APIKeyManager:
],
"max_tokens": 1
}
for key in API_KEY_LIST:
instance = cls.get_instance()
for key in instance.api_keys:
headers = headers_template.copy()
headers["Authorization"] = f"Bearer {key}"
try:
@@ -233,6 +138,24 @@ class APIKeyManager:
return response.json()
@classmethod
def remove_invalid_api_keys(cls, api_keys: List[str]):
"""
移除无效的API密钥
"""
instance = cls.get_instance()
for key in api_keys:
instance.api_keys.remove(key)
@classmethod
def save_api_keys(cls):
"""
保存API密钥到文件
"""
instance = cls.get_instance()
with open(cls.api_file_path, "w") as f:
f.write("\n".join(instance.api_keys))
def __init__(self, env_var_name: str = "OPENAI_API_KEY", separator: str = ";"):
"""
初始化API密钥管理器
@@ -260,17 +183,15 @@ class APIKeyManager:
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
# 从文件中读取api_key
with open(self.api_file_path, "r") as f:
api_keys = f.readlines()
# 移除空白字符
api_keys = [key.strip() for key in api_keys if key.strip()]
return api_keys
def _get_next_api_key(self) -> Optional[str]:
"""
@@ -349,6 +270,19 @@ if __name__ == "__main__":
# 获取实例并查看使用统计
instance = APIKeyManager.get_instance()
stats = instance.get_usage_stats()
all_balance=0.0
buy_balance=16 * 10 * 14 # 购买16次,一次10条api_key,每个api_key有14元
invalid_api_keys = []
for key, data in stats.items():
usage_stats = APIKeyManager.get_key_usage_stats(key)
print(f"api key:{key}---赠送余额:{usage_stats['data']['balance']}")
all_balance+=float(usage_stats['data']['balance'])
print(f"api key:{key}---赠送余额:{usage_stats['data']['balance']}")
if float(usage_stats['data']['balance']) == 0:
invalid_api_keys.append(key)
print(f"剩余总赠送余额:{all_balance}元,累计消耗:{buy_balance-all_balance}")
print(f"无效的API密钥:{invalid_api_keys}")
print(f"开始移除无效的API密钥,并重新保存")
APIKeyManager.remove_invalid_api_keys(invalid_api_keys)
APIKeyManager.save_api_keys()
print(f"移除无效的API密钥,并重新保存完成")