> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zeroruntime.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Video Input

> Stream live video to a realtime model for continuous vision, from the participant's camera or a shared screen.

For continuous "watch what I'm doing" interactions, pair vision with a
[realtime](/build/configure-a-pipeline/modes) model. The model receives video frames as the
conversation flows, so the agent can react to what it sees in real time (no explicit capture
step needed).

<Note>
  Video input rides on whatever video track the participant publishes. That can be their
  **camera** or a **screen share**; the agent sees either the same way.
</Note>

## Realtime vision

Use a realtime model in the pipeline and turn on `vision=True` for the session, on the
`zrt.Room` you invoke (or on `zrt.serve()` to apply it to every caller). Frames from the
participant's video are forwarded to the model alongside audio:

<CodeGroup>
  ```python title="main.py" Python theme={null}
  import zrt
  from zrt import Agent, Pipeline
  from zrt.plugins import OpenAIRealtime, OpenAIRealtimeConfig
  from zrt.inference import AICousticsDenoise

  AGENT_ID = "vision-agent"

  pipeline = Pipeline(
      llm=OpenAIRealtime(
          config=OpenAIRealtimeConfig(model="gpt-4o-realtime-preview", voice="alloy")
      ),
      denoise=AICousticsDenoise(model_id="quail-vf-2.2-l-16khz"),
  )

  class VisionAgent(Agent):
      def __init__(self):
          super().__init__(
              agent_id=AGENT_ID,
              instructions="You can see the participant's video. Describe what you observe.",
              pipeline=pipeline,
          )

  if __name__ == "__main__":
      # Pass the class itself (not an instance): serve() builds a fresh VisionAgent +
      # pipeline per call, which is required for correct per-call state under concurrent calls.
      zrt.serve(
          VisionAgent,
          on_ready=lambda: zrt.invoke(
              AGENT_ID, room=zrt.Room(playground=True, vision=True)
          ),
      )
  ```
</CodeGroup>

For on-demand snapshots in a cascade pipeline instead, see [Image Input](/build/modalities/vision/image-input).

## References

<Tabs>
  <Tab title="Python">
    #### Examples

    <CardGroup cols={2}>
      <Card title="Vision (Realtime)" icon="github" href="https://github.com/ZeroRuntimeAI/zrt-python-sdk-examples/blob/main/features/vision.py">
        Stream video frames to a realtime agent.
      </Card>

      <Card title="Vision Hook" icon="github" href="https://github.com/ZeroRuntimeAI/zrt-python-sdk-examples">
        Hook into frames before they reach the model.
      </Card>
    </CardGroup>
  </Tab>
</Tabs>
