| 378 | |
| 379 | @dataclass(frozen=True, slots=True) |
| 380 | class RoutingDecision: |
| 381 | model: str |
| 382 | tier: Tier |
| 383 | capability_lane: CapabilityLane |
| 384 | served_quality: ServedQuality |
| 385 | served_quality_target: ServedQuality |
| 386 | served_quality_floor: ServedQuality | None |
| 387 | continuity_quality_floor: ServedQuality | None |
| 388 | mode: RoutingMode |
| 389 | confidence: float |
| 390 | method: str |
| 391 | reasoning: str |
| 392 | cost_estimate: float |
| 393 | baseline_cost: float |
| 394 | savings: float # 0-1 |
| 395 | raw_confidence: float = 0.0 |
| 396 | confidence_source: str = "classifier" |
| 397 | calibration_version: str = "" |
| 398 | calibration_sample_count: int = 0 |
| 399 | calibration_temperature: float = 1.0 |
| 400 | calibration_applied_tags: tuple[str, ...] = () |
| 401 | complexity: float = 0.33 |
| 402 | agentic_score: float = 0.0 |
| 403 | constraints: RoutingConstraints = field(default_factory=RoutingConstraints) |
| 404 | workload_hints: WorkloadHints = field(default_factory=WorkloadHints) |
| 405 | routing_features: RoutingFeatures = field(default_factory=RoutingFeatures) |
| 406 | answer_depth: AnswerDepth = AnswerDepth.STANDARD |
| 407 | suggested_output_budget: int = 4096 |
| 408 | fallback_chain: list[FallbackOption] = field(default_factory=list) |
| 409 | candidate_scores: list[CandidateScore] = field(default_factory=list) |
| 410 | |
| 411 | |
| 412 | @dataclass(frozen=True, slots=True) |
no outgoing calls