Config fixes

This commit is contained in:
Nicolas Mowen 2025-08-08 13:26:19 -06:00
parent 4658d7ac2a
commit a998d75824
8 changed files with 69 additions and 75 deletions

View File

@ -1230,7 +1230,7 @@ def regenerate_description(
camera_config = request.app.frigate_config.cameras[event.camera] camera_config = request.app.frigate_config.cameras[event.camera]
if camera_config.genai.enabled or params.force: if camera_config.objects.genai.enabled or params.force:
request.app.event_metadata_updater.publish( request.app.event_metadata_updater.publish(
(event.id, params.source, params.force), (event.id, params.source, params.force),
EventMetadataTypeEnum.regenerate_description.value, EventMetadataTypeEnum.regenerate_description.value,

View File

@ -209,7 +209,7 @@ class Dispatcher:
].onvif.autotracking.enabled, ].onvif.autotracking.enabled,
"alerts": self.config.cameras[camera].review.alerts.enabled, "alerts": self.config.cameras[camera].review.alerts.enabled,
"detections": self.config.cameras[camera].review.detections.enabled, "detections": self.config.cameras[camera].review.detections.enabled,
"genai": self.config.cameras[camera].genai.enabled, "genai": self.config.cameras[camera].objects.genai.enabled,
} }
self.publish("camera_activity", json.dumps(camera_status)) self.publish("camera_activity", json.dumps(camera_status))

View File

@ -124,7 +124,7 @@ class MqttClient(Communicator):
) )
self.publish( self.publish(
f"{camera_name}/genai/state", f"{camera_name}/genai/state",
"ON" if camera.genai.enabled_in_config else "OFF", "ON" if camera.objects.genai.enabled_in_config else "OFF",
retain=True, retain=True,
) )

View File

@ -61,7 +61,7 @@ class GenAIObjectTriggerConfig(FrigateBaseModel):
class GenAIObjectConfig(FrigateBaseModel): class GenAIObjectConfig(FrigateBaseModel):
enabled: bool = Field(default=False, title="Enable GenAI for camera.") enabled: bool = Field(default=True, title="Enable GenAI for camera.")
use_snapshot: bool = Field( use_snapshot: bool = Field(
default=False, title="Use snapshots for generating descriptions." default=False, title="Use snapshots for generating descriptions."
) )

View File

@ -99,7 +99,7 @@ class CameraConfigUpdateSubscriber:
elif update_type == CameraConfigUpdateEnum.enabled: elif update_type == CameraConfigUpdateEnum.enabled:
config.enabled = updated_config config.enabled = updated_config
elif update_type == CameraConfigUpdateEnum.genai: elif update_type == CameraConfigUpdateEnum.genai:
config.genai = updated_config config.objects.genai = updated_config
elif update_type == CameraConfigUpdateEnum.motion: elif update_type == CameraConfigUpdateEnum.motion:
config.motion = updated_config config.motion = updated_config
elif update_type == CameraConfigUpdateEnum.notifications: elif update_type == CameraConfigUpdateEnum.notifications:

View File

@ -40,9 +40,9 @@ class GenAIClient:
event: Event, event: Event,
) -> Optional[str]: ) -> Optional[str]:
"""Generate a description for the frame.""" """Generate a description for the frame."""
prompt = camera_config.genai.object_prompts.get( prompt = camera_config.objects.genai.object_prompts.get(
event.label, event.label,
camera_config.genai.prompt, camera_config.objects.genai.prompt,
).format(**model_to_dict(event)) ).format(**model_to_dict(event))
logger.debug(f"Sending images to genai provider with prompt: {prompt}") logger.debug(f"Sending images to genai provider with prompt: {prompt}")
return self._send(prompt, thumbnails) return self._send(prompt, thumbnails)
@ -58,16 +58,10 @@ class GenAIClient:
def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]: def get_genai_client(config: FrigateConfig) -> Optional[GenAIClient]:
"""Get the GenAI client.""" """Get the GenAI client."""
genai_config = config.genai load_providers()
genai_cameras = [ provider = PROVIDERS.get(config.genai.provider)
c for c in config.cameras.values() if c.enabled and c.genai.enabled if provider:
] return provider(config.genai)
if genai_cameras or genai_config.enabled:
load_providers()
provider = PROVIDERS.get(genai_config.provider)
if provider:
return provider(genai_config)
return None return None

View File

@ -936,14 +936,17 @@ function ObjectDetailsTab({
</div> </div>
</div> </div>
<div className="flex flex-col gap-1.5"> <div className="flex flex-col gap-1.5">
{config?.cameras[search.camera].genai.enabled && {config?.cameras[search.camera].objects.genai.enabled &&
!search.end_time && !search.end_time &&
(config.cameras[search.camera].genai.required_zones.length === 0 || (config.cameras[search.camera].objects.genai.required_zones.length ===
0 ||
search.zones.some((zone) => search.zones.some((zone) =>
config.cameras[search.camera].genai.required_zones.includes(zone), config.cameras[search.camera].objects.genai.required_zones.includes(
zone,
),
)) && )) &&
(config.cameras[search.camera].genai.objects.length === 0 || (config.cameras[search.camera].objects.genai.objects.length === 0 ||
config.cameras[search.camera].genai.objects.includes( config.cameras[search.camera].objects.genai.objects.includes(
search.label, search.label,
)) ? ( )) ? (
<> <>
@ -972,47 +975,49 @@ function ObjectDetailsTab({
)} )}
<div className="flex w-full flex-row justify-end gap-2"> <div className="flex w-full flex-row justify-end gap-2">
{config?.cameras[search.camera].genai.enabled && search.end_time && ( {config?.cameras[search.camera].objects.genai.enabled &&
<div className="flex items-start"> search.end_time && (
<Button <div className="flex items-start">
className="rounded-r-none border-r-0" <Button
aria-label={t("details.button.regenerate.label")} className="rounded-r-none border-r-0"
onClick={() => regenerateDescription("thumbnails")} aria-label={t("details.button.regenerate.label")}
> onClick={() => regenerateDescription("thumbnails")}
{t("details.button.regenerate.title")} >
</Button> {t("details.button.regenerate.title")}
{search.has_snapshot && ( </Button>
<DropdownMenu> {search.has_snapshot && (
<DropdownMenuTrigger asChild> <DropdownMenu>
<Button <DropdownMenuTrigger asChild>
className="rounded-l-none border-l-0 px-2" <Button
aria-label={t("details.expandRegenerationMenu")} className="rounded-l-none border-l-0 px-2"
> aria-label={t("details.expandRegenerationMenu")}
<FaChevronDown className="size-3" /> >
</Button> <FaChevronDown className="size-3" />
</DropdownMenuTrigger> </Button>
<DropdownMenuContent> </DropdownMenuTrigger>
<DropdownMenuItem <DropdownMenuContent>
className="cursor-pointer" <DropdownMenuItem
aria-label={t("details.regenerateFromSnapshot")} className="cursor-pointer"
onClick={() => regenerateDescription("snapshot")} aria-label={t("details.regenerateFromSnapshot")}
> onClick={() => regenerateDescription("snapshot")}
{t("details.regenerateFromSnapshot")} >
</DropdownMenuItem> {t("details.regenerateFromSnapshot")}
<DropdownMenuItem </DropdownMenuItem>
className="cursor-pointer" <DropdownMenuItem
aria-label={t("details.regenerateFromThumbnails")} className="cursor-pointer"
onClick={() => regenerateDescription("thumbnails")} aria-label={t("details.regenerateFromThumbnails")}
> onClick={() => regenerateDescription("thumbnails")}
{t("details.regenerateFromThumbnails")} >
</DropdownMenuItem> {t("details.regenerateFromThumbnails")}
</DropdownMenuContent> </DropdownMenuItem>
</DropdownMenu> </DropdownMenuContent>
)} </DropdownMenu>
</div> )}
)} </div>
{((config?.cameras[search.camera].genai.enabled && search.end_time) || )}
!config?.cameras[search.camera].genai.enabled) && ( {((config?.cameras[search.camera].objects.genai.enabled &&
search.end_time) ||
!config?.cameras[search.camera].objects.genai.enabled) && (
<Button <Button
variant="select" variant="select"
aria-label={t("button.save", { ns: "common" })} aria-label={t("button.save", { ns: "common" })}

View File

@ -94,13 +94,6 @@ export interface CameraConfig {
cmd: string; cmd: string;
roles: string[]; roles: string[];
}[]; }[];
genai: {
enabled: string;
prompt: string;
object_prompts: { [key: string]: string };
required_zones: string[];
objects: string[];
};
live: { live: {
height: number; height: number;
quality: number; quality: number;
@ -146,6 +139,13 @@ export interface CameraConfig {
}; };
mask: string; mask: string;
track: string[]; track: string[];
genai: {
enabled: string;
prompt: string;
object_prompts: { [key: string]: string };
required_zones: string[];
objects: string[];
};
}; };
onvif: { onvif: {
autotracking: { autotracking: {
@ -406,15 +406,10 @@ export interface FrigateConfig {
}; };
genai: { genai: {
enabled: boolean;
provider: string; provider: string;
base_url?: string; base_url?: string;
api_key?: string; api_key?: string;
model: string; model: string;
prompt: string;
object_prompts: { [key: string]: string };
required_zones: string[];
objects: string[];
}; };
go2rtc: { go2rtc: {