This commit is contained in:
Nicolas Mowen 2026-04-03 17:03:48 -06:00
parent 5aee9f297a
commit 5513199b72
5 changed files with 25 additions and 5 deletions

View File

@ -332,7 +332,12 @@ class ObjectDescriptionProcessor(PostProcessorApi):
"""Embed the description for an event."""
start = datetime.datetime.now().timestamp()
camera_config = self.config.cameras[str(event.camera)]
description = self.genai_manager.description_client.generate_object_description(
client = self.genai_manager.description_client
if client is None:
return
description = client.generate_object_description(
camera_config, thumbnails, event
)

View File

@ -64,7 +64,12 @@ class ReviewDescriptionProcessor(PostProcessorApi):
Estimates ~1 token per 1250 pixels. Targets 98% context utilization with safety margin.
Capped at 20 frames.
"""
context_size = self.genai_manager.description_client.get_context_size()
client = self.genai_manager.description_client
if client is None:
return 3
context_size = client.get_context_size()
camera_config = self.config.cameras[camera]
detect_width = camera_config.detect.width
@ -320,7 +325,12 @@ class ReviewDescriptionProcessor(PostProcessorApi):
os.path.join(CLIPS_DIR, "genai-requests", f"{start_ts}-{end_ts}")
).mkdir(parents=True, exist_ok=True)
return self.genai_manager.description_client.generate_review_summary(
client = self.genai_manager.description_client
if client is None:
return None
return client.generate_review_summary(
start_ts,
end_ts,
events_with_context,

View File

@ -90,7 +90,7 @@ class GeminiClient(GenAIClient):
def list_models(self) -> list[str]:
"""Return available model names from Gemini."""
try:
return sorted(m.name for m in self.provider.models.list())
return sorted(m.name or "" for m in self.provider.models.list())
except Exception as e:
logger.warning("Failed to list Gemini models: %s", e)
return []

View File

@ -70,12 +70,15 @@ class GenAIClientManager:
if not genai_cfg:
return None
if not genai_cfg.provider:
return None
provider_cls = PROVIDERS.get(genai_cfg.provider)
if not provider_cls:
return None
try:
client = provider_cls(genai_cfg)
client: "GenAIClient" = provider_cls(genai_cfg)
except Exception as e:
logger.exception(
"Failed to create GenAI client for provider %s: %s",

View File

@ -134,6 +134,8 @@ class OllamaClient(GenAIClient):
def list_models(self) -> list[str]:
"""Return available model names from the Ollama server."""
if self.provider is None:
return []
try:
response = self.provider.list()
return sorted(