🐛 Bug: 1. Fix the bug of log errors being repeatedly displayed.
Browse files2. Fix the bug when the model list is empty.
💻 Code: Remove the redundant redirection code from the GPT model interface
- main.py +2 -4
- response.py +12 -40
- utils.py +13 -12
main.py
CHANGED
|
@@ -220,8 +220,6 @@ async def process_request(request: Union[RequestModel, ImageGenerationRequest],
|
|
| 220 |
|
| 221 |
return response
|
| 222 |
except (Exception, HTTPException, asyncio.CancelledError, httpx.ReadError) as e:
|
| 223 |
-
logger.error(f"Error with provider {provider['provider']}: {str(e)}")
|
| 224 |
-
|
| 225 |
# 更新失败计数
|
| 226 |
async with app.middleware_stack.app.lock:
|
| 227 |
app.middleware_stack.app.channel_failure_counts[provider['provider']] += 1
|
|
@@ -340,9 +338,9 @@ class ModelRequestHandler:
|
|
| 340 |
if provider['provider'] == provider_name:
|
| 341 |
new_matching_providers.append(provider)
|
| 342 |
matching_providers = new_matching_providers
|
| 343 |
-
# import json
|
| 344 |
-
# print("matching_providers", json.dumps(matching_providers, indent=4, ensure_ascii=False, default=circular_list_encoder))
|
| 345 |
|
|
|
|
|
|
|
| 346 |
use_round_robin = True
|
| 347 |
auto_retry = True
|
| 348 |
if safe_get(config, 'api_keys', api_index, "preferences", "USE_ROUND_ROBIN") == False:
|
|
|
|
| 220 |
|
| 221 |
return response
|
| 222 |
except (Exception, HTTPException, asyncio.CancelledError, httpx.ReadError) as e:
|
|
|
|
|
|
|
| 223 |
# 更新失败计数
|
| 224 |
async with app.middleware_stack.app.lock:
|
| 225 |
app.middleware_stack.app.channel_failure_counts[provider['provider']] += 1
|
|
|
|
| 338 |
if provider['provider'] == provider_name:
|
| 339 |
new_matching_providers.append(provider)
|
| 340 |
matching_providers = new_matching_providers
|
|
|
|
|
|
|
| 341 |
|
| 342 |
+
# import json
|
| 343 |
+
# print("matching_providers", json.dumps(matching_providers, indent=4, ensure_ascii=False, default=circular_list_encoder))
|
| 344 |
use_round_robin = True
|
| 345 |
auto_retry = True
|
| 346 |
if safe_get(config, 'api_keys', api_index, "preferences", "USE_ROUND_ROBIN") == False:
|
response.py
CHANGED
|
@@ -140,48 +140,20 @@ async def fetch_vertex_claude_response_stream(client, url, headers, payload, mod
|
|
| 140 |
yield "data: [DONE]\n\r\n"
|
| 141 |
|
| 142 |
async def fetch_gpt_response_stream(client, url, headers, payload, max_redirects=5):
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
error_message = await check_response(response, "fetch_gpt_response_stream")
|
| 148 |
-
if error_message:
|
| 149 |
-
yield error_message
|
| 150 |
-
return
|
| 151 |
-
|
| 152 |
-
buffer = ""
|
| 153 |
-
try:
|
| 154 |
-
async for chunk in response.aiter_text():
|
| 155 |
-
# logger.info(f"chunk: {repr(chunk)}")
|
| 156 |
-
buffer += chunk
|
| 157 |
-
if chunk.startswith("<script"):
|
| 158 |
-
import re
|
| 159 |
-
redirect_match = re.search(r"window\.location\.href\s*=\s*'([^']+)'", chunk)
|
| 160 |
-
if redirect_match:
|
| 161 |
-
new_url = redirect_match.group(1)
|
| 162 |
-
# logger.info(f"new_url: {new_url}")
|
| 163 |
-
if not new_url.startswith('http'):
|
| 164 |
-
# 如果是相对路径,构造完整URL
|
| 165 |
-
# logger.info(url.split('/'))
|
| 166 |
-
base_url = '/'.join(url.split('/')[:3])
|
| 167 |
-
new_url = base_url + new_url
|
| 168 |
-
url = new_url
|
| 169 |
-
# logger.info(f"new_url: {new_url}")
|
| 170 |
-
redirect_count += 1
|
| 171 |
-
break
|
| 172 |
-
redirect_count = 0
|
| 173 |
-
while "\n" in buffer:
|
| 174 |
-
line, buffer = buffer.split("\n", 1)
|
| 175 |
-
# logger.info("line: %s", repr(line))
|
| 176 |
-
if line and line != "data: " and line != "data:" and not line.startswith(": "):
|
| 177 |
-
yield line.strip() + "\n\r\n"
|
| 178 |
-
except httpx.RemoteProtocolError as e:
|
| 179 |
-
yield {"error": f"fetch_gpt_response_stream RemoteProtocolError {e.__class__.__name__}", "details": str(e)}
|
| 180 |
-
return
|
| 181 |
-
if redirect_count == 0:
|
| 182 |
return
|
| 183 |
|
| 184 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 185 |
|
| 186 |
async def fetch_claude_response_stream(client, url, headers, payload, model):
|
| 187 |
timestamp = datetime.timestamp(datetime.now())
|
|
|
|
| 140 |
yield "data: [DONE]\n\r\n"
|
| 141 |
|
| 142 |
async def fetch_gpt_response_stream(client, url, headers, payload, max_redirects=5):
|
| 143 |
+
async with client.stream('POST', url, headers=headers, json=payload) as response:
|
| 144 |
+
error_message = await check_response(response, "fetch_gpt_response_stream")
|
| 145 |
+
if error_message:
|
| 146 |
+
yield error_message
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
return
|
| 148 |
|
| 149 |
+
buffer = ""
|
| 150 |
+
async for chunk in response.aiter_text():
|
| 151 |
+
buffer += chunk
|
| 152 |
+
while "\n" in buffer:
|
| 153 |
+
line, buffer = buffer.split("\n", 1)
|
| 154 |
+
# logger.info("line: %s", repr(line))
|
| 155 |
+
if line and line != "data: " and line != "data:" and not line.startswith(": "):
|
| 156 |
+
yield line.strip() + "\n\r\n"
|
| 157 |
|
| 158 |
async def fetch_claude_response_stream(client, url, headers, payload, model):
|
| 159 |
timestamp = datetime.timestamp(datetime.now())
|
utils.py
CHANGED
|
@@ -29,18 +29,19 @@ def update_config(config_data):
|
|
| 29 |
for index, api_key in enumerate(config_data['api_keys']):
|
| 30 |
weights_dict = {}
|
| 31 |
models = []
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
|
|
|
| 44 |
|
| 45 |
api_list = [item["api"] for item in api_keys_db]
|
| 46 |
# logger.info(json.dumps(config_data, indent=4, ensure_ascii=False, default=circular_list_encoder))
|
|
|
|
| 29 |
for index, api_key in enumerate(config_data['api_keys']):
|
| 30 |
weights_dict = {}
|
| 31 |
models = []
|
| 32 |
+
if api_key.get('model'):
|
| 33 |
+
for model in api_key.get('model'):
|
| 34 |
+
if isinstance(model, dict):
|
| 35 |
+
key, value = list(model.items())[0]
|
| 36 |
+
provider_name = key.split("/")[0]
|
| 37 |
+
if "/" in key:
|
| 38 |
+
weights_dict.update({provider_name: int(value)})
|
| 39 |
+
models.append(key)
|
| 40 |
+
if isinstance(model, str):
|
| 41 |
+
models.append(model)
|
| 42 |
+
config_data['api_keys'][index]['weights'] = weights_dict
|
| 43 |
+
config_data['api_keys'][index]['model'] = models
|
| 44 |
+
api_keys_db[index]['model'] = models
|
| 45 |
|
| 46 |
api_list = [item["api"] for item in api_keys_db]
|
| 47 |
# logger.info(json.dumps(config_data, indent=4, ensure_ascii=False, default=circular_list_encoder))
|