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({