75 lines
2.0 KiB
Python
Executable File
75 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""CI check: ensure no duplicate model IDs exist in provider configs.
|
|
|
|
Catches the class of bugs where a rename introduces a duplicate entry
|
|
(e.g. PR #225 kimi-for-coding -> kimi-k2.5 when kimi-k2.5 already existed).
|
|
|
|
Runtime target: < 2 seconds.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Allow running from repo root
|
|
REPO_ROOT = Path(__file__).parent.parent
|
|
sys.path.insert(0, str(REPO_ROOT))
|
|
|
|
|
|
def check_openrouter_models() -> list[str]:
|
|
"""Check OPENROUTER_MODELS for duplicate model IDs."""
|
|
try:
|
|
from hermes_cli.models import OPENROUTER_MODELS
|
|
except ImportError:
|
|
return []
|
|
|
|
errors = []
|
|
seen: dict[str, int] = {}
|
|
for i, (model_id, _desc) in enumerate(OPENROUTER_MODELS):
|
|
if model_id in seen:
|
|
errors.append(
|
|
f" OPENROUTER_MODELS: duplicate '{model_id}' "
|
|
f"(index {seen[model_id]} and {i})"
|
|
)
|
|
else:
|
|
seen[model_id] = i
|
|
return errors
|
|
|
|
|
|
def check_provider_models() -> list[str]:
|
|
"""Check _PROVIDER_MODELS for duplicate model IDs within each provider list."""
|
|
from hermes_cli.models import _PROVIDER_MODELS
|
|
|
|
errors = []
|
|
for provider, models in _PROVIDER_MODELS.items():
|
|
seen: dict[str, int] = {}
|
|
for i, model_id in enumerate(models):
|
|
if model_id in seen:
|
|
errors.append(
|
|
f" _PROVIDER_MODELS['{provider}']: duplicate '{model_id}' "
|
|
f"(index {seen[model_id]} and {i})"
|
|
)
|
|
else:
|
|
seen[model_id] = i
|
|
return errors
|
|
|
|
|
|
def main() -> int:
|
|
errors = []
|
|
errors.extend(check_openrouter_models())
|
|
errors.extend(check_provider_models())
|
|
|
|
if errors:
|
|
print(f"FAIL: {len(errors)} duplicate model(s) found:")
|
|
for e in errors:
|
|
print(e)
|
|
return 1
|
|
|
|
print("OK: no duplicate model entries")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|