from collections import Counter from aiatlas.connectors.providers.openrouter import OpenRouterConnector, _display_name, _per_mtok from aiatlas.sdk.facts import Target from tests.conftest import claims_of, extract_from_fixture, fixture_path async def test_catalogue(): c = OpenRouterConnector() target = Target(url="https://openrouter.ai/api/v1/models", doc_type="catalogue", key="models") facts = await extract_from_fixture(c, target, fixture_path("openrouter", "models.json"), content_type="application/json") models = [e for e in facts.entities if e.entity_type == "model"] assert len(models) >= 300 and not any(e.identifiers.get("openrouter", "").startswith("~") for e in models) # alias rows skipped assert len(facts.prices) >= 150 sonnet = next(p for p in facts.prices if p.provider_model_id == "anthropic/claude-sonnet-4.5") assert sonnet.model.name == "Claude Sonnet 4.5" and sonnet.model.organization.name == "Anthropic" # routed prices are OpenRouter's rows: booked on the aggregator only, the routed lab is a feature (never a second "current" price on its own provider) assert sonnet.provider.name == "OpenRouter" and sonnet.features["via"] == "openrouter" and sonnet.features["upstream_provider"] == "anthropic" assert sonnet.features["upstream_vendor"] == "anthropic" assert (sonnet.input_per_mtok, sonnet.output_per_mtok, sonnet.cached_input_per_mtok) == (3.0, 15.0, 0.3) # per-token strings × 1e6 assert sonnet.model.identifiers == {"openrouter": "anthropic/claude-sonnet-4.5"} and "claude-sonnet-4.5" in sonnet.model.aliases assert "anthropic_model_id" not in sonnet.model.identifiers # OpenRouter slugs ≠ vendor API ids assert sonnet.model.family is not None and sonnet.model.family.name == "Claude" and sonnet.model.identity_confidence == "medium" claims = claims_of(facts, "Claude Sonnet 4.5") assert claims["context_length"] == 1_000_000 and claims["max_output_tokens"] == 64000 assert claims["openrouter_listed_at"] == "2025-09-29" and "release_date" not in claims # listing date is not a release date assert claims["modalities_input"] == ["document", "image", "text"] and claims["file_input"] is True # "file" → document (ontology) assert "tools" in claims["supported_parameters"] and claims["tool_calling"] is True by_provider = Counter(p.provider.name for p in facts.prices) assert set(by_provider) == {"OpenRouter"} and by_provider["OpenRouter"] >= 150 # every routed price belongs to OpenRouter upstream = Counter(p.features.get("upstream_provider") for p in facts.prices) assert upstream["openai"] >= 50 and upstream[None] >= 50 # unknown vendors carry no upstream provider variant = next(p for p in facts.prices if ":" in (p.provider_model_id or "")) assert "variant" in variant.features and ":" not in variant.model.identifiers["openrouter"] # variants share the model identity assert not any(p.input_per_mtok is not None and p.input_per_mtok < 0 for p in facts.prices) # dynamic "-1" prices skipped assert any("hf_repo" in e.identifiers for e in models) assert not any(c.property == "release_date" for c in facts.claims) # OpenRouter's own routers are products, never models assert not any(e.identifiers.get("openrouter", "").startswith("openrouter/") for e in models) routers = [e for e in facts.entities if e.entity_type == "product"] assert {e.identifiers["openrouter"] for e in routers} >= {"openrouter/auto", "openrouter/pareto-code", "openrouter/free"} auto = next(e for e in routers if e.identifiers["openrouter"] == "openrouter/auto") assert auto.name == "Auto Router" and auto.attributes == {"kind": "router"} and auto.organization.name == "OpenRouter" assert any(r.predicate == "operates" and r.object is auto for r in facts.relations) assert not any(p.provider_model_id == "openrouter/auto" for p in facts.prices) # dynamic (-1) price skipped free = next(p for p in facts.prices if p.provider_model_id == "openrouter/free") assert free.model.entity_type == "product" and free.input_per_mtok == 0.0 def test_helpers(): assert _display_name("Anthropic: Claude Sonnet 4.5", "anthropic") == "Claude Sonnet 4.5" assert _display_name("Sakana: Something", "sakana") == "Something" assert _per_mtok("0.000003") == 3.0 and _per_mtok("-1") == -1.0 and _per_mtok(None) is None