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

# Audio, video, and caller vision

> Use FaceTime Video with chert dev or BYOR callbacks, without a webhook.

**`chert dev` and `chert byor` support inbound audio and video without a public
webhook.** The caller chooses FaceTime Audio or FaceTime Video. There is no
`chert dev --video` switch: use the same command with either call type.

| What you want | What your agent needs |
| - | - |
| Talk to the caller | Publish audio and consume the caller's microphone track. |
| Show the caller your agent | Publish a camera track from the same participant that publishes the agent's audio. |
| See what the caller points at | Subscribe to the caller's video track and send frames to a vision-capable model or tool. |

Use an eligible Chert line with video enabled. Caller-camera delivery also needs
capture enabled and configured on that line's worker. Confirm those capabilities
with Chert for your assigned line; working audio does not establish either video
direction. A webhook is not a prerequisite for video.

## Start a video agent

For an existing named LiveKit agent, keep its normal startup command and run
`chert dev --agent YOUR_AGENT_NAME` from the folder with its LiveKit credentials.
No callback module or manual enrollment is needed for `dev`.

For a new agent, the published beta.10 CLI includes a starter that speaks and
publishes an animated face:

```bash theme={null}
npm install -g @trychert/facetime@0.1.0-beta.10
chert new my-video-agent --video
cd my-video-agent
npm install
```

Use macOS or Linux with Node 22.23.2 or 24.x for this walkthrough. Fill in the
generated `.env.local` with your `LIVEKIT_URL`, `LIVEKIT_API_KEY`,
`LIVEKIT_API_SECRET`, and `OPENAI_API_KEY`. Keep `AGENT_NAME=my-video-agent`, or
use the same new dispatch name in both your agent and CLI.

In the agent terminal:

```bash theme={null}
npm run check
npm start
```

In a second terminal in the same folder:

```bash theme={null}
chert login
chert doctor
chert dev --agent my-video-agent
```

Approve login for your assigned Chert project, then wait for the CLI to report
the connection and waiting agent. Call your line using **FaceTime Video** to
hear the agent and see its animated face. A FaceTime Audio call carries its
voice only. Follow [Connect and test](https://docs.trychert.com/facetime-cli/quickstart.md) for hangup,
cleanup, and line release.

`--video` belongs to `chert new`; it selects starter code. It does not enable
video on a line. `--muse` is a separate, specific agent integration and is not
required for ordinary video agents.

## Connect the caller's camera to your agent

The video starter **publishes an animated face but does not consume the caller's
camera**. It uses `AutoSubscribe.AUDIO_ONLY` and `videoEnabled: false` for input.
For a visual-support demo such as asking the caller to point at a port:

1. Use FaceTime Video with the caller's camera on and confirm caller capture is
   enabled on the assigned line.
2. Register track handlers before joining the room and enable video subscriptions
   in your agent. For generic `chert dev`, the caller is the bridge participant
   named `chert-bridge-<call ID>`; custom BYOR uses the bridge identity in your token.
3. Consume that participant's `facetime-remote-video` frames, alongside
   `facetime-remote-audio`. Connect video input to your vision-capable model or
   frame-processing tool; changing subscription settings alone does not add vision.
4. Handle camera mute, track removal, and replacement. Do not treat an old frame
   as the caller's current view.
5. Test recognition by changing what the camera shows. If your demo also draws a
   circle or annotation, render it into your agent's published video. The CLI
   does not supply object detection or a drawing tool.

Warm-room job metadata has no call media or call ID. Register subscriptions so
your agent can handle tracks arriving after the caller joins. For a cold dispatch,
job metadata includes `media.video`; custom BYOR callbacks receive `call.media`
directly. See [Audio and video](https://docs.trychert.com/facetime/audio-video.md) for the media contract.

## Publish the agent's video

Keep exactly one eligible remote audio publisher in the room. The FaceTime
bridge takes the agent video from that same participant. If an avatar service
publishes both voice and video, avoid also publishing a second agent audio track.
Video published by a different participant from the voice is not shown.

Without agent video, the caller sees the line's default picture. This does not
by itself tell you whether caller video is reaching your agent.

## Custom BYOR callbacks

The [callback workflow](https://docs.trychert.com/facetime-cli/byor.md) receives
`call.media: { audio: true, video: boolean }`. Prepare a session for the requested
media before returning `ready: true`; decline if your application cannot support
it within the supplied deadline. Your application owns readiness and cleanup.
Manual enrollment is a setup requirement for this mode, not a restriction to audio.

The separate [create-room adapter](https://docs.trychert.com/facetime-cli/create-room.md) remains audio-only.
Use `dev` or `byor` for video.

## Check both video directions

`chert dev` reports the observed agent audio/video publications after a call
starts. These diagnostics help find missing video or a mismatched publisher;
they do not prove that frames reached FaceTime or your vision model.

| Symptom | Check |
| - | - |
| Voice works but no agent video | Use FaceTime Video; publish a camera track from the participant that speaks. |
| Default picture despite a video publisher | Check that audio and video come from the same participant. |
| Agent cannot see the caller | Check caller camera, worker capture, video subscriptions, and model/frame input separately. |
| Call ends with several audio publishers | Keep one eligible remote audio publisher; avoid duplicate agent/avatar voice tracks. |

On the intended line, verify two-way speech, changing agent video, changing
caller video reaching your vision pipeline, caller hangup, room cleanup, and a
fresh second call. `doctor` and room membership do not replace these checks.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.