chore: handle noisy log messages
This commit is contained in:
parent
858d127246
commit
2611d1bb6d
4 changed files with 71 additions and 27 deletions
|
|
@ -61,10 +61,23 @@ class Provider(ABC):
|
|||
"""Rotate active account/token if provider policy requires it."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def prepare_threshold(self) -> int:
|
||||
"""Usage percent when provider should prepare standby account/token."""
|
||||
return 100
|
||||
|
||||
@property
|
||||
def switch_threshold(self) -> int | None:
|
||||
"""Usage percent when provider may switch active account/token."""
|
||||
return None
|
||||
|
||||
def should_prepare_standby(self, usage_percent: int) -> bool:
|
||||
"""Whether standby preparation should be triggered for current usage."""
|
||||
return False
|
||||
|
||||
async def ensure_standby_account(
|
||||
self,
|
||||
usage_percent: int,
|
||||
prepare_threshold: int,
|
||||
) -> None:
|
||||
"""Prepare standby account/token asynchronously when needed."""
|
||||
return None
|
||||
|
|
|
|||
|
|
@ -43,6 +43,14 @@ class ChatGPTProvider(Provider):
|
|||
self.email_provider_factory = email_provider_factory or MailTmProvider
|
||||
self._token_write_lock = asyncio.Lock()
|
||||
|
||||
@property
|
||||
def prepare_threshold(self) -> int:
|
||||
return CHATGPT_PREPARE_THRESHOLD
|
||||
|
||||
@property
|
||||
def switch_threshold(self) -> int | None:
|
||||
return CHATGPT_SWITCH_THRESHOLD
|
||||
|
||||
async def _register_with_retries(self) -> bool:
|
||||
for attempt in range(1, CHATGPT_REGISTRATION_MAX_ATTEMPTS + 1):
|
||||
logger.info(
|
||||
|
|
@ -105,21 +113,23 @@ class ChatGPTProvider(Provider):
|
|||
|
||||
async def ensure_next_account(self) -> bool:
|
||||
next_tokens = load_next_tokens()
|
||||
if next_tokens and not next_tokens.is_expired:
|
||||
if next_tokens:
|
||||
return True
|
||||
|
||||
async with self._token_write_lock:
|
||||
next_tokens = load_next_tokens()
|
||||
if next_tokens and not next_tokens.is_expired:
|
||||
if next_tokens:
|
||||
return True
|
||||
return await self._create_next_account_under_lock()
|
||||
|
||||
def should_prepare_standby(self, usage_percent: int) -> bool:
|
||||
return usage_percent >= self.prepare_threshold and bool(load_next_tokens())
|
||||
|
||||
async def ensure_standby_account(
|
||||
self,
|
||||
usage_percent: int,
|
||||
prepare_threshold: int,
|
||||
) -> None:
|
||||
if usage_percent >= prepare_threshold:
|
||||
if self.should_prepare_standby(usage_percent):
|
||||
await self.ensure_next_account()
|
||||
|
||||
async def maybe_switch_active_account(self, usage_percent: int) -> bool:
|
||||
|
|
|
|||
|
|
@ -1,14 +1,9 @@
|
|||
import asyncio
|
||||
import logging
|
||||
import os
|
||||
|
||||
from aiohttp import web
|
||||
|
||||
from providers.chatgpt import ChatGPTProvider
|
||||
from providers.chatgpt.provider import (
|
||||
CHATGPT_PREPARE_THRESHOLD,
|
||||
CHATGPT_SWITCH_THRESHOLD,
|
||||
)
|
||||
from providers.base import Provider
|
||||
from utils.env import parse_int_env
|
||||
|
||||
|
|
@ -42,9 +37,17 @@ def build_limit(usage_percent: int, prepare_threshold: int) -> dict[str, int | b
|
|||
|
||||
|
||||
def get_prepare_threshold(provider_name: str) -> int:
|
||||
if provider_name == "chatgpt":
|
||||
return CHATGPT_PREPARE_THRESHOLD
|
||||
return 100
|
||||
provider = PROVIDERS.get(provider_name)
|
||||
if not provider:
|
||||
return 100
|
||||
return provider.prepare_threshold
|
||||
|
||||
|
||||
def should_trigger_standby_prepare(provider_name: str, usage_percent: int) -> bool:
|
||||
provider = PROVIDERS.get(provider_name)
|
||||
if not provider:
|
||||
return False
|
||||
return provider.should_prepare_standby(usage_percent)
|
||||
|
||||
|
||||
async def ensure_provider_token_ready(provider_name: str):
|
||||
|
|
@ -82,10 +85,13 @@ async def ensure_standby_task(provider_name: str, usage_percent: int, reason: st
|
|||
provider = PROVIDERS.get(provider_name)
|
||||
if not provider:
|
||||
return
|
||||
|
||||
if not provider.should_prepare_standby(usage_percent):
|
||||
return
|
||||
|
||||
try:
|
||||
logger.info("[%s] Preparing standby in background (%s)", provider_name, reason)
|
||||
threshold = get_prepare_threshold(provider_name)
|
||||
await provider.ensure_standby_account(usage_percent, threshold)
|
||||
await provider.ensure_standby_account(usage_percent)
|
||||
except Exception:
|
||||
logger.exception("[%s] Unhandled standby preparation error", provider_name)
|
||||
|
||||
|
|
@ -134,11 +140,11 @@ async def token_handler(request: web.Request) -> web.Response:
|
|||
logger.info("[%s] Active account switched before response", provider_name)
|
||||
|
||||
prepare_threshold = get_prepare_threshold(provider_name)
|
||||
if usage_percent >= prepare_threshold:
|
||||
if should_trigger_standby_prepare(provider_name, usage_percent):
|
||||
trigger_standby_prepare(
|
||||
provider_name,
|
||||
usage_percent,
|
||||
f"usage {usage_percent}% >= threshold {prepare_threshold}%",
|
||||
f"usage {usage_percent}% reached standby policy",
|
||||
)
|
||||
|
||||
remaining_percent = int(
|
||||
|
|
@ -209,8 +215,15 @@ def create_app() -> web.Application:
|
|||
|
||||
if __name__ == "__main__":
|
||||
logger.info("Starting token service on port %s", PORT)
|
||||
logger.info("ChatGPT prepare-next threshold: %s%%", CHATGPT_PREPARE_THRESHOLD)
|
||||
logger.info("ChatGPT switch threshold: %s%%", CHATGPT_SWITCH_THRESHOLD)
|
||||
chatgpt_provider = PROVIDERS.get("chatgpt")
|
||||
if chatgpt_provider:
|
||||
logger.info(
|
||||
"ChatGPT prepare-next threshold: %s%%", chatgpt_provider.prepare_threshold
|
||||
)
|
||||
if chatgpt_provider.switch_threshold is not None:
|
||||
logger.info(
|
||||
"ChatGPT switch threshold: %s%%", chatgpt_provider.switch_threshold
|
||||
)
|
||||
logger.info("Available providers: %s", ", ".join(PROVIDERS.keys()))
|
||||
app = create_app()
|
||||
web.run_app(app, host="0.0.0.0", port=PORT)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue