Various Fixes (#22594)

* Fix handling of preview

* Fix schema cleaning

* Cleanup
This commit is contained in:
Nicolas Mowen 2026-03-23 10:22:52 -06:00 committed by GitHub
parent a89c7d8819
commit a8b6ea5005
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 29 additions and 23 deletions

View File

@ -1337,9 +1337,9 @@ def preview_gif(
status_code=404, status_code=404,
) )
file_start = f"preview_{camera_name}" file_start = f"preview_{camera_name}-"
start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}" start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}"
end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}"
selected_previews = [] selected_previews = []
for file in sorted(os.listdir(preview_dir)): for file in sorted(os.listdir(preview_dir)):
@ -1519,9 +1519,9 @@ def preview_mp4(
status_code=404, status_code=404,
) )
file_start = f"preview_{camera_name}" file_start = f"preview_{camera_name}-"
start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}" start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}"
end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}"
selected_previews = [] selected_previews = []
for file in sorted(os.listdir(preview_dir)): for file in sorted(os.listdir(preview_dir)):

View File

@ -145,9 +145,9 @@ def preview_hour(
def get_preview_frames_from_cache(camera_name: str, start_ts: float, end_ts: float): def get_preview_frames_from_cache(camera_name: str, start_ts: float, end_ts: float):
"""Get list of cached preview frames""" """Get list of cached preview frames"""
preview_dir = os.path.join(CACHE_DIR, "preview_frames") preview_dir = os.path.join(CACHE_DIR, "preview_frames")
file_start = f"preview_{camera_name}" file_start = f"preview_{camera_name}-"
start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}" start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}"
end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}"
selected_previews = [] selected_previews = []
for file in sorted(os.listdir(preview_dir)): for file in sorted(os.listdir(preview_dir)):

View File

@ -324,9 +324,9 @@ class ReviewDescriptionProcessor(PostProcessorApi):
end_time: float, end_time: float,
) -> list[str]: ) -> list[str]:
preview_dir = os.path.join(CACHE_DIR, "preview_frames") preview_dir = os.path.join(CACHE_DIR, "preview_frames")
file_start = f"preview_{camera}" file_start = f"preview_{camera}-"
start_file = f"{file_start}-{start_time}.webp" start_file = f"{file_start}{start_time}.webp"
end_file = f"{file_start}-{end_time}.webp" end_file = f"{file_start}{end_time}.webp"
all_frames = [] all_frames = []
for file in sorted(os.listdir(preview_dir)): for file in sorted(os.listdir(preview_dir)):

View File

@ -54,12 +54,16 @@ class OllamaClient(GenAIClient):
return None return None
@staticmethod @staticmethod
def _clean_schema_for_ollama(schema: dict) -> dict: def _clean_schema_for_ollama(schema: dict, *, _is_properties: bool = False) -> dict:
"""Strip Pydantic metadata from a JSON schema for Ollama compatibility. """Strip Pydantic metadata from a JSON schema for Ollama compatibility.
Ollama's grammar-based constrained generation works best with minimal Ollama's grammar-based constrained generation works best with minimal
schemas. Pydantic adds title/description/constraint fields that can schemas. Pydantic adds title/description/constraint fields that can
cause the grammar generator to silently skip required fields. cause the grammar generator to silently skip required fields.
Keys inside a ``properties`` dict are actual field names and must never
be stripped, even if they collide with a metadata key name (e.g. a
model field called ``title``).
""" """
STRIP_KEYS = { STRIP_KEYS = {
"title", "title",
@ -71,10 +75,12 @@ class OllamaClient(GenAIClient):
} }
result = {} result = {}
for key, value in schema.items(): for key, value in schema.items():
if key in STRIP_KEYS: if not _is_properties and key in STRIP_KEYS:
continue continue
if isinstance(value, dict): if isinstance(value, dict):
result[key] = OllamaClient._clean_schema_for_ollama(value) result[key] = OllamaClient._clean_schema_for_ollama(
value, _is_properties=(key == "properties")
)
elif isinstance(value, list): elif isinstance(value, list):
result[key] = [ result[key] = [
OllamaClient._clean_schema_for_ollama(item) OllamaClient._clean_schema_for_ollama(item)

View File

@ -266,8 +266,8 @@ class PreviewRecorder:
.timestamp() .timestamp()
) )
file_start = f"preview_{config.name}" file_start = f"preview_{config.name}-"
start_file = f"{file_start}-{start_ts}.webp" start_file = f"{file_start}{start_ts}.webp"
for file in sorted(os.listdir(os.path.join(CACHE_DIR, FOLDER_PREVIEW_FRAMES))): for file in sorted(os.listdir(os.path.join(CACHE_DIR, FOLDER_PREVIEW_FRAMES))):
if not file.startswith(file_start): if not file.startswith(file_start):

View File

@ -156,9 +156,9 @@ class RecordingExporter(threading.Thread):
else: else:
# need to generate from existing images # need to generate from existing images
preview_dir = os.path.join(CACHE_DIR, "preview_frames") preview_dir = os.path.join(CACHE_DIR, "preview_frames")
file_start = f"preview_{self.camera}" file_start = f"preview_{self.camera}-"
start_file = f"{file_start}-{self.start_time}.{PREVIEW_FRAME_TYPE}" start_file = f"{file_start}{self.start_time}.{PREVIEW_FRAME_TYPE}"
end_file = f"{file_start}-{self.end_time}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{self.end_time}.{PREVIEW_FRAME_TYPE}"
selected_preview = None selected_preview = None
for file in sorted(os.listdir(preview_dir)): for file in sorted(os.listdir(preview_dir)):
@ -264,9 +264,9 @@ class RecordingExporter(threading.Thread):
if is_current_hour(self.start_time): if is_current_hour(self.start_time):
# get list of current preview frames # get list of current preview frames
preview_dir = os.path.join(CACHE_DIR, "preview_frames") preview_dir = os.path.join(CACHE_DIR, "preview_frames")
file_start = f"preview_{self.camera}" file_start = f"preview_{self.camera}-"
start_file = f"{file_start}-{self.start_time}.{PREVIEW_FRAME_TYPE}" start_file = f"{file_start}{self.start_time}.{PREVIEW_FRAME_TYPE}"
end_file = f"{file_start}-{self.end_time}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{self.end_time}.{PREVIEW_FRAME_TYPE}"
for file in sorted(os.listdir(preview_dir)): for file in sorted(os.listdir(preview_dir)):
if not file.startswith(file_start): if not file.startswith(file_start):