From 3919dfa3f4f6986c176ee3de3ded9131d7ce6626 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Thu, 28 May 2026 11:56:22 +0800 Subject: [PATCH] fix(metadata): suppress rate-limit propagation when model already confirmed deleted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When CivitAI returns 404 (ResourceNotFoundError) and a fallback provider like CivArchive subsequently rate-limits, the ChainedMetadataProvider now suppresses the RateLimitError instead of propagating it. Previously, the rate-limit error would bubble up through _refresh_single_model and cause the outer retry loop to re-process the same model repeatedly, producing dozens of duplicate "Model X is no longer available" log messages and wasting API quota. The model is NOT permanently marked as ignored — its last_checked_at timestamp is preserved, so it will be retried on the next refresh cycle when the rate limit has cleared and CivArchive may still have the data. Co-Authored-By: Claude Opus 4.7 --- py/services/model_metadata_provider.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/py/services/model_metadata_provider.py b/py/services/model_metadata_provider.py index b80f5d48..754a0696 100644 --- a/py/services/model_metadata_provider.py +++ b/py/services/model_metadata_provider.py @@ -5,7 +5,7 @@ import logging import random from typing import Optional, Dict, Tuple, Any, List, Sequence from .downloader import get_downloader -from .errors import RateLimitError +from .errors import RateLimitError, ResourceNotFoundError try: from bs4 import BeautifulSoup @@ -482,6 +482,7 @@ class FallbackMetadataProvider(ModelMetadataProvider): return None, "Model not found" async def get_model_versions(self, model_id: str) -> Optional[Dict]: + not_found_confirmed = False for provider, label in self._iter_providers(): try: result = await self._call_with_rate_limit( @@ -492,8 +493,24 @@ class FallbackMetadataProvider(ModelMetadataProvider): if result: return result except RateLimitError as exc: + if not_found_confirmed: + logger.debug( + "Suppressing rate limit from %s for model %s: " + "already confirmed as not found by another provider", + label, + model_id, + ) + return None exc.provider = exc.provider or label raise exc + except ResourceNotFoundError: + not_found_confirmed = True + logger.debug( + "Provider %s reports model %s as not found", + label, + model_id, + ) + continue except Exception as e: logger.debug("Provider %s failed for get_model_versions: %s", label, e) continue