Files
LM-Gambit/server/schemas.py
T
Christopher Clendening adf61ae1a0 feat: add Settings and Suite pages with comprehensive settings management and question suite builder
- Implemented SettingsPage for configuring default provider, temperature, and model paths.
- Added SuitePage for managing a suite of questions with features to add, edit, duplicate, and delete questions.
- Introduced TypeScript configuration files for app and node environments.
- Set up Vite configuration for development server with API proxying to backend.
2026-07-27 17:41:08 -04:00

158 lines
3.3 KiB
Python

"""Pydantic request/response models for the LM-Gambit API."""
from __future__ import annotations
from typing import Dict, List, Optional
from pydantic import BaseModel, Field
class ProviderSummary(BaseModel):
name: str
is_default: bool = False
class ModelSummary(BaseModel):
id: str
display_name: str
class ModelListResponse(BaseModel):
provider: str
models: List[ModelSummary]
class TestPrompt(BaseModel):
"""A single question in the suite.
``title`` is derived from the first non-empty line of ``prompt`` by the
engine, so it is read-only here and returned for display purposes only.
"""
filename: str
title: str
prompt: str
class TestSuiteResponse(BaseModel):
tests: List[TestPrompt]
directory: str
class TestDraft(BaseModel):
"""One question as submitted by the suite builder form."""
prompt: str = Field(min_length=1)
class SaveSuiteRequest(BaseModel):
tests: List[TestDraft]
class RunMetrics(BaseModel):
tokens_per_second: float = 0.0
total_tokens: int = 0
time_to_first_token: float = 0.0
stop_reason: str = "N/A"
class RunRequest(BaseModel):
provider: str
model_id: str
temperature: float = Field(default=0.1, ge=0.0, le=2.0)
filenames: Optional[List[str]] = Field(
default=None,
description="Subset of test filenames to run. Omit to run the whole suite.",
)
class RunSummary(BaseModel):
average_tokens_per_second: float = 0.0
average_time_to_first_token: float = 0.0
total_tokens: int = 0
passed: int = 0
failed: int = 0
overall_score: Optional[float] = None
graded: int = 0
class PluginSummary(BaseModel):
name: str
slug: str
version: str
description: str
path: str
enabled: bool
hooks: List[str] = []
error: Optional[str] = None
class RunResponse(BaseModel):
id: str
status: str
provider: str
model_id: str
model_label: str
temperature: float
total: int
completed: int
started_at: float
finished_at: Optional[float] = None
report_name: Optional[str] = None
error: Optional[str] = None
summary: RunSummary = RunSummary()
class PlaygroundRequest(BaseModel):
provider: str
model_id: str
prompt: str = Field(min_length=1)
temperature: float = Field(default=0.1, ge=0.0, le=2.0)
class PlaygroundResponse(BaseModel):
response: Optional[str] = None
error: Optional[str] = None
metrics: Optional[RunMetrics] = None
elapsed: float = 0.0
class ReportSummary(BaseModel):
name: str
model_label: str
size_bytes: int
modified_at: float
class ReportDetail(ReportSummary):
content: str
class ModelPathEntry(BaseModel):
nickname: str = ""
path: str
class SettingsResponse(BaseModel):
default_provider: str
default_temperature: float
local_model_paths: List[ModelPathEntry]
tests_dir: str
results_dir: str
models_dir: str
class SettingsUpdate(BaseModel):
default_provider: Optional[str] = None
default_temperature: Optional[float] = Field(default=None, ge=0.0, le=2.0)
local_model_paths: Optional[List[ModelPathEntry]] = None
class SystemInfo(BaseModel):
version: str
engine_architecture: str
engine_runtime: str
template_ok: bool
python_version: str
metrics: Dict[str, str] = {}