RFC 0002 - Frigate GenAI Notifications¶
Status: built in 0.4.0, 2026-11-06
Summary¶
Notify from what Frigate's generative AI says about what it saw, using Frigate's own structured output where there is one, and free text only where there isn't.
Frigate has two GenAI features, and both are in use on the live install:
- Review summaries (
review.genai), one per review, with a title, a short summary and a structured threat level. This is the main source. - Object descriptions (
objects.genai), free text for each tracked object, sent on{prefix}/tracked_object_update. These have no structure, so a priority can only come from the wording the prompt asks for. They're a second source, with rules.
Review of the first draft (2026-11-06)¶
The first draft took object descriptions as the only source, and read the priority from a risk level that the prompt asks the model to write first. Checking that draft against the live install found these problems.
- The example automation's priority only matched what it then filtered out. Its regex wants whitespace straight after
RISK, but the model mostly writesRISK.(191 of 211) orRISK:(4). The 16 that matched were allNO RISKorLOW RISK, which the condition drops anyway. So every description that was sent went atmedium, with the prefix left in. Sent messages from the last two weeks: critical risk. masked individual moving quickly through the courtyard at night..., sent atmediumhigh risk. a person is obscuring the driveway camera lens..., sent atmediummedium risk: unidentified car at the pend entrance at night..., sent atmedium- Lower-casing the whole message loses names, such as
Ramziand number plates. - Not every prompt follows the risk scheme. The live install's
object_prompts.birdstarts withBIRD IDENTIFIEDorUNKNOWN BIRD. Two thirds of the descriptions sent were birds, all atmedium. A risk regex can't cover these; rules for each prompt can. - Frigate already has a structured threat level. Review summaries have
potential_threat_levelin the review'sdata.metadata, set by Frigate's ownactivity_context_prompt, which the live install has customised. It's a number, so there's nothing to parse and no prompt wording to depend on. The first draft didn't use it. - Faces, plates and classifications are already structured too.
tracked_object_updatecan also carryface,lprandclassificationmessages, though none were sent in 30 days on the live install. Faces and plates already reach the camera entries as reviewsub_labels, so they need nothing new.
Evidence from 30 days of MQTT¶
From the MQTT messages archive, to 6 November 2026.
| Message | Count |
|---|---|
frigate/reviews new | 397 |
frigate/reviews update | 86 |
frigate/reviews end | 410 |
frigate/reviews genai | 131 |
frigate/tracked_object_update description | 228 |
- Review summaries rarely raise the level. Of 131, 129 were level 0 and 2 were level 1, with none at level 2. One of the two level 1s was the resident walking to the barn.
- Descriptions were mostly no risk. By first words: 171
NO RISK, 32LOW RISK, 5MEDIUM RISK, 3HIGH RISK, 16BIRD IDENTIFIEDand 1UNKNOWN BIRD. Each tracked object got one description, never two. - The two sources disagree. A description is matched to its review summary through the summary's
data.detections, and 158 of the 228 had one. EachMEDIUMorHIGHdescription that had one was level 0 in the summary, and the summary's title usually explains it: HIGH RISK. A person is obscuring the driveway camera lens..., against Cleaning a security camera in the drivewayHIGH RISK. Two unidentified men in hoodies..., against Daytime delivery and item exchange in the courtyardMEDIUM RISK. Unmarked white van with a man in..., against Daytime Package Delivery
A summary sees the whole review, every object in it and Frigate's activity context, while a description sees one object's snapshot. Here the summaries were the better judge, but three night-time MEDIUM descriptions had no summary at all. - Summaries stop when the GenAI tokens run out. Every review is meant to get one, so a review without a summary is the usual case once the quota is used up, not a setting. 70 of the 228 descriptions had none. - Descriptions and reviews come in either order. On 5 November from 17:55 to 17:56, four descriptions came 15 to 31 seconds after their reviews had started, with the reviews already ended and no summary to follow. At other times the description comes before the review's messages. So neither can wait for the other, and a description often has no summary to be judged against. - Descriptions link to reviews by object ID, but not one to one. A description's id (the same as its event_id) is a tracked object's ID, and reviews list their objects' IDs in data.detections. Over 31 days: - 238 of 247 descriptions were in some review's detections, always one on the same camera. - A review has one description for each of its objects, so it can have several: 162 reviews had a described object, and 139 had every object described. - An object can be in more than one review. Three were in two or three, once 19 hours apart, as a parked car is. - 9 descriptions, all from the doorbell, were in no review at all. The doorbell's alerts need the pend_entrance, driveway_top or pend zones, and object descriptions have no such filter, so Frigate described objects it had decided weren't worth a review. All 9 were NO RISK or LOW RISK. - A review's detections grow as objects join it, so an early new message can lack an object that a later update or end lists. - other_concerns are not threats in themselves. Visitors entering barn came with level 0 each time.
Frigate features used¶
From Frigate 0.18.2 and the Frigate integration 5.15.6 on the live install, with the MQTT messages checked against archive.
Review summaries¶
Config: review.genai, globally or for each camera, with enabled, alerts, detections, additional_concerns, activity_context_prompt and image_source.
When Frigate finishes a review summary, it stores it in the review's data.metadata. A real one, abridged:
{
"title": "Bird foraging in the turning circle",
"shortSummary": "A single bird is observed foraging on the gravel at the edge of the turning circle during the early morning hours.",
"scene": "The sequence begins at 07:52 AM on a Friday...",
"observations": ["At the start of the sequence, a bird is visible...", "..."],
"confidence": 1.0,
"potential_threat_level": 0,
"other_concerns": null,
"time": "Friday, 07:52 AM"
}
potential_threat_level: 0 normal, 1 suspicious, 2 critical, as Frigate's default activity context prompt defines them. A customised prompt can redefine what each level means, but the numbers stay the same.other_concerns: those of theadditional_concernsthe model saw, such as packages left at front door.- Delivery: a further
{prefix}/reviewsmessage withtypegenai, after the review'send, with the summary inafter.data.metadata, andbeforethe same review without one. Frigate generates summaries for alerts and, wherereview.genai.detectionsis on, detections, for as long as the GenAI provider's tokens last.
Object descriptions¶
Config: objects.genai, with enabled, prompt, object_prompts for each label, objects, required_zones and send_triggers.
Each one is sent on {prefix}/tracked_object_update as {"type": "description", "id": ..., "camera": ..., "description": ...}, with no label. The id is the tracked object's, so the notification proxy serves its snapshot.jpg and {camera}/master.m3u8, as it does for a review's detections. It's also how a description is matched to the review it's part of, through the review's data.detections.
Design¶
Both sources go on the existing camera and zone entries. A summary is about a review those entries track, by its review ID. A description is about a tracked object, which is usually, but not always, one of a tracked review's detections, and may come before or after that review's messages. So there's no new entry, discovery or device, and descriptions are handled whether or not their review is known.
Threat level priorities¶
Each threat level maps to a Supernotify priority, set for each camera or zone:
| Threat level | Meaning | Default priority |
|---|---|---|
| 0 | Normal | medium |
| 1 | Suspicious | high |
| 2 | Critical | critical |
Review summaries¶
- Tracker: a
genaimessage for a tracked review gives aDecisionwith a newReason.SUMMARY. An ended review is kept for a while, Wait for GenAI, so its summary still finds it. - Notification: an update of the review's notification, with the same tag, so it replaces the first one:
- title: the summary's
title - message: its
shortSummary, followed by anyother_concerns - priority: the threat level's, in place of the alert or detection priority
- same snapshot and HLS tap as now
- Lowest threat level: summaries below it are not sent. At 0, the default, every summary is an update, so the notification ends up with Frigate's own title and summary. At 1, only suspicious or worse.
- Without a summary: when the tokens have run out, the review's own notification, or its description, stands.
Object descriptions¶
- Subscription:
{prefix}/tracked_object_update, through the shared MQTT hub, as for reviews. Onlydescriptionmessages are used. - Linking: by the description's
idbeing in a tracked review's latestdetections, on the same camera. Where several reviews have it, the most recent one, since an object that stays put, such as a parked car, turns up in later reviews too. The review ID stays the notification's key, so a review's descriptions, however many, and its summary all update the same notification. - When the review is already known: the description is an update of the review's notification, as a summary is, with its message after rules, and its priority from rules or else the review's own. This includes a review that has ended but is still kept for Wait for GenAI.
- When it's not: the description is dropped, unless Descriptions without a review is on. In the evidence, these were objects outside the zones the camera's alerts require, which Frigate chose not to review, and all were no or low risk, and they'd skip the camera's object, zone and severity filters. With it on, the description is notified by itself, for a camera entry whose camera it's from, tagged
frigate_object_{id}, with the object's snapshot and HLS link. Zone entries can't tell which zone an object was in from a description, so they only take descriptions of reviews they already know. Descriptions are kept by object ID for Wait for GenAI. - When the review comes after: a review with a detection already described takes over that notification. It's sent with the description's tag and the description as its message, so the phone shows one notification, and the richer text, rather than two.
- When the summary comes after: it replaces the description, with its threat level's priority. Frigate's whole-review judgement wins over a single object's, as the evidence above suggests it should.
- When there's no summary: the description stands, so a night-time
MEDIUM RISKis still sent at the priority its rules give it.
Settings¶
A new collapsed GenAI section, on each camera and zone entry, shown only when the Frigate server has review summaries or object descriptions on:
- Review summaries: on by default, where Frigate has them on for the camera
- Lowest threat level: 0, 1 or 2, default 0
- Normal, Suspicious and Critical: the priority for each threat level, defaulting to
medium,highandcritical - Object descriptions: on by default, where Frigate has them on for the camera
- Wait for GenAI: how long an ended review, or a description with no review yet, is kept, default 120 seconds
- Descriptions without a review: off by default, for cameras only
Rules, for any source¶
Rules match a notification's message and change how it's sent. They apply to every notification, whatever its source: a review's own message, a summary or a description.
- Kept as subentries of the discovery entry, so each is added, changed and removed in the UI, with no YAML.
- Each rule has:
- a name
- a match: starts with, contains or regular expression, always case-insensitive
- what it does, any of:
- set the priority, to one of Supernotify's
critical,high,medium,loworminimum - silence the notification, so it's not sent
- apply Supernotify scenarios (
apply_scenarios), chosen from those Supernotify has - remove the matched text from the message
- set the priority, to one of Supernotify's
- When several match: silence wins, then the highest priority, and scenarios are combined. So order doesn't matter, and no ordering UI is needed.
- Tidying: after text is removed, leading punctuation and spaces go, and the first letter is capitalised. The message is never lower-cased.
- Silent updates stay silent, unless raised: with
alert_once, an update is sent atlow, unless it's a summary at threat level 1 or more, or a rule gives it a higher priority than the review's own. - A summary's threat level comes first: a rule's priority applies to a summary only when it's higher than the threat level gives. Silence and scenarios apply as usual.
Without Supernotify¶
Rules still silence notifications and remove text. Priority and scenarios have nothing to apply to.
Documentation¶
Its own page, GenAI notifications, with:
- turning on review summaries in Frigate, and the threat level settings
- why summaries are preferred to descriptions, from the evidence above
- suggested
additional_concerns - a suggested object description prompt prefix, and the rules that go with it:
| Rule | Match | Does |
|---|---|---|
| Critical risk | regular expression ^critical risk\W* | priority critical, remove match |
| High risk | regular expression ^high risk\W* | priority high, remove match |
| Medium risk | regular expression ^medium risk\W* | priority medium, remove match |
| No or low risk | regular expression ^(no\|low) risk\b | silence |
| Unclear | regular expression ^(unclear\|unknown\|uncertain)\b | silence |
| Birds | starts with bird identified | priority minimum, remove match |
- moving from the example automation below
Out of scope¶
- Frigate's GenAI chat, and
async_review_summarizeon demand - Notifying on
face,lprorclassificationmessages by themselves, which reviews already cover through sub-labels - Rules that match anything but the message, such as camera, label or time; Supernotify's scenarios and conditions already cover those
Example Prompt¶
This prefix comes from the live Frigate install, and is followed by a detailed description of the property, cameras and occupants.
Analyze the {label} in these images from the {camera} security
camera. Begin the summary with the risk level in upper case, one of NO
RISK, LOW RISK, MEDIUM RISK, HIGH RISK or CRITICAL RISK. The summary will
be read out on an Alexa device so keep it short. Focus on the actions,
behavior, and potential intent of the {label}, rather than just describing
its appearance.
Example Automation¶
As on the live install. Its priority never matches, as described in the review above.
alias: Frigate GenAI Alerts
description: ''
triggers:
- trigger: mqtt
topic: frigate/tracked_object_update
value_template: '{{ value_json.type }}'
payload: description
conditions:
- condition: template
value_template: >-
{{trigger.payload_json is defined and not
trigger.payload_json.description.startswith('LOW') and not
trigger.payload_json.description.startswith('NO RISK') and not
trigger.payload_json.description.startswith('UNCLEAR') and not
trigger.payload_json.description.startswith('UNKNOWN') and not
trigger.payload_json.description.startswith('UNCERTAIN')}}
actions:
- action: supernotify.notify
metadata: {}
data:
message: >-
{% set description = trigger.payload_json.description %} {{ description
| regex_replace('^(\w+)\s+RISK\s+','',ignorecase=True) | lower}}
title: Update on activity at {{trigger.payload_json.camera}}
priority: >-
{% set regex = "(\w+)\s+RISK\s+.*" %} {% set description =
trigger.payload_json.description %} {% if description is
match(regex,ignorecase=True) %} {{ description |
regex_findall_index(regex,ignorecase=True) | lower}} {% else %} medium
{% endif %}
media:
snapshot_url: http://192.168.1.100:8123/api/frigate/notifications/{{trigger.payload_json.id}}/thumbnail.jpg
camera_entity_id: camera.{{trigger.payload_json.camera}}
mode: single