Files
2026-06-11 16:28:00 +08:00

43 lines
1.2 KiB
Python

from __future__ import annotations
from typing import Any
from pydantic import BaseModel, Field
class IntentCandidate(BaseModel):
intent_id: str
score: float = 0.0
reason: str | None = None
model_name: str | None = None
raw_label: str | None = None
metadata: dict[str, Any] = Field(default_factory=dict)
class MatcherStageDebug(BaseModel):
stage: str
accepted: bool = False
selected_intent: str | None = None
score: float = 0.0
elapsed_ms: float | None = None
reason: str | None = None
model_name: str | None = None
backend: str | None = None
fallback_used: bool = False
raw_label: str | None = None
error_message: str | None = None
metadata: dict[str, Any] = Field(default_factory=dict)
candidates: list[IntentCandidate] = Field(default_factory=list)
class RoutingDebug(BaseModel):
selected_intent: str | None = None
matched_stage: str | None = None
decision: str = "reject"
decision_reason: str | None = None
confidence_grade: str | None = None
total_match_latency_ms: float | None = None
unknown_detected: bool = False
extracted_slots: dict[str, Any] = Field(default_factory=dict)
stages: list[MatcherStageDebug] = Field(default_factory=list)