feat: ServerState data model with serialization
Add dataclasses for ServerState, LoadingInfo, and Metrics to represent the server's runtime state. ServerState includes a to_dict() method for serialization with timestamp. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -24,3 +24,39 @@ def classify_line(line: str) -> tuple[str, Optional[int], str]:
|
||||
if m:
|
||||
return ('child', int(m.group(1)), line[m.end():])
|
||||
return ('router', None, line)
|
||||
|
||||
|
||||
# ── Data model ───────────────────────────────────────────────────────────────
|
||||
|
||||
@dataclass
|
||||
class LoadingInfo:
|
||||
stages: list
|
||||
current: str
|
||||
progress: float # 0.0 – 1.0
|
||||
|
||||
|
||||
@dataclass
|
||||
class Metrics:
|
||||
prompt_speed: Optional[float] = None # tokens/sec during prompt eval
|
||||
prompt_tokens: Optional[int] = None # total prompt tokens
|
||||
gen_speed: Optional[float] = None # tokens/sec during generation
|
||||
n_decoded: Optional[int] = None # tokens decoded so far
|
||||
|
||||
|
||||
@dataclass
|
||||
class ServerState:
|
||||
state: str = "offline"
|
||||
model: Optional[str] = None
|
||||
loading: Optional[LoadingInfo] = None
|
||||
metrics: Metrics = field(default_factory=Metrics)
|
||||
request_count: int = 0
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {
|
||||
"state": self.state,
|
||||
"model": self.model,
|
||||
"loading": asdict(self.loading) if self.loading else None,
|
||||
"metrics": asdict(self.metrics),
|
||||
"request_count": self.request_count,
|
||||
"timestamp": datetime.now().isoformat(timespec="seconds"),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user