mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-01 02:57:41 +03:00
Config fixes
This commit is contained in:
parent
4658d7ac2a
commit
a998d75824
@ -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,
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -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."
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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" })}
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user