diff --git a/web/public/locales/en/views/settings.json b/web/public/locales/en/views/settings.json index 83da403ef..516ddf9f2 100644 --- a/web/public/locales/en/views/settings.json +++ b/web/public/locales/en/views/settings.json @@ -150,9 +150,13 @@ "title": "Streams", "desc": "Temporarily disable a camera until Frigate restarts. Disabling a camera completely stops Frigate's processing of this camera's streams. Detection, recording, and debugging will be unavailable.
Note: This does not disable go2rtc restreams." }, - "genai": { - "title": "Generative AI", - "desc": "Temporarily enable/disable Generative AI for this camera. When disabled, AI generated descriptions will not be requested for tracked objects on this camera." + "object_descriptions": { + "title": "Generative AI Object Descriptions", + "desc": "Temporarily enable/disable Generative AI object descriptions for this camera. When disabled, AI generated descriptions will not be requested for tracked objects on this camera." + }, + "review_descriptions": { + "title": "Generative AI Review Descriptions", + "desc": "Temporarily enable/disable Generative AI review descriptions for this camera. When disabled, AI generated descriptions will not be requested for review items on this camera." }, "review": { "title": "Review", diff --git a/web/src/api/ws.tsx b/web/src/api/ws.tsx index af25e6a51..0cef235a0 100644 --- a/web/src/api/ws.tsx +++ b/web/src/api/ws.tsx @@ -68,7 +68,8 @@ function useValue(): useValueReturn { autotracking, alerts, detections, - genai, + object_descriptions, + review_descriptions, } = state["config"]; cameraStates[`${name}/recordings/state`] = record ? "ON" : "OFF"; cameraStates[`${name}/enabled/state`] = enabled ? "ON" : "OFF"; @@ -90,7 +91,12 @@ function useValue(): useValueReturn { cameraStates[`${name}/review_detections/state`] = detections ? "ON" : "OFF"; - cameraStates[`${name}/genai/state`] = genai ? "ON" : "OFF"; + cameraStates[`${name}/object_descriptions/state`] = object_descriptions + ? "ON" + : "OFF"; + cameraStates[`${name}/review_descriptions/state`] = review_descriptions + ? "ON" + : "OFF"; }); setWsState((prevState) => ({ @@ -278,14 +284,31 @@ export function useDetectionsState(camera: string): { return { payload: payload as ToggleableSetting, send }; } -export function useGenAIState(camera: string): { +export function useObjectDescriptionState(camera: string): { payload: ToggleableSetting; send: (payload: ToggleableSetting, retain?: boolean) => void; } { const { value: { payload }, send, - } = useWs(`${camera}/genai/state`, `${camera}/genai/set`); + } = useWs( + `${camera}/object_descriptions/state`, + `${camera}/object_descriptions/set`, + ); + return { payload: payload as ToggleableSetting, send }; +} + +export function useReviewDescriptionState(camera: string): { + payload: ToggleableSetting; + send: (payload: ToggleableSetting, retain?: boolean) => void; +} { + const { + value: { payload }, + send, + } = useWs( + `${camera}/review_descriptions/state`, + `${camera}/review_descriptions/set`, + ); return { payload: payload as ToggleableSetting, send }; } diff --git a/web/src/types/frigateConfig.ts b/web/src/types/frigateConfig.ts index 576b4d750..22a35bdd9 100644 --- a/web/src/types/frigateConfig.ts +++ b/web/src/types/frigateConfig.ts @@ -218,6 +218,12 @@ export interface CameraConfig { mode: string; }; }; + genai?: { + enabled: boolean; + enabled_in_config: boolean; + alerts: boolean; + detections: boolean; + }; }; rtmp: { enabled: boolean; diff --git a/web/src/types/ws.ts b/web/src/types/ws.ts index 9ecb9cc6f..f2e45bda4 100644 --- a/web/src/types/ws.ts +++ b/web/src/types/ws.ts @@ -64,7 +64,8 @@ export interface FrigateCameraState { autotracking: boolean; alerts: boolean; detections: boolean; - genai: boolean; + object_descriptions: boolean; + review_descriptions: boolean; }; motion: boolean; objects: ObjectType[]; diff --git a/web/src/views/settings/CameraSettingsView.tsx b/web/src/views/settings/CameraSettingsView.tsx index a58e1c711..61f327c6e 100644 --- a/web/src/views/settings/CameraSettingsView.tsx +++ b/web/src/views/settings/CameraSettingsView.tsx @@ -35,7 +35,8 @@ import { useAlertsState, useDetectionsState, useEnabledState, - useGenAIState, + useObjectDescriptionState, + useReviewDescriptionState, } from "@/api/ws"; import CameraEditForm from "@/components/settings/CameraEditForm"; import { LuPlus } from "react-icons/lu"; @@ -150,8 +151,10 @@ export default function CameraSettingsView({ const { payload: detectionsState, send: sendDetections } = useDetectionsState(selectedCamera); - const { payload: genAIState, send: sendGenAI } = - useGenAIState(selectedCamera); + const { payload: objDescState, send: sendObjDesc } = + useObjectDescriptionState(selectedCamera); + const { payload: revDescState, send: sendRevDesc } = + useReviewDescriptionState(selectedCamera); const handleCheckedChange = useCallback( (isChecked: boolean) => { @@ -418,7 +421,9 @@ export default function CameraSettingsView({ - camera.genai.title + + camera.object_descriptions.title +
@@ -426,9 +431,9 @@ export default function CameraSettingsView({ { - sendGenAI(isChecked ? "ON" : "OFF"); + sendObjDesc(isChecked ? "ON" : "OFF"); }} />
@@ -438,7 +443,44 @@ export default function CameraSettingsView({
- camera.genai.desc + + camera.object_descriptions.desc + +
+ + + )} + + {cameraConfig?.review?.genai?.enabled_in_config && ( + <> + + + + + camera.review_descriptions.title + + + +
+
+ { + sendRevDesc(isChecked ? "ON" : "OFF"); + }} + /> +
+ +
+
+
+ + camera.review_descriptions.desc +