Keep the self-report shapes in a module the line budget can hold
9f91ff7 pushed schemas.py from 498 to 534 lines and broke the 500-line rule
the repo enforces on every file. The status family (CacheLayerStatus,
MemoryStatus, RuntimeStatus, SenseStatus, SystemStatus) moves to
status_schemas.py, where it is self-contained: it needs only
TrainingAdapterKind from schemas.py, and schemas.py no longer looks back.
The same commit added three multi-line docstrings (browse.picture,
senses.sense_facts, SenseStatus). Each is now one line; the absent-vs-missing
distinction they carried survives in SenseStatus's own line, and the producer
senses.py still states why the two failures need different sentences.
Measured, not asserted: 263 tests pass; ruff clean on the eight touched
files; repo-wide mypy still 24 errors in 6 files (runtime.py's two are in
that baseline and reproduce on the HEAD copy of the file); pyright reports
the same two pre-existing runtime.py tuple findings on both trees;
multi-line docstrings repo-wide are back to 114, the parent's count.
This commit is contained in:
1 parent
9f91ff7ed7
commit
6df713d135
8 files changed
+83
-81
No files matched your search
@@ -39,7 +39,6 @@ from .schemas import (
|
||||
ForgetReport,
|
||||
ForgetRequest,
|
||||
MemoryOrigin,
|
||||
MemoryStatus,
|
||||
Modality,
|
||||
PathIngestRequest,
|
||||
RememberRequest,
|
||||
@@ -48,10 +47,10 @@ from .schemas import (
|
||||
SearchRequest,
|
||||
SearchResult,
|
||||
SupersedeRequest,
|
||||
SystemStatus,
|
||||
UploadIngestRequest,
|
||||
)
|
||||
from .senses import sense_facts
|
||||
from .status_schemas import MemoryStatus, SystemStatus
|
||||
from .training import safetensor_weight_stats
|
||||
from .verifier import Verifier, VisualContradictionLens
|
||||
|
||||
|
||||
@@ -55,11 +55,7 @@ def browse(
|
||||
|
||||
|
||||
def picture(settings: Settings, atom_id: str) -> Picture | None:
|
||||
"""The stored bytes behind one atom, through the same visibility view search uses.
|
||||
|
||||
None covers three cases the caller cannot tell apart and does not need to: the atom is unknown,
|
||||
it was forgotten, or its bytes are gone. All three mean "there is no picture to show".
|
||||
"""
|
||||
"""The stored bytes behind one atom; None means there is no picture to show, for any of the three reasons."""
|
||||
database = Database(settings)
|
||||
with database.connect() as connection:
|
||||
row = connection.execute(
|
||||
|
||||
@@ -7,7 +7,7 @@ from typing import Any
|
||||
|
||||
from .config import Settings, get_settings
|
||||
from .db import Database
|
||||
from .schemas import CacheLayerStatus
|
||||
from .status_schemas import CacheLayerStatus
|
||||
|
||||
SEMANTIC_LAYER = "semantic"
|
||||
|
||||
|
||||
@@ -15,8 +15,9 @@ from .cartridge_store import mounted_ids
|
||||
from .config import Settings
|
||||
from .db import Database
|
||||
from .migrations import SCHEMA_VERSION
|
||||
from .schemas import SenseStatus, utc_now
|
||||
from .schemas import utc_now
|
||||
from .senses import sense_facts
|
||||
from .status_schemas import SenseStatus
|
||||
|
||||
BACKUP_FILE = "ely_eye.sqlite"
|
||||
MANIFEST_FILE = "backup_manifest.json"
|
||||
|
||||
@@ -13,7 +13,8 @@ import httpx
|
||||
from . import adapters
|
||||
from .config import Settings, get_settings
|
||||
from .db import Database
|
||||
from .schemas import CompiledContext, RuntimeStatus, TrainingAdapterKind
|
||||
from .schemas import CompiledContext, TrainingAdapterKind
|
||||
from .status_schemas import RuntimeStatus
|
||||
from .storage import ObjectStore
|
||||
|
||||
logger = logging.getLogger("ely_eye.runtime")
|
||||
|
||||
@@ -240,71 +240,6 @@ class AnswerResponse(BaseModel):
|
||||
verifier: CitationReport
|
||||
runtime_backend: str
|
||||
|
||||
class CacheLayerStatus(BaseModel):
|
||||
layer: str
|
||||
entries: int
|
||||
bytes_estimate: int
|
||||
hit_count: int
|
||||
miss_count: int
|
||||
last_event_at: datetime | None
|
||||
|
||||
class MemoryStatus(BaseModel):
|
||||
active_atoms: int
|
||||
active_token_equivalent: int
|
||||
cartridges: int
|
||||
library_token_equivalent: int
|
||||
layers: list[CacheLayerStatus]
|
||||
|
||||
class RuntimeStatus(BaseModel):
|
||||
backend: str
|
||||
model_id: str
|
||||
available: bool
|
||||
detail: str
|
||||
adapter_path: str | None = None
|
||||
adapter_kind: TrainingAdapterKind | None = None
|
||||
adapter_id: str | None = None
|
||||
adapter_sha256: str | None = None
|
||||
gpu_name: str | None = None
|
||||
cuda: str | None = None
|
||||
vram_total_mb: int | None = None
|
||||
vram_used_mb: int | None = None
|
||||
|
||||
SenseState = Literal["absent", "missing", "ready"]
|
||||
VisualState = Literal["absent", "stale", "ready"]
|
||||
DenseState = Literal["off", "missing", "behind", "current"]
|
||||
|
||||
|
||||
class SenseStatus(BaseModel):
|
||||
"""What the machine can perceive right now, stated once for the UI and the doctor to share.
|
||||
|
||||
`absent` means the sense was never given a model, `missing` means it was given one that is gone.
|
||||
A store full of pictures and no CLIP snapshot is a different problem, and needs a different
|
||||
sentence, than a snapshot directory somebody deleted.
|
||||
"""
|
||||
|
||||
dense: DenseState
|
||||
dense_covered: int
|
||||
store_atoms: int
|
||||
picture_atoms: int
|
||||
picture_bytes_missing: int
|
||||
visual: VisualState
|
||||
audio_atoms: int
|
||||
speech: SenseState
|
||||
captioning: SenseState
|
||||
clip_path: str | None = None
|
||||
asr_path: str | None = None
|
||||
vlm_path: str | None = None
|
||||
|
||||
|
||||
class SystemStatus(BaseModel):
|
||||
app: str = "Ely-Eye"
|
||||
version: str
|
||||
runtime: RuntimeStatus
|
||||
memory: MemoryStatus
|
||||
senses: SenseStatus
|
||||
profiles: dict[str, dict[str, Any]]
|
||||
data_home: str
|
||||
|
||||
class MountState(BaseModel):
|
||||
"""What is mounted now, and whether that narrows a search."""
|
||||
|
||||
|
||||
@@ -7,16 +7,12 @@ from pathlib import Path
|
||||
from .config import Settings
|
||||
from .db import Database
|
||||
from .embeddings import EmbeddingService
|
||||
from .schemas import DenseState, SenseState, SenseStatus, VisualState
|
||||
from .status_schemas import DenseState, SenseState, SenseStatus, VisualState
|
||||
from .visual_index import VisualIndex
|
||||
|
||||
|
||||
def sense_facts(settings: Settings, database: Database, visual: VisualIndex | None = None) -> SenseStatus:
|
||||
"""Report the senses as facts, so the UI and the doctor cannot disagree about what is missing.
|
||||
|
||||
A path set but gone on disk is a different failure from a path never set: the first is a broken
|
||||
install, the second is a machine that was never given that sense.
|
||||
"""
|
||||
"""Report the senses as facts, so the UI and the doctor cannot disagree about what is missing."""
|
||||
index = visual or VisualIndex(settings, database)
|
||||
claimed = _picture_claim(database)
|
||||
on_disk = index.visual_atom_ids()
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
"""What the machine reports about itself: runtime, memory, cache layers, senses."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any, Literal
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
from .schemas import TrainingAdapterKind
|
||||
|
||||
|
||||
class CacheLayerStatus(BaseModel):
|
||||
layer: str
|
||||
entries: int
|
||||
bytes_estimate: int
|
||||
hit_count: int
|
||||
miss_count: int
|
||||
last_event_at: datetime | None
|
||||
|
||||
|
||||
class MemoryStatus(BaseModel):
|
||||
active_atoms: int
|
||||
active_token_equivalent: int
|
||||
cartridges: int
|
||||
library_token_equivalent: int
|
||||
layers: list[CacheLayerStatus]
|
||||
|
||||
|
||||
class RuntimeStatus(BaseModel):
|
||||
backend: str
|
||||
model_id: str
|
||||
available: bool
|
||||
detail: str
|
||||
adapter_path: str | None = None
|
||||
adapter_kind: TrainingAdapterKind | None = None
|
||||
adapter_id: str | None = None
|
||||
adapter_sha256: str | None = None
|
||||
gpu_name: str | None = None
|
||||
cuda: str | None = None
|
||||
vram_total_mb: int | None = None
|
||||
vram_used_mb: int | None = None
|
||||
|
||||
|
||||
SenseState = Literal["absent", "missing", "ready"]
|
||||
VisualState = Literal["absent", "stale", "ready"]
|
||||
DenseState = Literal["off", "missing", "behind", "current"]
|
||||
|
||||
|
||||
class SenseStatus(BaseModel):
|
||||
"""What the machine can perceive now; absent means no model was given, missing means the one it was given is gone."""
|
||||
|
||||
dense: DenseState
|
||||
dense_covered: int
|
||||
store_atoms: int
|
||||
picture_atoms: int
|
||||
picture_bytes_missing: int
|
||||
visual: VisualState
|
||||
audio_atoms: int
|
||||
speech: SenseState
|
||||
captioning: SenseState
|
||||
clip_path: str | None = None
|
||||
asr_path: str | None = None
|
||||
vlm_path: str | None = None
|
||||
|
||||
|
||||
class SystemStatus(BaseModel):
|
||||
app: str = "Ely-Eye"
|
||||
version: str
|
||||
runtime: RuntimeStatus
|
||||
memory: MemoryStatus
|
||||
senses: SenseStatus
|
||||
profiles: dict[str, dict[str, Any]]
|
||||
data_home: str
|
||||
Reference in new issue
Block a user