""" وضعیتِ provider هوش مصنوعی (GapGPT): «کار می‌کند» یا «اعتبار تمام شده». چرا لازم است: ۲۰۲۶-۰۹-۲۵ اعتبارِ GapGPT تمام شد و دستیار برای همه‌ی کاربرها ۵۰۳ داد («دستیار الان در دسترس نیست»)، در حالی که /api/health همچنان `openai: true` نشان می‌داد — چون فقط «کلید تنظیم شده» را می‌دید. تنها راهِ فهمیدنش خواندنِ لاگِ سرور بود. حالا هر گذار (ok → quota_exhausted و برعکس) یک ردیف در statuslog می‌شود: همه‌ی workerها آن را می‌بینند (کشِ LocMem این‌طور نیست) و /api/health گزارشش می‌کند. فقط گذار ثبت می‌شود، نه هر درخواست. """ import logging from django.core.cache import cache logger = logging.getLogger(__name__) LABEL = 'ai_tutor.Provider' OK = 'ok' EXHAUSTED = 'quota_exhausted' _CACHE_KEY = 'ai_tutor:provider_state' def current_state() -> str: state = cache.get(_CACHE_KEY) if state is None: from statuslog.models import StatusChangeLog state = ( StatusChangeLog.objects.filter(label=LABEL) .values_list('new_status', flat=True).first() ) or OK cache.set(_CACHE_KEY, state, 60) return state def _transition(new_state: str, event: str) -> None: from statuslog.signals import status_changed old_state = current_state() if old_state == new_state: return status_changed.send(sender=LABEL, object_id=0, old_status=old_state, new_status=new_state, event=event) cache.set(_CACHE_KEY, new_state, 60) def record_failure(exc) -> None: """خطای provider؛ فقط تمام‌شدنِ اعتبار/سقفِ حساب وضعیت را عوض می‌کند.""" from rag.services.clients import is_account_limit try: if is_account_limit(exc): _transition(EXHAUSTED, 'provider_account_limit') except Exception: # noqa: BLE001 — گزارش‌دهی نباید پاسخِ ۵۰۳ را خراب کند logger.exception('provider_status: ثبتِ خطا شکست خورد') def record_success() -> None: try: if current_state() != OK: _transition(OK, 'provider_recovered') except Exception: # noqa: BLE001 logger.exception('provider_status: ثبتِ بازگشت شکست خورد')