# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca """`av providers-check`: list the models each vendor exposes through /v1/models (official SDKs) and verify that every id in configs/models.yaml exists. Keys are read from the environment only; nothing is printed except model ids and booleans.""" from __future__ import annotations import os from typing import Any from ..config import load_config def _anthropic_models() -> list[str] | str: if not os.environ.get("ANTHROPIC_API_KEY"): return "ANTHROPIC_API_KEY not set" try: import anthropic client = anthropic.Anthropic() ids: list[str] = [] page = client.models.list(limit=100) for m in page: ids.append(m.id) return sorted(ids) except Exception as e: return f"{type(e).__name__}: {str(e)[:200]}" def _openai_models() -> list[str] | str: if not os.environ.get("OPENAI_API_KEY"): return "OPENAI_API_KEY not set" try: from openai import OpenAI client = OpenAI() return sorted(m.id for m in client.models.list()) except Exception as e: return f"{type(e).__name__}: {str(e)[:200]}" def check() -> dict[str, Any]: cfg = load_config("models") listed = {"anthropic": _anthropic_models(), "openai": _openai_models()} report: dict[str, Any] = {"vendors": {}, "configured": {}, "all_configured_found": True} for vendor, res in listed.items(): report["vendors"][vendor] = {"ok": isinstance(res, list), "n_models": (len(res) if isinstance(res, list) else 0), "error": (None if isinstance(res, list) else res)} for mid, info in cfg["models"].items(): vendor = info["provider"] res = listed.get(vendor) found = (mid in res) if isinstance(res, list) else None report["configured"][mid] = {"provider": vendor, "tier": info.get("tier"), "found": found} if found is False: report["all_configured_found"] = False for tier, pair in cfg["cost_matched_pairs"].items(): for vendor, mid in pair.items(): if mid not in cfg["models"]: report["all_configured_found"] = False report["configured"][mid] = {"provider": vendor, "tier": tier, "found": None, "error": "pair model not registered in models:"} return report def print_report(report: dict[str, Any]) -> None: for vendor, v in report["vendors"].items(): print(f"{vendor:10s} {'OK' if v['ok'] else 'UNAVAILABLE'} models listed: {v['n_models']}{(' (' + v['error'] + ')') if v['error'] else ''}") for mid, info in report["configured"].items(): state = {True: "found", False: "MISSING", None: "unchecked"}[info["found"]] print(f" {mid:22s} {info['provider']:10s} {str(info.get('tier')):9s} {state}") print("all configured ids found:", report["all_configured_found"])