💻 Code: Optimize log display: add error provider name display.
Browse files
main.py
CHANGED
|
@@ -706,7 +706,8 @@ async def process_request(request: Union[RequestModel, ImageGenerationRequest, A
|
|
| 706 |
if provider.get("engine"):
|
| 707 |
engine = provider["engine"]
|
| 708 |
|
| 709 |
-
|
|
|
|
| 710 |
|
| 711 |
url, headers, payload = await get_payload(request, engine, provider)
|
| 712 |
if is_debug:
|
|
@@ -738,11 +739,11 @@ async def process_request(request: Union[RequestModel, ImageGenerationRequest, A
|
|
| 738 |
async with app.state.client_manager.get_client(timeout_value) as client:
|
| 739 |
if request.stream:
|
| 740 |
generator = fetch_response_stream(client, url, headers, payload, engine, original_model)
|
| 741 |
-
wrapped_generator, first_response_time = await error_handling_wrapper(generator)
|
| 742 |
response = StarletteStreamingResponse(wrapped_generator, media_type="text/event-stream")
|
| 743 |
else:
|
| 744 |
generator = fetch_response(client, url, headers, payload, engine, original_model)
|
| 745 |
-
wrapped_generator, first_response_time = await error_handling_wrapper(generator)
|
| 746 |
first_element = await anext(wrapped_generator)
|
| 747 |
first_element = first_element.lstrip("data: ")
|
| 748 |
# print("first_element", first_element)
|
|
@@ -751,14 +752,14 @@ async def process_request(request: Union[RequestModel, ImageGenerationRequest, A
|
|
| 751 |
# response = JSONResponse(first_element)
|
| 752 |
|
| 753 |
# 更新成功计数和首次响应时间
|
| 754 |
-
await update_channel_stats(current_info["request_id"],
|
| 755 |
current_info["first_response_time"] = first_response_time
|
| 756 |
current_info["success"] = True
|
| 757 |
-
current_info["provider"] =
|
| 758 |
return response
|
| 759 |
|
| 760 |
except (Exception, HTTPException, asyncio.CancelledError, httpx.ReadError, httpx.RemoteProtocolError, httpx.ReadTimeout) as e:
|
| 761 |
-
await update_channel_stats(current_info["request_id"],
|
| 762 |
raise e
|
| 763 |
|
| 764 |
def weighted_round_robin(weights):
|
|
|
|
| 706 |
if provider.get("engine"):
|
| 707 |
engine = provider["engine"]
|
| 708 |
|
| 709 |
+
channel_id = f"{provider['provider']}"
|
| 710 |
+
logger.info(f"provider: {channel_id:<11} model: {request.model:<22} engine: {engine}")
|
| 711 |
|
| 712 |
url, headers, payload = await get_payload(request, engine, provider)
|
| 713 |
if is_debug:
|
|
|
|
| 739 |
async with app.state.client_manager.get_client(timeout_value) as client:
|
| 740 |
if request.stream:
|
| 741 |
generator = fetch_response_stream(client, url, headers, payload, engine, original_model)
|
| 742 |
+
wrapped_generator, first_response_time = await error_handling_wrapper(generator, channel_id)
|
| 743 |
response = StarletteStreamingResponse(wrapped_generator, media_type="text/event-stream")
|
| 744 |
else:
|
| 745 |
generator = fetch_response(client, url, headers, payload, engine, original_model)
|
| 746 |
+
wrapped_generator, first_response_time = await error_handling_wrapper(generator, channel_id)
|
| 747 |
first_element = await anext(wrapped_generator)
|
| 748 |
first_element = first_element.lstrip("data: ")
|
| 749 |
# print("first_element", first_element)
|
|
|
|
| 752 |
# response = JSONResponse(first_element)
|
| 753 |
|
| 754 |
# 更新成功计数和首次响应时间
|
| 755 |
+
await update_channel_stats(current_info["request_id"], channel_id, request.model, current_info["api_key"], success=True)
|
| 756 |
current_info["first_response_time"] = first_response_time
|
| 757 |
current_info["success"] = True
|
| 758 |
+
current_info["provider"] = channel_id
|
| 759 |
return response
|
| 760 |
|
| 761 |
except (Exception, HTTPException, asyncio.CancelledError, httpx.ReadError, httpx.RemoteProtocolError, httpx.ReadTimeout) as e:
|
| 762 |
+
await update_channel_stats(current_info["request_id"], channel_id, request.model, current_info["api_key"], success=False)
|
| 763 |
raise e
|
| 764 |
|
| 765 |
def weighted_round_robin(weights):
|
utils.py
CHANGED
|
@@ -405,7 +405,7 @@ def ensure_string(item):
|
|
| 405 |
|
| 406 |
import asyncio
|
| 407 |
import time as time_module
|
| 408 |
-
async def error_handling_wrapper(generator):
|
| 409 |
start_time = time_module.time()
|
| 410 |
try:
|
| 411 |
first_item = await generator.__anext__()
|
|
@@ -418,18 +418,18 @@ async def error_handling_wrapper(generator):
|
|
| 418 |
if first_item_str.startswith("data:"):
|
| 419 |
first_item_str = first_item_str.lstrip("data: ")
|
| 420 |
if first_item_str.startswith("[DONE]"):
|
| 421 |
-
logger.error("error_handling_wrapper [DONE]!")
|
| 422 |
raise StopAsyncIteration
|
| 423 |
if "The bot's usage is covered by the developer" in first_item_str:
|
| 424 |
-
logger.error("error const string: %s", first_item_str)
|
| 425 |
raise StopAsyncIteration
|
| 426 |
if "process this request due to overload or policy" in first_item_str:
|
| 427 |
-
logger.error("error const string: %s", first_item_str)
|
| 428 |
raise StopAsyncIteration
|
| 429 |
try:
|
| 430 |
first_item_str = json.loads(first_item_str)
|
| 431 |
except json.JSONDecodeError:
|
| 432 |
-
logger.error("error_handling_wrapper JSONDecodeError!
|
| 433 |
raise StopAsyncIteration
|
| 434 |
if isinstance(first_item_str, dict) and 'error' in first_item_str:
|
| 435 |
# 如果第一个 yield 的项是错误信息,抛出 HTTPException
|
|
@@ -445,11 +445,11 @@ async def error_handling_wrapper(generator):
|
|
| 445 |
yield ensure_string(item)
|
| 446 |
except asyncio.CancelledError:
|
| 447 |
# 客户端断开连接是正常行为,不需要记录错误日志
|
| 448 |
-
logger.debug("Stream cancelled by client")
|
| 449 |
return
|
| 450 |
except (httpx.ReadError, httpx.RemoteProtocolError) as e:
|
| 451 |
# 只记录真正的网络错误
|
| 452 |
-
logger.error(f"Network error in new_generator: {e}")
|
| 453 |
raise
|
| 454 |
|
| 455 |
return new_generator(), first_response_time
|
|
|
|
| 405 |
|
| 406 |
import asyncio
|
| 407 |
import time as time_module
|
| 408 |
+
async def error_handling_wrapper(generator, channel_id):
|
| 409 |
start_time = time_module.time()
|
| 410 |
try:
|
| 411 |
first_item = await generator.__anext__()
|
|
|
|
| 418 |
if first_item_str.startswith("data:"):
|
| 419 |
first_item_str = first_item_str.lstrip("data: ")
|
| 420 |
if first_item_str.startswith("[DONE]"):
|
| 421 |
+
logger.error(f"provider: {channel_id:<11} error_handling_wrapper [DONE]!")
|
| 422 |
raise StopAsyncIteration
|
| 423 |
if "The bot's usage is covered by the developer" in first_item_str:
|
| 424 |
+
logger.error(f"provider: {channel_id:<11} error const string: %s", first_item_str)
|
| 425 |
raise StopAsyncIteration
|
| 426 |
if "process this request due to overload or policy" in first_item_str:
|
| 427 |
+
logger.error(f"provider: {channel_id:<11} error const string: %s", first_item_str)
|
| 428 |
raise StopAsyncIteration
|
| 429 |
try:
|
| 430 |
first_item_str = json.loads(first_item_str)
|
| 431 |
except json.JSONDecodeError:
|
| 432 |
+
logger.error(f"provider: {channel_id:<11} error_handling_wrapper JSONDecodeError! {repr(first_item_str)}")
|
| 433 |
raise StopAsyncIteration
|
| 434 |
if isinstance(first_item_str, dict) and 'error' in first_item_str:
|
| 435 |
# 如果第一个 yield 的项是错误信息,抛出 HTTPException
|
|
|
|
| 445 |
yield ensure_string(item)
|
| 446 |
except asyncio.CancelledError:
|
| 447 |
# 客户端断开连接是正常行为,不需要记录错误日志
|
| 448 |
+
logger.debug(f"provider: {channel_id:<11} Stream cancelled by client")
|
| 449 |
return
|
| 450 |
except (httpx.ReadError, httpx.RemoteProtocolError) as e:
|
| 451 |
# 只记录真正的网络错误
|
| 452 |
+
logger.error(f"provider: {channel_id:<11} Network error in new_generator: {e}")
|
| 453 |
raise
|
| 454 |
|
| 455 |
return new_generator(), first_response_time
|