* Rewrite intel GPU stats to use file descriptors instead of intel_gpu_top, leading to significantly better API for interaction and more accurate results
* Update tests
* Update docs
* Adjust approach
* Update strings
* use ReplayState enum
* extract shared ffmpeg progress helper
* make start call non-blocking with worker thread
* expose replay state on status endpoint and return 202 from start
* cancel in-flight ffmpeg when stop is called during preparation
* add replay i18n strings for preparing and error states
* show status in replay UI
* navigate immediately on 202 from debug replay menus and dialog
* remove unused
* simplify to use Job infrastructure
* tests
* cleanup and tweaks
* fetch schema
* update api spec
* formatting
* fix e2e test
* mypy
* clean up
* formatting
* fix
* fix test
* don't try to show camera image until status reports ready
* simplify loading logic
* fix race in latest_frame on debug replay shutdown
* remove toast when successfully stopping
it gets hidden almost immediately
- Add _auth_headers() helper to pass Bearer token when api_key is set
- Wire headers into all Ollama client instantiations (sync + async)
- Update docs with Ollama Cloud direct connection example and yaml config
* lpr fixes
- remove duplicate code
- fix min_area check for non frigate+ code path
- move log outside of non frigate+ code path
* only show chat link when a genai provider is configured with the chat role
* respect ui.timezone when generating fallback export names
* reapply radix pointer events fix to call sites that use navigate()
* formatting
* fall back to prior preview frame for short export thumbnails
* fix typing
* fix e2e test for chat navigation
* batch annotation offset to seek atomically and throttle slider drag
* add debug replay loading toast for explore actions
* Improve handling of webpush missing shortSummary
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* openvino log message and preview directory checks
* restrict config vars for viewer users
* recording timestamp fix
when startTime is exactly on an hour boundary, findIndex returns the first matching chunk, which is the previous hour's chunk (where before == startTime), instead of the correct chunk (where after == startTime)
the bug shows up when using the share timestamp feature and sharing a specific timestamp on the exact hour mark. when accessing the shared link, the timeline would jump to the incorrect hour
* use helper for chunked time range
* Adjustments to contributing docs
* tweak
* Improve wording
* tweak
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
The idle heartbeat check in BirdsEyeOutputProcess.update() compares
time.monotonic() (seconds since an arbitrary point, typically boot)
against last_output_time which is set from datetime.datetime.now().timestamp()
(Unix epoch seconds).
These are completely different time bases. The subtraction produces a
large negative number, so the idle heartbeat condition can never be
satisfied. This means birdseye stops sending frames when all cameras
go idle, instead of continuing at the configured idle_heartbeat_fps.
Use datetime.datetime.now().timestamp() consistently for both the
heartbeat check and the output time tracking.
* Move openai specific workaround so it doesn't apply to other providers
* Fix gemini tool calling
* Improve efficiency of frame listing for previews
* debug replay fixes
- initial selection without changing the radio button in the dialog would select 1 hour (rather than 1 minute)
- use CLIPS_DIR instead of CACHE_DIR so that longer replay clips don't cause tmpfs cache overflows
* don't re-render the tracking details overlay on every video time tick
* change pinned to planned
---------
Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
* ensure embeddings process restarts after maintainer thread crash
* add docs link to media sync settings
* fix color
Co-authored-by: Copilot <copilot@github.com>
* match link color with other sections
* ensure recording staleness threshold scales with segment_time
* docs tweak
* Fix llama.cpp media marker
* Fix gemini tools call
---------
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* add ui to camera config update topics enum
* add mqtt to camera config update enum
* ensure cleanup runs when an event end skips post-processing
* end any in-progress audio events when audio detection is disabled
we already end in-progress audio events when we disable a camera, but this mirrors that logic for specifically disabling audio detection
* Improve GenAI metadata
* fix invalid recording segment topic being misrouted to the valid handler
* Add confidence default to avoid unnecessary field causing issues
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* Reduce max frames per second to 1
* Use pydantic but don't fail if some constraints are not met.
* Adjust limits
* Adjust limits
* Cleanup
* add unsaved changes icon/popover to individual settings section
* allow changing camera friendly_name from camera management pane
---------
Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
* Test for image token usage in llama.cpp so we can more appropriately decide how many frames to include
* Limit based on frames per second
* handle zone case sensitivity
* Improve formatting
* Add observations field so model can build CoT before outputting used fields
* ensure classification wizard dialog is scrollable on mobile too
* add chat and features group to mobile menu
Co-authored-by: Copilot <copilot@github.com>
* Set min length for summary too
* Don't use orange for review item
---------
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* only send monitoring notifications to users with camera access
* check access to similarity search event id camera
* require admin role for storage usage endpoint
* check camera access for jsmpeg and birdseye cameras
* tests
* formatting
* use ffmpeg to probe rtsp urls instead of cv2
cv2 is faster (no subprocess launch) and will continue to be used for recording segments
* tweak faq
* change unsaved color to orange
avoids confusion with validation errors (red)
* don't use any variant of orange as a profile color
avoids confusion with unsaved changes
* more unsaved color tweaks
* add log when probing detect stream on startup
when users don't explicitly set detect.width and detect.height, we probe for them. sometimes the probe hangs (camera doesn't support UDP, like some Reolinks), so this log message will make that clearer
* add faq about probing detect stream
* fix stuck activity ring when tracked object transitions to stationary
* drop cache segments past retain cutoff regardless of retention mode
* add maintainer test
* backend
* frontend + i18n
* tests + api spec
* tweak backend to use Job infrastructure for exports
* frontend tweaks and Job infrastructure
* tests
* tweaks
- add ability to remove from case
- change location of counts in case card
* add stale export reaper on startup
* fix toaster close button color
* improve add dialog
* formatting
* hide max_concurrent from camera config export settings
* remove border
* refactor batch endpoint for multiple review items
* frontend
* tests and fastapi spec
* fix deletion of in-progress exports in a case
* tweaks
- hide cases when filtering cameras that have no exports from those cameras
- remove description from case card
- use textarea instead of input for case description in add new case dialog
* add auth exceptions for exports
* add e2e test for deleting cases with exports
* refactor delete and case endpoints
allow bulk deleting and reassigning
* frontend
- bulk selection like Review
- gate admin-only actions
- consolidate dialogs
- spacing/padding tweaks
* i18n and tests
* update openapi spec
* tweaks
- add None to case selection list
- allow new case creation from single cam export dialog
* fix codeql
* fix i18n
* remove unused
* fix frontend tests
* fix video playback stutter when GenAI dialog is open in detail stream
Inline `onOpen` callback in DetailStream.tsx:522 creates a new function identity every render. GenAISummaryChip.tsx:98's useEffect depends on [open, onOpen], so it re-fires on every parent re-render while the dialog is open. Each fire calls onSeek -> setCurrentTime -> seekToTimestamp, creating a continuous re-render + seek loop
* add /profiles to EXEMPT_PATHS for non-admin users
* skip debug_replay/status poll for non-admin users
* use subquery for timeline lookup to avoid SQLite variable limit
* Add score fusion helpers for find_similar_objects chat tool
* Add candidate query builder for find_similar_objects chat tool
* register find_similar_objects chat tool definition
* implement _execute_find_similar_objects chat tool dispatcher
* Dispatch find_similar_objects in chat tool executor
* Teach chat system prompt when to use find_similar_objects
* Add i18n strings for find_similar_objects chat tool
* Add frontend extractor for find_similar_objects tool response
* Render anchor badge and similarity scores in chat results
* formatting
* filter similarity results in python, not sqlite-vec
* extract pure chat helpers to chat_util module
* Teach chat system prompt about attached_event marker
* Add parseAttachedEvent and prependAttachment helpers
* Add i18n strings for chat event attachments
* Add ChatAttachmentChip component
* Make chat thumbnails attach to composer on click
* Render attachment chip in user chat bubbles
* Add ChatQuickReplies pill row component
* Add ChatPaperclipButton with event picker popover
* Wire event attachments into chat composer and messages
* add ability to stop streaming
* tweak cursor to appear at the end of the same line of the streaming response
* use abort signal
* add tooltip
* display label and camera on attachment chip
* display area as proper percentage in debug view
* match replay objects list with debug view
* motion search fixes
- tweak progress bar to exclude heatmap and inactive segments
- show metrics immediately on search start
- fix preview frame loading race
- fix polygon missing after dialog remount
- don't try to drag the image when dragging vertex of polygon
* add activity indicator to storage metrics
* make sub label query for events API endpoints case insensitive
* fix mobile export crash by removing stale iOS non-modal drawer workaround
* Remove titlecase to avoid Gemma4 handling plain labels as proper nouns
* Improve titling:
* Make directions more clear
* Properly capitalize delivery services
* update dispatcher config reference on save
* subscribe to review topic so ReviewDescriptionProcessor knows genai is enabled
* auto-send ON genai review WS message when enabled_in_config transitions to true
* remove unused object level
* update docs to clarify pre/post capture settings
* add ui docs links
* improve known_plates field in settings UI
* only show save all when multiple sections are changed
or if the section being changed is not currently being viewed
* fix docs
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* block ffmpeg args in custom exports for non-admin users only
* prune expired reconnect timestamps periodically in watchdog loop
reconnect timestamps were only pruned when a new reconnect
occurred. This meant a single reconnect would persist in the count indefinitely instead of expiring after 1 hour
* formatting
* refresh model dropdown after changing provider or base url
* decouple list_models from provider init
switching providers in the UI left an invalid model in the config, then _init_provider would fail and list_models would return an empty list, making it impossible to select a valid model
* add DictAsYamlField for genai provider and runtime options
* regenerate config translations
* chat tweaks
- add page title
- scroll if near bottom
- add tool call group that dynamically updates as tool calls are made
- add bouncing loading indicator and other UI polish
* tool call grouping
* Switch to a feature-based roles so it is easier to choose models for different tasks
* Fallback and try llama-swap format
* List models supported by provider
* Cleanup
* Add frontend
* Improve model loading
* Make it possible to update genai without restarting
* Cleanup
* Cleanup
* Mypy
* add guards to reject missing sub commands
* mask/zone bugfixes
- fix websocket crash when creating a new mask or zone before a name is assigned
- fix deleted masks and zones not disappearing from the list until navigating away
- fix deleting profile override not reverting to the base mask in the list
- fix inertia defaulting to nan
* disable save button on invalid form state
* fix validation for speed estimation
* ensure polygon is closed before allowing save
* require all masks and zones to be on the base config
* clarify dialog message and tooltip when removing an override
* clarify docs