POST /streams. This integration goes the other direction: an agent that joins your LiveKit room, watches whatever video is published there, and posts structured JSON observations back to the room’s participants.
Use it for live camera monitoring, screen-understanding copilots, RTSP/CCTV analysis, or any app where participants need a model’s read on live video.
Template
The fastest path is the community template, a LiveKit Agents worker in Python:How it works
- The agent joins the room and subscribes to the first video track.
- At
VISION_FPS(default 2), it sends the latest frame to/chat/completionswith yourVISION_PROMPTand a JSON schema. - Each response is published to the room as a text stream on the
visiontopic, with the request latency attached.
Ingest modes
The template supports two ways of getting pixels to the model, set byOVERSHOOT_INGEST_MODE:
frames(default): each request carries the latest frame as an inline JPEG. No extra moving parts.stream: the agent republishes the room’s video into an Overshoot Stream over WebRTC and references it asovs://streams/{stream_id}?frame_index=-1. Requests carry no pixels; the model reads the latest ingested frame server-side. See Stream media URLs.
stream mode is the same pathway described in LiveKit client flow: the template’s bridge calls POST /streams, publishes frames to the returned LiveKit room, and renews the lease with /keepalive.
Structured output
Define the output shape with a JSON schema inVISION_SCHEMA. The agent requests json_object mode with the schema in the prompt, which is the fast path for google/gemma-4-26B-A4B-it on vision input. The default schema: