Spaces:
Paused
Paused
Update openai_ondemand_adapter.py
Browse files- openai_ondemand_adapter.py +62 -11
openai_ondemand_adapter.py
CHANGED
@@ -33,12 +33,12 @@ app.before_request(check_private_key)
|
|
33 |
|
34 |
# ========== KEY池(每行一个)==========
|
35 |
ONDEMAND_APIKEYS = os.environ.get("ONDEMAND_APIKEYS", "").split(",") if os.environ.get("ONDEMAND_APIKEYS") else []
|
36 |
-
|
37 |
BAD_KEY_RETRY_INTERVAL = 600 # 秒
|
|
|
38 |
|
39 |
# ========== OnDemand模型映射 ==========
|
40 |
MODEL_MAP = {
|
41 |
-
"
|
42 |
"gpt-4o": "predefined-openai-gpt4o",
|
43 |
"gpt-4.1": "predefined-openai-gpt4.1",
|
44 |
"gpt-4.1-mini": "predefined-openai-gpt4.1-mini",
|
@@ -46,7 +46,7 @@ MODEL_MAP = {
|
|
46 |
"gpt-4o-mini": "predefined-openai-gpt4o-mini",
|
47 |
"deepseek-v3": "predefined-deepseek-v3",
|
48 |
"deepseek-r1": "predefined-deepseek-r1",
|
49 |
-
"claude-3
|
50 |
"gemini-2.0-flash": "predefined-gemini-2.0-flash",
|
51 |
}
|
52 |
DEFAULT_ONDEMAND_MODEL = "predefined-openai-gpt4o"
|
@@ -58,35 +58,69 @@ class KeyManager:
|
|
58 |
self.lock = threading.Lock()
|
59 |
self.key_status = {k: {"bad": False, "bad_ts": None} for k in self.key_list}
|
60 |
self.idx = 0
|
|
|
|
|
|
|
|
|
61 |
|
62 |
def display_key(self, key):
|
63 |
return f"{key[:6]}...{key[-4:]}"
|
64 |
|
65 |
def get(self):
|
66 |
with self.lock:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
total = len(self.key_list)
|
68 |
for _ in range(total):
|
69 |
key = self.key_list[self.idx]
|
70 |
self.idx = (self.idx + 1) % total
|
71 |
s = self.key_status[key]
|
72 |
if not s["bad"]:
|
73 |
-
print(f"
|
|
|
|
|
|
|
74 |
return key
|
75 |
if s["bad"] and s["bad_ts"]:
|
76 |
-
ago =
|
77 |
if ago >= BAD_KEY_RETRY_INTERVAL:
|
78 |
print(f"【KEY自动尝试恢复】API KEY: {self.display_key(key)} 满足重试周期,标记为正常")
|
79 |
self.key_status[key]["bad"] = False
|
80 |
self.key_status[key]["bad_ts"] = None
|
81 |
-
|
|
|
|
|
82 |
return key
|
|
|
83 |
print("【警告】全部KEY已被禁用,强制选用第一个KEY继续尝试:", self.display_key(self.key_list[0]))
|
84 |
for k in self.key_list:
|
85 |
self.key_status[k]["bad"] = False
|
86 |
self.key_status[k]["bad_ts"] = None
|
87 |
self.idx = 0
|
88 |
-
|
89 |
-
|
|
|
|
|
|
|
90 |
|
91 |
def mark_bad(self, key):
|
92 |
with self.lock:
|
@@ -94,6 +128,21 @@ class KeyManager:
|
|
94 |
print(f"【禁用KEY】API KEY: {self.display_key(key)},接口返回无效(将在{BAD_KEY_RETRY_INTERVAL//60}分钟后自动重试)")
|
95 |
self.key_status[key]["bad"] = True
|
96 |
self.key_status[key]["bad_ts"] = time.time()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
|
98 |
keymgr = KeyManager(ONDEMAND_APIKEYS)
|
99 |
|
@@ -155,7 +204,8 @@ def chat_completions():
|
|
155 |
if is_stream:
|
156 |
def generate():
|
157 |
def do_once(apikey):
|
158 |
-
|
|
|
159 |
url = f"{ONDEMAND_API_BASE}/sessions/{sid}/query"
|
160 |
payload = {
|
161 |
"query": user_msg,
|
@@ -213,7 +263,8 @@ def chat_completions():
|
|
213 |
return Response(generate(), content_type='text/event-stream')
|
214 |
|
215 |
def nonstream(apikey):
|
216 |
-
|
|
|
217 |
url = f"{ONDEMAND_API_BASE}/sessions/{sid}/query"
|
218 |
payload = {
|
219 |
"query": user_msg,
|
@@ -263,4 +314,4 @@ if __name__ == "__main__":
|
|
263 |
log_fmt = '[%(asctime)s] %(levelname)s: %(message)s'
|
264 |
logging.basicConfig(level=logging.INFO, format=log_fmt)
|
265 |
print("======== OnDemand KEY池数量:", len(ONDEMAND_APIKEYS), "========")
|
266 |
-
app.run(host="0.0.0.0", port=7860, debug=False)
|
|
|
33 |
|
34 |
# ========== KEY池(每行一个)==========
|
35 |
ONDEMAND_APIKEYS = os.environ.get("ONDEMAND_APIKEYS", "").split(",") if os.environ.get("ONDEMAND_APIKEYS") else []
|
|
|
36 |
BAD_KEY_RETRY_INTERVAL = 600 # 秒
|
37 |
+
SESSION_TIMEOUT = 600 # 对话超时时间(10分钟)
|
38 |
|
39 |
# ========== OnDemand模型映射 ==========
|
40 |
MODEL_MAP = {
|
41 |
+
"o3-mini": "predefined-openai-gpto3-mini",
|
42 |
"gpt-4o": "predefined-openai-gpt4o",
|
43 |
"gpt-4.1": "predefined-openai-gpt4.1",
|
44 |
"gpt-4.1-mini": "predefined-openai-gpt4.1-mini",
|
|
|
46 |
"gpt-4o-mini": "predefined-openai-gpt4o-mini",
|
47 |
"deepseek-v3": "predefined-deepseek-v3",
|
48 |
"deepseek-r1": "predefined-deepseek-r1",
|
49 |
+
"claude-3-7-sonnet": "predefined-claude-3.7-sonnet",
|
50 |
"gemini-2.0-flash": "predefined-gemini-2.0-flash",
|
51 |
}
|
52 |
DEFAULT_ONDEMAND_MODEL = "predefined-openai-gpt4o"
|
|
|
58 |
self.lock = threading.Lock()
|
59 |
self.key_status = {k: {"bad": False, "bad_ts": None} for k in self.key_list}
|
60 |
self.idx = 0
|
61 |
+
# 新增:当前正在使用的key和session
|
62 |
+
self.current_key = None
|
63 |
+
self.current_session = None
|
64 |
+
self.last_used_time = None
|
65 |
|
66 |
def display_key(self, key):
|
67 |
return f"{key[:6]}...{key[-4:]}"
|
68 |
|
69 |
def get(self):
|
70 |
with self.lock:
|
71 |
+
now = time.time()
|
72 |
+
# 检查对话是否超时
|
73 |
+
if self.current_key and self.last_used_time and (now - self.last_used_time > SESSION_TIMEOUT):
|
74 |
+
print(f"【对话超时】上次使用时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.last_used_time))}")
|
75 |
+
print(f"【对话超时】当前时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))}")
|
76 |
+
print(f"【对话超时】超时{SESSION_TIMEOUT//60}分钟,切换新会话")
|
77 |
+
self.current_key = None
|
78 |
+
self.current_session = None
|
79 |
+
|
80 |
+
# 如果已有正在使用的key,继续使用
|
81 |
+
if self.current_key:
|
82 |
+
if not self.key_status[self.current_key]["bad"]:
|
83 |
+
print(f"【对话请求】【继续使用API KEY: {self.display_key(self.current_key)}】【状态:正常】")
|
84 |
+
self.last_used_time = now
|
85 |
+
return self.current_key
|
86 |
+
else:
|
87 |
+
# 当前key已标记为异常,需要切换
|
88 |
+
self.current_key = None
|
89 |
+
self.current_session = None
|
90 |
+
|
91 |
+
# 如果没有当前key或当前key无效,选择新的key
|
92 |
total = len(self.key_list)
|
93 |
for _ in range(total):
|
94 |
key = self.key_list[self.idx]
|
95 |
self.idx = (self.idx + 1) % total
|
96 |
s = self.key_status[key]
|
97 |
if not s["bad"]:
|
98 |
+
print(f"【对话请求】【使用新API KEY: {self.display_key(key)}】【状态:正常】")
|
99 |
+
self.current_key = key
|
100 |
+
self.current_session = None # 强制创建新会话
|
101 |
+
self.last_used_time = now
|
102 |
return key
|
103 |
if s["bad"] and s["bad_ts"]:
|
104 |
+
ago = now - s["bad_ts"]
|
105 |
if ago >= BAD_KEY_RETRY_INTERVAL:
|
106 |
print(f"【KEY自动尝试恢复】API KEY: {self.display_key(key)} 满足重试周期,标记为正常")
|
107 |
self.key_status[key]["bad"] = False
|
108 |
self.key_status[key]["bad_ts"] = None
|
109 |
+
self.current_key = key
|
110 |
+
self.current_session = None # 强制创建新会话
|
111 |
+
self.last_used_time = now
|
112 |
return key
|
113 |
+
|
114 |
print("【警告】全部KEY已被禁用,强制选用第一个KEY继续尝试:", self.display_key(self.key_list[0]))
|
115 |
for k in self.key_list:
|
116 |
self.key_status[k]["bad"] = False
|
117 |
self.key_status[k]["bad_ts"] = None
|
118 |
self.idx = 0
|
119 |
+
self.current_key = self.key_list[0]
|
120 |
+
self.current_session = None # 强制创建新会话
|
121 |
+
self.last_used_time = now
|
122 |
+
print(f"【对话请求】【使用API KEY: {self.display_key(self.current_key)}】【状态:强制尝试(全部异常)】")
|
123 |
+
return self.current_key
|
124 |
|
125 |
def mark_bad(self, key):
|
126 |
with self.lock:
|
|
|
128 |
print(f"【禁用KEY】API KEY: {self.display_key(key)},接口返回无效(将在{BAD_KEY_RETRY_INTERVAL//60}分钟后自动重试)")
|
129 |
self.key_status[key]["bad"] = True
|
130 |
self.key_status[key]["bad_ts"] = time.time()
|
131 |
+
if self.current_key == key:
|
132 |
+
self.current_key = None
|
133 |
+
self.current_session = None
|
134 |
+
|
135 |
+
def get_session(self, apikey):
|
136 |
+
with self.lock:
|
137 |
+
if not self.current_session:
|
138 |
+
try:
|
139 |
+
self.current_session = create_session(apikey)
|
140 |
+
print(f"【创建新会话】SESSION ID: {self.current_session}")
|
141 |
+
except Exception as e:
|
142 |
+
print(f"【创建会话失败】错误: {str(e)}")
|
143 |
+
raise
|
144 |
+
self.last_used_time = time.time()
|
145 |
+
return self.current_session
|
146 |
|
147 |
keymgr = KeyManager(ONDEMAND_APIKEYS)
|
148 |
|
|
|
204 |
if is_stream:
|
205 |
def generate():
|
206 |
def do_once(apikey):
|
207 |
+
# 使用KeyManager获取或创建session
|
208 |
+
sid = keymgr.get_session(apikey)
|
209 |
url = f"{ONDEMAND_API_BASE}/sessions/{sid}/query"
|
210 |
payload = {
|
211 |
"query": user_msg,
|
|
|
263 |
return Response(generate(), content_type='text/event-stream')
|
264 |
|
265 |
def nonstream(apikey):
|
266 |
+
# 使用KeyManager获取或创建session
|
267 |
+
sid = keymgr.get_session(apikey)
|
268 |
url = f"{ONDEMAND_API_BASE}/sessions/{sid}/query"
|
269 |
payload = {
|
270 |
"query": user_msg,
|
|
|
314 |
log_fmt = '[%(asctime)s] %(levelname)s: %(message)s'
|
315 |
logging.basicConfig(level=logging.INFO, format=log_fmt)
|
316 |
print("======== OnDemand KEY池数量:", len(ONDEMAND_APIKEYS), "========")
|
317 |
+
app.run(host="0.0.0.0", port=7860, debug=False)
|