4a1b4f7674
Backend: GET /api/v1/system/performance endpoint using psutil (CPU/RAM) and nvidia-ml-py (GPU utilization, memory, temperature) with graceful fallback. Frontend: Chart.js line charts with rolling 60-sample history persisted to sessionStorage, flicker-free updates via persistent DOM and diff-based dynamic section refresh. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
71 lines
2.7 KiB
Python
71 lines
2.7 KiB
Python
"""System-related schemas (health, version, displays)."""
|
|
|
|
from datetime import datetime
|
|
from typing import List, Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class HealthResponse(BaseModel):
|
|
"""Health check response."""
|
|
|
|
status: Literal["healthy", "unhealthy"] = Field(description="Service health status")
|
|
timestamp: datetime = Field(description="Current server time")
|
|
version: str = Field(description="Application version")
|
|
|
|
|
|
class VersionResponse(BaseModel):
|
|
"""Version information response."""
|
|
|
|
version: str = Field(description="Application version")
|
|
python_version: str = Field(description="Python version")
|
|
api_version: str = Field(description="API version")
|
|
|
|
|
|
class DisplayInfo(BaseModel):
|
|
"""Display/monitor information."""
|
|
|
|
index: int = Field(description="Display index")
|
|
name: str = Field(description="Display name")
|
|
width: int = Field(description="Display width in pixels")
|
|
height: int = Field(description="Display height in pixels")
|
|
x: int = Field(description="Display X position")
|
|
y: int = Field(description="Display Y position")
|
|
is_primary: bool = Field(default=False, description="Whether this is the primary display")
|
|
refresh_rate: int = Field(description="Display refresh rate in Hz")
|
|
|
|
|
|
class DisplayListResponse(BaseModel):
|
|
"""List of available displays."""
|
|
|
|
displays: List[DisplayInfo] = Field(description="Available displays")
|
|
count: int = Field(description="Number of displays")
|
|
|
|
|
|
class ProcessListResponse(BaseModel):
|
|
"""List of running processes."""
|
|
|
|
processes: List[str] = Field(description="Sorted list of unique process names")
|
|
count: int = Field(description="Number of unique processes")
|
|
|
|
|
|
class GpuInfo(BaseModel):
|
|
"""GPU performance information."""
|
|
|
|
name: str | None = Field(default=None, description="GPU device name")
|
|
utilization: float | None = Field(default=None, description="GPU core usage percent")
|
|
memory_used_mb: float | None = Field(default=None, description="GPU memory used in MB")
|
|
memory_total_mb: float | None = Field(default=None, description="GPU total memory in MB")
|
|
temperature_c: float | None = Field(default=None, description="GPU temperature in Celsius")
|
|
|
|
|
|
class PerformanceResponse(BaseModel):
|
|
"""System performance metrics."""
|
|
|
|
cpu_percent: float = Field(description="System-wide CPU usage percent")
|
|
ram_used_mb: float = Field(description="RAM used in MB")
|
|
ram_total_mb: float = Field(description="RAM total in MB")
|
|
ram_percent: float = Field(description="RAM usage percent")
|
|
gpu: GpuInfo | None = Field(default=None, description="GPU info (null if unavailable)")
|
|
timestamp: datetime = Field(description="Measurement timestamp")
|