LingBot is a real-time, navigable video model. It takes a seed image plus a text prompt as visual and stylistic anchors, then continuously generates a video stream you walk through with WASD and look around with arrow keys. LingBot produces an infinite, interactive stream that responds to commands frame-to-frame.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.
At a glance
| Spec | Value |
|---|---|
| Model name | lingbot |
| Pricing | |
| Throughput | 16 fps |
| Latency | < 1 second |
| Resolution | 1664 × 960 |
new Reactor({ modelName: "lingbot" }). See
Pricing & Billing for how billing works.
Key features
Interactive WASD navigation
Drive the camera through a generated world with movement and look commands that apply at the
next chunk boundary.
Image-anchored generation
A seed image fixes the visual identity of the world; the prompt steers the rest.
Live prompt swapping
Re-fire
set_prompt at any time mid-generation to swap atmosphere, lighting, or events
without restarting the session.Quick Start
A minimal connect-and-generate flow looks like:Prompt Guide
LingBot’s output is highly sensitive to how prompts are written. The text encoder treats descriptors like “camera pans left” or “tracking shot” as content rather than camera instructions, and leaking imperative camera verbs into the prompt degrades output noticeably. For the full recipe (sentence count, anchor density, hold-prompts vs. layered composition, and worked examples), see the LingBot Prompt Guide.Tracks
| Direction | Name | Type | Format | Rate |
|---|---|---|---|---|
| Outbound | main_video | Video | (N, H, W, 3) uint8 RGB | Adaptive, paced to model throughput |
Session lifecycle
LingBot sessions move through three states: WAITING, GENERATING, and PAUSED. WAITING. Default state afterconnect. The model is idle and waiting on conditions. Valid commands: every set_* plus start. No frames are emitted.
GENERATING. Frames stream on main_video. start requires that both a prompt and a seed image have been set; sending start without them fails with a command_error. Valid commands during generation: set_prompt, the movement and look setters, set_rotation_speed_deg, pause, and reset. Each completed chunk emits a chunk_complete event.
PAUSED. Reached via pause once the current chunk finishes. Frames stop. Valid commands: resume and reset. resume picks up from the next chunk; reset clears all session state and returns to WAITING.
When all chunks of a run complete, LingBot emits generation_complete and, if the session is still started, kicks off the next run automatically with the same prompt and image. Call reset to stop the loop and re-stage with new conditions.
Commands
| Command | Params | Preconditions | Effect |
|---|---|---|---|
set_prompt | prompt: string (≤ 1000 chars) | - | Stores the prompt. Re-applied on the next chunk boundary. Emits prompt_accepted then conditions_ready. |
set_image | image: FileRef (from uploadFile) | - | Decodes the uploaded file and caches it as the seed image. Rejects non-image MIME types with command_error. Emits image_accepted then conditions_ready. |
set_movement | movement: "idle" | "forward" | "back" | "strafe_left" | "strafe_right" | - | Sets WASD movement direction. idle holds position. Applied on the next chunk boundary. |
set_look_horizontal | look_horizontal: "idle" | "left" | "right" | - | Yaw rotation direction. idle holds the heading. |
set_look_vertical | look_vertical: "idle" | "up" | "down" | - | Pitch rotation direction. idle holds the pitch. |
set_rotation_speed_deg | rotation_speed_deg: float (0.0 – 30.0) | - | Degrees the camera rotates per latent frame when a look axis is active. Default 5.0. |
set_seed | seed: int (≥ 0) | Before start | RNG seed for the next generation. Read once when start fires; later changes require reset then a new start. Default 42. |
start | - | A prompt and a seed image have been set | Begins generation. Fails with command_error if conditions are missing. Emits generation_started. |
pause | - | In GENERATING | Pauses after the current chunk finishes. Emits generation_paused. |
resume | - | In PAUSED | Resumes generation. Emits generation_resumed. |
reset | - | - | Clears prompt, image, and the started flag. Returns to WAITING. Emits generation_reset. |
Movement and look
Movement and look are persistent state, not pulses. Sendingset_movement with "forward" puts the character into a forward-walking state that continues across chunks until you send "idle" or a different direction. The same applies to the two look axes. To stop moving, explicitly send the "idle" value.
Look-axis rotation rate is governed by set_rotation_speed_deg: 5° per latent frame by default. Setting it to 0 disables rotation entirely even if a look axis is non-idle.
Why changes feel “delayed”
LingBot generates output one chunk at a time. A command sent mid-chunk does not interrupt the current chunk; it applies at the next chunk boundary. For most commands this is fine; for a quick tap on a key, it can mean the change never visibly lands if you release before the next chunk starts.Messages
LingBot emits the following messages. Every message is delivered as JSON{ "type": "<name>", "data": { … } } over the same channel as all other Reactor message events.
| Event | When | Payload |
|---|---|---|
prompt_accepted | After set_prompt | { prompt: string } |
image_accepted | After set_image decodes | { width: int, height: int } |
conditions_ready | After set_prompt or set_image | { has_prompt: bool, has_image: bool } |
generation_started | After start | { prompt: string, chunk_num: int, frame_num: int } |
chunk_complete | After each chunk emits | { chunk_index: int, frames_emitted: int, active_prompt: string, active_action: string } |
generation_paused | After pause | { chunk_index: int } |
generation_resumed | After resume | { chunk_index: int } |
generation_complete | After all chunks of a run finish | { total_chunks: int } |
generation_reset | After reset | { reason: string } |
command_error | When a command is rejected | { command: string, reason: string } |
state | On connect, after every state-mutating command, and after every chunk_complete | Full session snapshot; see below |
state payload
state is the single source of truth for driving UI. Subscribe once and treat it as the authoritative session snapshot; you generally do not need to track individual set_* and chunk_complete events yourself.
| Field | Type | Meaning |
|---|---|---|
running | bool | started && !paused. Equivalent to “frames are actively streaming” |
started | bool | True once start has been accepted; remains true through pauses |
paused | bool | True while in the PAUSED state |
current_chunk | int | Zero-based index of the last completed chunk; 0 before the first chunk |
current_prompt | string | null | The prompt currently driving generation, or null if none set |
has_prompt | bool | Whether a prompt has been set this session |
has_image | bool | Whether a seed image has been set this session |
current_action | string | +-joined composite of movement and look. E.g. "w+left", or "still" when idle |
movement | string | Current value of the movement input field |
look_horizontal | string | Current value of the look_horizontal input field |
look_vertical | string | Current value of the look_vertical input field |
rotation_speed_deg | float | Current rotation speed (0.0 – 30.0) |
seed | int | Current seed value (effective only on the next start) |