97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
"""Contract tests for the vendored models.dev snapshot lookups."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from opensquilla.provider import models_dev
|
|
from opensquilla.provider.models_dev import (
|
|
_snapshot_providers,
|
|
lookup_limits,
|
|
lookup_model,
|
|
)
|
|
|
|
|
|
def test_snapshot_loads_and_covers_registered_providers() -> None:
|
|
providers = _snapshot_providers()
|
|
assert providers, "vendored snapshot must load"
|
|
for expected in ("openrouter", "openai", "anthropic", "deepseek", "gemini", "zhipu"):
|
|
assert expected in providers, f"snapshot missing provider table: {expected}"
|
|
|
|
|
|
def test_provider_scoped_lookup_prefers_own_table() -> None:
|
|
entry = lookup_model("deepseek", "deepseek-v4-pro")
|
|
assert entry is not None
|
|
assert entry["ctx"] == 1_000_000
|
|
assert entry["out"] == 384_000
|
|
assert entry["reasoning"] is True
|
|
assert entry["tools"] is True
|
|
|
|
|
|
def test_basename_fallback_within_provider_table() -> None:
|
|
# OpenRouter spelling against the direct-provider table resolves via
|
|
# basename, so both spellings agree.
|
|
qualified = lookup_limits("deepseek", "deepseek/deepseek-v4-pro")
|
|
bare = lookup_limits("deepseek", "deepseek-v4-pro")
|
|
assert qualified == bare
|
|
|
|
|
|
def test_cross_provider_merge_is_conservative() -> None:
|
|
# No provider table for "" → merge across providers with per-dimension min.
|
|
merged = lookup_model("", "deepseek-v4-pro")
|
|
assert merged is not None
|
|
scoped_openrouter = lookup_model("openrouter", "deepseek/deepseek-v4-pro")
|
|
scoped_direct = lookup_model("deepseek", "deepseek-v4-pro")
|
|
assert scoped_openrouter is not None and scoped_direct is not None
|
|
assert merged["ctx"] <= min(scoped_openrouter["ctx"], scoped_direct["ctx"])
|
|
|
|
|
|
def test_case_insensitive_lookup() -> None:
|
|
# MiniMax publishes mixed-case ids; snapshot keys and lookups are lowercase.
|
|
assert lookup_model("minimax", "MiniMax-M2.5") is not None
|
|
|
|
|
|
def test_unknown_model_returns_none() -> None:
|
|
assert lookup_model("openai", "no-such-model-xyz") is None
|
|
assert lookup_limits("openai", "no-such-model-xyz") is None
|
|
assert lookup_model("", "") is None
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Optional per-Mtok cost keys (in/out/cr/cw_mtok). The committed snapshot
|
|
# does not carry them yet, so these drive synthetic tables.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
_COSTED_TABLES = {
|
|
"acme": {"model-a": {"ctx": 10_000, "out": 1_000, "tools": True, "in_mtok": 2.5}},
|
|
"other": {"model-a": {"ctx": 8_000, "out": 900, "tools": True, "in_mtok": 9.9}},
|
|
}
|
|
|
|
|
|
def test_provider_table_hit_passes_cost_keys_through(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
monkeypatch.setattr(models_dev, "_snapshot_providers", lambda: _COSTED_TABLES)
|
|
|
|
entry = lookup_model("acme", "model-a")
|
|
|
|
assert entry is not None
|
|
assert entry["in_mtok"] == 2.5
|
|
assert "out_mtok" not in entry # absent keys stay absent
|
|
|
|
|
|
def test_cross_provider_merge_drops_cost_keys(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
monkeypatch.setattr(models_dev, "_snapshot_providers", lambda: _COSTED_TABLES)
|
|
|
|
merged = lookup_model("unlisted-provider", "model-a")
|
|
|
|
assert merged is not None
|
|
# Limits still merge conservatively…
|
|
assert merged["ctx"] == 8_000
|
|
assert merged["out"] == 900
|
|
# …but another provider's pricing never survives the fallback merge.
|
|
assert "in_mtok" not in merged
|
|
assert "out_mtok" not in merged
|
|
assert "cr_mtok" not in merged
|
|
assert "cw_mtok" not in merged
|