import os, time, logging
from datetime import datetime, timezone
from dataclasses import dataclass
import requests
from openai import OpenAI, APIError, APITimeoutError
log = logging.getLogger("openrouter.health")
@dataclass
class HealthStatus:
model: str
available: bool
latency_ms: float
checked_at: str
error: str = ""
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
timeout=15.0,
default_headers={"HTTP-Referer": "https://my-app.com", "X-Title": "health-check"},
)
def probe_model(model_id: str) -> HealthStatus:
"""Send a minimal request to test model availability."""
start = time.monotonic()
try:
response = client.chat.completions.create(
model=model_id,
messages=[{"role": "user", "content": "hi"}],
max_tokens=1,
)
latency = (time.monotonic() - start) * 1000
return HealthStatus(
model=model_id, available=True, latency_ms=round(latency, 1),
checked_at=datetime.now(timezone.utc).isoformat(),
)
except (APIError, APITimeoutError) as e:
latency = (time.monotonic() - start) * 1000
return HealthStatus(
model=model_id, available=False, latency_ms=round(latency, 1),
checked_at=datetime.now(timezone.utc).isoformat(),
error=str(e),
)
def check_critical_models() -> list[HealthStatus]:
"""Probe all critical models."""
CRITICAL_MODELS = [
"anthropic/claude-3.5-sonnet",
"openai/gpt-4o",
"openai/gpt-4o-mini",
"google/gemini-2.0-flash-001",
]
results = []
for model in CRITICAL_MODELS:
status = probe_model(model)
log.info(f"{'OK' if status.available else 'FAIL'} {model} ({status.latency_ms}ms)")
results.append(status)
return results
def check_model_exists(model_id: str) -> dict:
"""Check if a model exists in the catalog (no API call cost)."""
resp = requests.get("https://openrouter.ai/api/v1/models")
models = {m["id"]: m for m in resp.json()["data"]}
if model_id in models:
m = models[model_id]
return {
"exists": True,
"context_length": m["context_length"],
"pricing": m["pricing"],
}
return {"exists": False, "suggestion": find_similar(model_id, models)}
def find_similar(model_id: str, models: dict) -> list[str]:
"""Find models with similar names (for migration when model is removed)."""
prefix = model_id.split("/")[0]
return [m for m in models if m.startswith(prefix)][:5]
#!/bin/bash
MODELS=("anthropic/claude-3.5-sonnet" "openai/gpt-4o" "openai/gpt-4o-mini")
LOG_FILE="/var/log/openrouter-health.log"
for MODEL in "${MODELS[@]}"; do
START=$(date +%s%N)
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"ping\"}],\"max_tokens\":1}" \
--max-time 15)
END=$(date +%s%N)
LATENCY=$(( (END - START) / 1000000 ))
STATUS="OK"
[ "$HTTP_CODE" != "200" ] && STATUS="FAIL"
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) $STATUS $MODEL $HTTP_CODE ${LATENCY}ms" >> "$LOG_FILE"
done
Then run the Python health sweep — run_health_checks() in references/examples.md prints [OK] anthropic/claude-3.5-sonnet: 842.3ms per model, a 3/3 models healthy summary, and the mapped fallback (e.g. openai/gpt-4-turbo) for any failure. More worked examples: references/examples.md.