llm-connect/tests/test_rates.py
tegwick 09aa1f3604
Some checks failed
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Has been cancelled
Implement LLM-WP-0007: Kimi K3 default and EUR spend reporting
Add moonshotai/kimi-k3 as OpenRouter basemodel default after live smoke,
USD→EUR cost conversion, append-only usage ledger, and CLI run/cost/spend
week commands with token and euro reporting.
2026-08-03 22:00:34 +02:00

68 lines
1.9 KiB
Python

import pytest
from llm_connect.rates import ModelRate, ModelRateRegistry
def test_default_registry_contains_openrouter_seed_models():
registry = ModelRateRegistry.default()
rates = registry.all()
assert len(rates) >= 10
assert rates["openai/gpt-4o-mini"].captured_at == "2026-05-17"
assert rates["openai/gpt-4o-mini"].source_url == "https://openrouter.ai/models"
assert rates["moonshotai/kimi-k3"].prompt_per_1k == 0.003
assert rates["moonshotai/kimi-k3"].completion_per_1k == 0.015
assert rates["moonshotai/kimi-k3"].captured_at == "2026-08-03"
def test_from_yaml_loads_package_shape(tmp_path):
path = tmp_path / "model-rates.yaml"
path.write_text(
"""
schema_version: 1
currency: USD
source_url: https://example.test/rates
captured_at: "2026-05-19"
rates:
vendor/model:
prompt_per_1k: 0.1
completion_per_1k: 0.2
""",
encoding="utf-8",
)
registry = ModelRateRegistry.from_yaml(path)
rate = registry.get("vendor/model")
assert rate == ModelRate(
model_id="vendor/model",
prompt_per_1k=0.1,
completion_per_1k=0.2,
currency="USD",
source_url="https://example.test/rates",
captured_at="2026-05-19",
)
def test_merged_with_overrides_matching_model():
base = ModelRateRegistry.default()
override = ModelRateRegistry(
{
"openai/gpt-4o-mini": ModelRate(
"openai/gpt-4o-mini",
prompt_per_1k=1,
completion_per_1k=2,
captured_at="override",
)
}
)
merged = base.merged_with(override)
assert merged.get("openai/gpt-4o-mini").prompt_per_1k == 1
assert merged.get("openai/gpt-4o-mini").captured_at == "override"
def test_negative_rates_are_rejected():
with pytest.raises(ValueError, match="prompt_per_1k"):
ModelRate("bad/model", prompt_per_1k=-1, completion_per_1k=0)