Source code for ractogateway.routing._models

"""Data models for the cost-aware routing subsystem."""

from __future__ import annotations

from pydantic import BaseModel, Field, model_validator


[docs] class RoutingTier(BaseModel): """One tier in the cost-aware routing ladder. The router evaluates a complexity *score* (0-100) for each incoming message and selects the **first** tier whose ``max_score`` is >= that score. The last tier in the list always acts as the catch-all fallback. Parameters ---------- model: The LLM model identifier to use for requests that fall in this tier (e.g. ``"gpt-4o-mini"``, ``"gemini-2.0-flash"``, ``"claude-haiku-4-5-20251001"``). max_score: Inclusive upper bound on the complexity score that routes to this model. Range: 0-100. Set to ``100`` for the last (most powerful) tier so it catches everything. Examples -------- :: tiers = [ RoutingTier(model="gpt-4o-mini", max_score=30), RoutingTier(model="gpt-4o", max_score=70), RoutingTier(model="o3-mini", max_score=100), ] """ model: str = Field(min_length=1, description="Provider model identifier.") max_score: float = Field( default=100.0, ge=0, le=100, description="Inclusive upper-bound complexity score for this tier.", )
class _RoutingTierList(BaseModel): """Internal validator that enforces tiers are sorted ascending by max_score.""" tiers: list[RoutingTier] = Field(min_length=1) @model_validator(mode="after") def _ensure_sorted(self) -> _RoutingTierList: scores = [t.max_score for t in self.tiers] if scores != sorted(scores): raise ValueError( "RoutingTier list must be sorted ascending by max_score " "(cheapest to most capable). " f"Got scores: {scores}" ) return self