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

> ## Agent Instructions
> Reactor hosts multiple models, each with its own connect slug (modelName) and command/event schema. The catalog of every model — slug, typed SDK package, and links to its schema — is at /model-api-reference/overview. Some models expose one slug per experience (e.g. HappyOyster); always take the slug from the model's own pages, never guess it.
> Fastest path to a working app: `npx create-reactor-app my-app --model=<slug>` scaffolds a complete app with secure auth wired up. Typed TypeScript SDKs are published as @reactor-models/<model>; Python uses the base reactor-sdk package.
> Auth: exchange an API key (rk_...) for a JWT via POST https://api.reactor.inc/tokens from your server. Never put the API key in client-side code.
> Append .md to any docs URL for clean Markdown. Search these docs via the MCP server at https://docs.reactor.inc/mcp.

# H3 Reference Turbo Realtime overview

> What H3 Reference Turbo Realtime is, its key features, and a quick start.

export const ModelRate = ({model}) => {
  const [data, setData] = useState(null);
  const [error, setError] = useState(false);
  const [loading, setLoading] = useState(true);
  useEffect(() => {
    const ctrl = new AbortController();
    fetch("https://api.reactor.inc/pricing", {
      signal: ctrl.signal
    }).then(r => {
      if (!r.ok) throw new Error(`HTTP ${r.status}`);
      return r.json();
    }).then(json => {
      setData(json);
      setLoading(false);
    }).catch(err => {
      if (err.name === "AbortError") return;
      setError(true);
      setLoading(false);
    });
    return () => ctrl.abort();
  }, []);
  if (loading) {
    return <span aria-label="loading pricing" className="inline-block h-4 w-28 rounded bg-zinc-950/10 dark:bg-white/10 animate-pulse align-middle" />;
  }
  const creditsPerDollar = data?.settings?.credits_per_dollar;
  const amountPerSec = data?.models?.find(m => m.name === model)?.rate?.amount_per_sec;
  const canRender = !error && creditsPerDollar && typeof amountPerSec === "number";
  if (!canRender) {
    return <span className="text-zinc-950/60 dark:text-white/60">see current rate below</span>;
  }
  const dollarsPerSec = amountPerSec / creditsPerDollar;
  const perSec = dollarsPerSec.toFixed(4);
  const perHour = Math.round(dollarsPerSec * 3600);
  return <span>
      <strong>${perSec}/sec</strong>{" "}
      <span className="text-zinc-950/60 dark:text-white/60">(${perHour}/hr)</span>
    </span>;
};

**H3 Reference Turbo Realtime** turns reference images and a prompt into video with synchronized
audio. Each clip takes one to nine ordered reference images to guide its subjects and appearance.
Describe what happens in the scene, how the camera moves, and what the viewer hears.

Every clip keeps its own prompt and references. Queue several clips, choose their playback order,
and play them on demand or let autoplay start each ready clip.

The H3 Reference Turbo Realtime reference is split across four pages: this overview, the complete
[command and event schema](/model-api-reference/h3-reference-to-video-turbo-realtime/schema), the
[prompt guide](/model-api-reference/h3-reference-to-video-turbo-realtime/prompt-guide) for
describing scenes with reference images, and a
[tutorial](/model-api-reference/h3-reference-to-video-turbo-realtime/tutorial) covering uploads,
queues, and playback.

The base wire protocol is the same as every other Reactor model: open a session with the
[`Reactor`](/sdk-reference/reactor-class) class, send named commands, and receive events. The model
name is **`reactor/h3-reference-to-video-turbo-realtime`**. The
[`@reactor-models/h3-reference-to-video-turbo-realtime` typed package](/sdk-reference/typed-model-sdk)
adds named methods and React hooks for this protocol.

<Note>
  Pass `reactor/h3-reference-to-video-turbo-realtime` to the SDK. That is the model name on the
  wire, and it is also the name these pages use in their URL. Pass the shorter
  `h3-reference-turbo-realtime` to `create-reactor-app` as the template name. "H3 Reference Turbo
  Realtime" is the display name, used in prose and in the sidebar. Usage is billed per second of
  session time, not per second of generated video, so a session left open while you compose still
  bills; see [Billing](/resources/billing) for how billing maps to rates.
</Note>

<Warning>
  This model is not [FastH3](/model-api-reference/fast-h3). Both queue clips and play them on
  demand, so their commands look alike, but they take different inputs and are separate models on
  the platform. H3 Reference Turbo Realtime requires one to nine **reference images** per clip,
  which guide subjects and appearance. FastH3 opens a clip from text, an uploaded `starting_frame`,
  or an `ending_frame`, and has no reference images. Neither is a drop-in replacement for the other,
  and FastH3 is still served under `reactor/fast-h3`.
</Warning>

## At a glance

| Spec              | Value                                                                      |
| ----------------- | -------------------------------------------------------------------------- |
| **Model name**    | `reactor/h3-reference-to-video-turbo-realtime`                             |
| **Pricing**       | <ModelRate model="h3-reference-to-video-turbo-realtime" />                 |
| **Input**         | One to nine JPEG, PNG, or WebP reference images and a text prompt          |
| **Output**        | Video with synchronized audio                                              |
| **Clip duration** | Approximately 5–15 seconds                                                 |
| **Resolution**    | 1344 × 768 (16:9), 768 × 768 (1:1), 768 × 1344 (9:16), or 1024 × 768 (4:3) |

<Tip>
  Images are numbered in the order you provide them. Use `Picture 1`, `Picture 2`, and so on in your
  prompt to identify each reference and describe its role in the scene.
</Tip>

## Key features

<CardGroup cols={3}>
  <Card title="Reference to video" icon="images">
    Combine up to nine references to guide the subjects and appearance of each scene.
  </Card>

  <Card title="Synchronized audio" icon="volume-2">
    Describe action and sound in the same prompt. Video and audio play together on the main\_video
    and main\_audio tracks.
  </Card>

  <Card title="Playback control" icon="list-video">
    Queue clips, change their order, and choose what plays next. Enable autoplay to start ready
    clips whenever playback is idle.
  </Card>
</CardGroup>

## Quick start

The fastest path to a working H3 Reference Turbo Realtime app is the `create-reactor-app` CLI. The
template it scaffolds opens on a scene you can generate straight away, and shows the reference set,
the prompt, and the follow-on shot in one place.

<Tabs>
  <Tab title="npm">
    ```shell theme={"theme":{"light":"github-light","dark":"github-dark-high-contrast"}}
    npx create-reactor-app my-h3-app --model=h3-reference-turbo-realtime
    ```
  </Tab>

  <Tab title="pnpm">
    ```shell theme={"theme":{"light":"github-light","dark":"github-dark-high-contrast"}}
    pnpm create reactor-app my-h3-app --model=h3-reference-turbo-realtime
    ```
  </Tab>
</Tabs>

Building it yourself instead? Install the typed package and connect with it:

```shell theme={"theme":{"light":"github-light","dark":"github-dark-high-contrast"}}
npm install @reactor-models/h3-reference-to-video-turbo-realtime
```

Start with a reference image and a prompt describing the scene you want. Connect to the model,
upload your image, and queue the clip. Enable autoplay to play it as soon as it is ready.

See [Authentication](/authentication) to connect your app and the
[prompt guide](/model-api-reference/h3-reference-to-video-turbo-realtime/prompt-guide) for writing
your first scene.

## How it works

1. **Connect** to the model. The connection moves through
   `disconnected → connecting → waiting → ready`. The first `state_update` and `queue_update`
   messages describe the session and its queues.
2. **Upload reference images.** Use the SDK's file upload method, then supply the returned
   references with each clip's prompt. Each request keeps its own inputs.
3. **Enqueue a clip.** It receives a clip ID and enters the generation queue. When the build
   finishes, `clip_generated` announces that it has entered the playout queue.
4. **Play a ready clip.** Call `play` with a clip ID, or omit the ID to play the front of the queue.
   With autoplay enabled, ready clips start whenever playback is idle. Empty queues wait for more
   clips.
5. **Control what comes next.** Use `move` to reorder queued clips and `pop` to remove them. Use
   `stop` to cut the playing clip while leaving the queues intact, or `reset` to clear the session.
