From 7ffb1859514279754b3dff346a69a3b5ea091f62 Mon Sep 17 00:00:00 2001 From: Chenyme <118253778+chenyme@users.noreply.github.com> Date: Wed, 17 Dec 2025 00:43:44 +0800 Subject: [PATCH] fix: retry error --- app/services/grok/cache.py | 9 +++++---- app/services/grok/client.py | 13 ++++++------- app/services/grok/create.py | 17 +++++++++-------- app/services/grok/token.py | 17 +++++++++-------- app/services/grok/upload.py | 17 +++++++++-------- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/app/services/grok/cache.py b/app/services/grok/cache.py index 51f6a58..95e86b1 100644 --- a/app/services/grok/cache.py +++ b/app/services/grok/cache.py @@ -64,7 +64,7 @@ class CacheService: retry_codes = setting.grok_config.get("retry_status_codes", [401, 429]) MAX_OUTER_RETRY = 3 - for outer_retry in range(MAX_OUTER_RETRY): + for outer_retry in range(MAX_OUTER_RETRY + 1): # +1 确保实际重试3次 try: # 内层重试:403代理池重试(cache使用缓存代理,不支持代理池,所以403只重试一次) max_403_retries = 5 @@ -105,9 +105,10 @@ class CacheService: # 检查可配置状态码错误 - 外层重试 if response.status_code in retry_codes: - if outer_retry < MAX_OUTER_RETRY - 1: - self._log("warning", f"遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY})...") - await asyncio.sleep(0.5) + if outer_retry < MAX_OUTER_RETRY: + delay = (outer_retry + 1) * 0.1 # 渐进延迟:0.1s, 0.2s, 0.3s + self._log("warning", f"遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY}),等待{delay}s...") + await asyncio.sleep(delay) break # 跳出内层循环,进入外层重试 else: self._log("error", f"{response.status_code}错误,已重试{outer_retry}次,放弃") diff --git a/app/services/grok/client.py b/app/services/grok/client.py index 888bbea..0403de7 100644 --- a/app/services/grok/client.py +++ b/app/services/grok/client.py @@ -234,20 +234,19 @@ class GrokClient: proxies=proxies ) - # 检查是否是403错误 - if response.status_code == 403: + # 内层403重试:仅当有代理池时触发 + if response.status_code == 403 and proxy_pool._enabled: retry_count += 1 - # 如果使用代理池且未达到最大重试次数,继续重试 - if proxy_pool._enabled and retry_count <= max_retries: + if retry_count <= max_retries: logger.warning(f"[Client] 遇到403错误,正在重试 ({retry_count}/{max_retries})...") - await asyncio.sleep(0.5) # 短暂延迟 + await asyncio.sleep(0.5) continue - # 达到最大重试次数或未使用代理池,抛出错误 + # 内层重试全部失败 logger.error(f"[Client] 403错误,已重试{retry_count-1}次,放弃") - GrokClient._handle_error(response, token) + # 检查响应状态 if response.status_code != 200: GrokClient._handle_error(response, token) diff --git a/app/services/grok/create.py b/app/services/grok/create.py index 2210165..3652bc3 100644 --- a/app/services/grok/create.py +++ b/app/services/grok/create.py @@ -55,7 +55,7 @@ class PostCreateManager: retry_codes = setting.grok_config.get("retry_status_codes", [401, 429]) MAX_OUTER_RETRY = 3 - for outer_retry in range(MAX_OUTER_RETRY): + for outer_retry in range(MAX_OUTER_RETRY + 1): # +1 确保实际重试3次 # 内层重试:403代理池重试 max_403_retries = 5 retry_403_count = 0 @@ -84,23 +84,24 @@ class PostCreateManager: proxies=proxies ) - # 检查403错误 - 内层重试 - if response.status_code == 403: + # 内层403重试:仅当有代理池时触发 + if response.status_code == 403 and proxy_pool._enabled: retry_403_count += 1 - if proxy_pool._enabled and retry_403_count <= max_403_retries: + if retry_403_count <= max_403_retries: logger.warning(f"[PostCreate] 遇到403错误,正在重试 ({retry_403_count}/{max_403_retries})...") await asyncio.sleep(0.5) continue + # 内层重试全部失败 logger.error(f"[PostCreate] 403错误,已重试{retry_403_count-1}次,放弃") - raise GrokApiException(f"创建失败: 403错误", "CREATE_ERROR") # 检查可配置状态码错误 - 外层重试 if response.status_code in retry_codes: - if outer_retry < MAX_OUTER_RETRY - 1: - logger.warning(f"[PostCreate] 遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY})...") - await asyncio.sleep(0.5) + if outer_retry < MAX_OUTER_RETRY: + delay = (outer_retry + 1) * 0.1 # 渐进延迟:0.1s, 0.2s, 0.3s + logger.warning(f"[PostCreate] 遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY}),等待{delay}s...") + await asyncio.sleep(delay) break # 跳出内层循环,进入外层重试 else: logger.error(f"[PostCreate] {response.status_code}错误,已重试{outer_retry}次,放弃") diff --git a/app/services/grok/token.py b/app/services/grok/token.py index 7911e34..80f2e98 100644 --- a/app/services/grok/token.py +++ b/app/services/grok/token.py @@ -323,7 +323,7 @@ class GrokTokenManager: retry_codes = setting.grok_config.get("retry_status_codes", [401, 429]) MAX_OUTER_RETRY = 3 - for outer_retry in range(MAX_OUTER_RETRY): + for outer_retry in range(MAX_OUTER_RETRY + 1): # +1 确保实际重试3次 # 内层重试:403代理池重试 max_403_retries = 5 retry_403_count = 0 @@ -351,26 +351,27 @@ class GrokTokenManager: proxies=proxies ) - # 检查403错误 - 内层重试 - if response.status_code == 403: + # 内层403重试:仅当有代理池时触发 + if response.status_code == 403 and proxy_pool._enabled: retry_403_count += 1 - if proxy_pool._enabled and retry_403_count <= max_403_retries: + if retry_403_count <= max_403_retries: logger.warning(f"[Token] 遇到403错误,正在重试 ({retry_403_count}/{max_403_retries})...") await asyncio.sleep(0.5) continue + # 内层重试全部失败 logger.error(f"[Token] 403错误,已重试{retry_403_count-1}次,放弃") sso = self._extract_sso(auth_token) if sso: await self.record_failure(auth_token, 403, "服务器被Block") - return None # 检查可配置状态码错误 - 外层重试 if response.status_code in retry_codes: - if outer_retry < MAX_OUTER_RETRY - 1: - logger.warning(f"[Token] 遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY})...") - await asyncio.sleep(0.5) + if outer_retry < MAX_OUTER_RETRY: + delay = (outer_retry + 1) * 0.1 # 渐进延迟:0.1s, 0.2s, 0.3s + logger.warning(f"[Token] 遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY}),等待{delay}s...") + await asyncio.sleep(delay) break # 跳出内层循环,进入外层重试 else: logger.error(f"[Token] {response.status_code}错误,已重试{outer_retry}次,放弃") diff --git a/app/services/grok/upload.py b/app/services/grok/upload.py index 4252b35..4d0c8b4 100644 --- a/app/services/grok/upload.py +++ b/app/services/grok/upload.py @@ -61,7 +61,7 @@ class ImageUploadManager: retry_codes = setting.grok_config.get("retry_status_codes", [401, 429]) MAX_OUTER_RETRY = 3 - for outer_retry in range(MAX_OUTER_RETRY): + for outer_retry in range(MAX_OUTER_RETRY + 1): # +1 确保实际重试3次 try: # 内层重试:403代理池重试 max_403_retries = 5 @@ -98,23 +98,24 @@ class ImageUploadManager: proxies=proxies, ) - # 检查403错误 - 内层重试 - if response.status_code == 403: + # 内层403重试:仅当有代理池时触发 + if response.status_code == 403 and proxy_pool._enabled: retry_403_count += 1 - if proxy_pool._enabled and retry_403_count <= max_403_retries: + if retry_403_count <= max_403_retries: logger.warning(f"[Upload] 遇到403错误,正在重试 ({retry_403_count}/{max_403_retries})...") await asyncio.sleep(0.5) continue + # 内层重试全部失败 logger.error(f"[Upload] 403错误,已重试{retry_403_count-1}次,放弃") - return "", "" # 检查可配置状态码错误 - 外层重试 if response.status_code in retry_codes: - if outer_retry < MAX_OUTER_RETRY - 1: - logger.warning(f"[Upload] 遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY})...") - await asyncio.sleep(0.5) + if outer_retry < MAX_OUTER_RETRY: + delay = (outer_retry + 1) * 0.1 # 渐进延迟:0.1s, 0.2s, 0.3s + logger.warning(f"[Upload] 遇到{response.status_code}错误,外层重试 ({outer_retry+1}/{MAX_OUTER_RETRY}),等待{delay}s...") + await asyncio.sleep(delay) break # 跳出内层循环,进入外层重试 else: logger.error(f"[Upload] {response.status_code}错误,已重试{outer_retry}次,放弃")