mirror of
https://github.com/snailyp/gemini-balance.git
synced 2026-05-13 08:50:27 +08:00
- 为 Gemini 聊天(流式/非流式)、OpenAI 图像聊天(流式/非流式)和 embedding 服务的 API 调用实现全面的数据库日志记录。日志包括请求详情、成功/失败状态、状态码、延迟和错误消息。 - 重构 Gemini 流式聊天服务 (`stream_generate_content`) 以整合使用 `KeyManager` 的重试逻辑,与非流式实现保持一致,包括失败时的 API 密钥切换。 - 增强重试处理器 (`RetryHandler`) 的日志记录,以提高密钥切换和失败场景下的清晰度。 - 确保 `api_key` 正确传递给 OpenAI 图像聊天完成。 - 改进 embedding 服务中的错误处理,区分 `APIStatusError` 和通用异常,并将错误记录到数据库。 - 为 embedding 服务日志添加请求负载截断。 - 修复 Gemini `_build_payload` 中使用正确的 `model` 变量获取 `THINKING_BUDGET_MAP` 的错误。 - 移除 `ImageCreateService` 中未使用的 `paid_key` 类变量。
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
# app/services/chat/retry_handler.py
|
|
|
|
from functools import wraps
|
|
from typing import Callable, TypeVar
|
|
|
|
from app.core.constants import MAX_RETRIES
|
|
from app.log.logger import get_retry_logger
|
|
|
|
T = TypeVar("T")
|
|
logger = get_retry_logger()
|
|
|
|
|
|
class RetryHandler:
|
|
"""重试处理装饰器"""
|
|
|
|
def __init__(self, max_retries: int = MAX_RETRIES, key_arg: str = "api_key"):
|
|
self.max_retries = max_retries
|
|
self.key_arg = key_arg
|
|
|
|
def __call__(self, func: Callable[..., T]) -> Callable[..., T]:
|
|
@wraps(func)
|
|
async def wrapper(*args, **kwargs) -> T:
|
|
last_exception = None
|
|
|
|
for attempt in range(self.max_retries):
|
|
retries = attempt + 1
|
|
try:
|
|
return await func(*args, **kwargs)
|
|
except Exception as e:
|
|
last_exception = e
|
|
logger.warning(
|
|
f"API call failed with error: {str(e)}. Attempt {retries} of {self.max_retries}"
|
|
)
|
|
|
|
# 从函数参数中获取 key_manager
|
|
key_manager = kwargs.get("key_manager")
|
|
if key_manager:
|
|
old_key = kwargs.get(self.key_arg)
|
|
new_key = await key_manager.handle_api_failure(old_key, retries)
|
|
if new_key:
|
|
kwargs[self.key_arg] = new_key
|
|
logger.info(f"Switched to new API key: {new_key}")
|
|
else:
|
|
logger.error(f"No valid API key available after {retries} retries.")
|
|
break
|
|
|
|
logger.error(
|
|
f"All retry attempts failed, raising final exception: {str(last_exception)}"
|
|
)
|
|
raise last_exception
|
|
|
|
return wrapper
|