#!/usr/bin/env python3 """$0 live-фактчек слагов перед платными вызовами (гардрейл CLAUDE.md + правило двух направлений). GET /models у каждого провайдера, чьи слаги едут в этой сессии. Ничего не генерирует — только листинг. Ключи читает dotenv из eval/.env (сам файл сессия НЕ открывает). """ from __future__ import annotations import json import os import sys import urllib.request from pathlib import Path from dotenv import load_dotenv EVAL = Path(__file__).resolve().parents[1] load_dotenv(EVAL / ".env") TARGETS = [ ("deepseek", "https://api.deepseek.com/v1/models", "DEEPSEEK_API_KEY", ["deepseek-v4-flash", "deepseek-v4-pro"]), ("xai", "https://api.x.ai/v1/models", "XAI_API_KEY", ["grok-4.3"]), ] def main() -> int: out = {} for name, url, key_env, expect in TARGETS: key = os.environ.get(key_env) if not key: print(f"{name}: НЕТ КЛЮЧА {key_env}", file=sys.stderr) out[name] = {"error": f"no {key_env}"} continue req = urllib.request.Request(url, headers={"Authorization": f"Bearer {key}"}) try: with urllib.request.urlopen(req, timeout=60) as r: data = json.loads(r.read()) except Exception as e: # noqa: BLE001 — аномалия печатается, диагноз по вендор-доке print(f"{name}: ОШИБКА {e}", file=sys.stderr) out[name] = {"error": str(e)[:300]} continue ids = sorted(m.get("id", "") for m in data.get("data", [])) out[name] = {"ids": ids, "expected_present": {e: (e in ids) for e in expect}} print(f"{name}: {len(ids)} слаг(ов) → {ids}") for e in expect: print(f" {e}: {'ЖИВ' if e in ids else 'НЕТ В ЛИСТИНГЕ (не значит мёртв — алиас-урок)'}") (Path(__file__).resolve().parent / "slugcheck.json").write_text( json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8") return 0 if __name__ == "__main__": raise SystemExit(main())