From 7e4353d1ff35068c7d746a77de738de60a863de0 Mon Sep 17 00:00:00 2001 From: German Date: Wed, 26 Aug 2026 15:53:43 -0300 Subject: [PATCH 1/2] Pin reactor-runtime in the brightness and echo example requirements reactor build --no-dockerfile no longer derives the runtime's pip install from reactor.yaml's build.runtime_version alone - the pin belongs in requirements.txt, matching what reactor init scaffolds. Without it the generated image never installs reactor-runtime and reactor run fails with ModuleNotFoundError. Both examples also pick up the apiVersion/kind header reactor.yaml now expects. Signed-off-by: German --- examples/brightness/reactor.yaml | 2 ++ examples/brightness/requirements.txt | 12 ++++++------ examples/echo/reactor.yaml | 2 ++ examples/echo/requirements.txt | 12 ++++++------ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/examples/brightness/reactor.yaml b/examples/brightness/reactor.yaml index aa18e24..754d6e6 100644 --- a/examples/brightness/reactor.yaml +++ b/examples/brightness/reactor.yaml @@ -1,4 +1,6 @@ $schema: reactor/v1 +apiVersion: v1beta +kind: VideoModel # `reactor build` / `reactor run` read this file: `model:` describes the model, # `runtime:` names the class to serve, and `build:` defines the image every diff --git a/examples/brightness/requirements.txt b/examples/brightness/requirements.txt index eeec269..a178130 100644 --- a/examples/brightness/requirements.txt +++ b/examples/brightness/requirements.txt @@ -1,10 +1,10 @@ -# Python dependencies installed into the model image, in one pass alongside -# the runtime, so a version conflict between them fails the build instead of -# surfacing at model load. +# Python dependencies installed into the model image, in one pip pass, so a +# version conflict between them fails the build instead of surfacing at +# model load. # -# reactor-runtime does not belong here: reactor.yaml's build.runtime_version -# pins the release the image installs, and stating it twice is how the two -# come to disagree. +# reactor-runtime is the runtime itself. Its version is pinned here; bump +# this line to upgrade, and reactor.yaml's build.runtime_version to match. +reactor-runtime==3.2.4 # Pillow draws the client-set caption over each frame. Must be >=10.1: the # scalable default font (ImageFont.load_default(size=...)) that keeps the caption diff --git a/examples/echo/reactor.yaml b/examples/echo/reactor.yaml index 7c6861a..b45d0bd 100644 --- a/examples/echo/reactor.yaml +++ b/examples/echo/reactor.yaml @@ -1,4 +1,6 @@ $schema: reactor/v1 +apiVersion: v1beta +kind: VideoModel # `reactor build` / `reactor run` read this file: `model:` describes the model, # `runtime:` names the class to serve, and `build:` defines the image every diff --git a/examples/echo/requirements.txt b/examples/echo/requirements.txt index b85a41d..e76a2bb 100644 --- a/examples/echo/requirements.txt +++ b/examples/echo/requirements.txt @@ -1,10 +1,10 @@ -# Python dependencies installed into the model image, in one pass alongside -# the runtime, so a version conflict between them fails the build instead of -# surfacing at model load. +# Python dependencies installed into the model image, in one pip pass, so a +# version conflict between them fails the build instead of surfacing at +# model load. # -# reactor-runtime does not belong here: reactor.yaml's build.runtime_version -# pins the release the image installs, and stating it twice is how the two -# come to disagree. +# reactor-runtime is the runtime itself. Its version is pinned here; bump +# this line to upgrade, and reactor.yaml's build.runtime_version to match. +reactor-runtime==3.2.4 # OpenCV powers the video effects. Must be >=4.10: the runtime ships numpy 2.x, # and only opencv-python(-headless) 4.10+ is built against the numpy 2 ABI. The From 4bfc19fe65887e9b211ab8206ac86c340749f0b0 Mon Sep 17 00:00:00 2001 From: German Date: Wed, 26 Aug 2026 16:01:06 -0300 Subject: [PATCH 2/2] Document --no-dockerfile in the brightness and echo example READMEs reactor build with no flags requires an on-disk Dockerfile; neither example ships one, so the documented reactor build / reactor run commands fail with "dockerfile not found". Both READMEs now pass --no-dockerfile, matching how the workspace actually builds. Signed-off-by: German --- examples/brightness/README.md | 15 ++++++++------- examples/echo/README.md | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/examples/brightness/README.md b/examples/brightness/README.md index f81b2ad..5034a62 100644 --- a/examples/brightness/README.md +++ b/examples/brightness/README.md @@ -17,21 +17,22 @@ to install on your host but the CLI and Docker. ```sh cd examples/brightness -reactor build +reactor build --no-dockerfile reactor run ``` -The build is automatic: `reactor build` renders the image from `reactor.yaml`'s -`build:` block — no Dockerfile to write or maintain. `build.runtime_version` -pins the `reactor-runtime` release the image installs; bump it there to +`--no-dockerfile` renders the image from `reactor.yaml`'s `build:` block — no +Dockerfile to write or maintain. `build.runtime_version` must match the +`reactor-runtime==` pin in `requirements.txt`; bump both together to upgrade. `reactor run` reuses the image `reactor build` produced (it builds one on first -run if none exists), then serves WebRTC signaling on `http://localhost:8080`. -Rebuild after editing anything baked into the image: +run if none exists, so pass `--no-dockerfile` there too), then serves WebRTC +signaling on `http://localhost:8080`. Rebuild after editing anything baked +into the image: ```sh -reactor build && reactor run +reactor build --no-dockerfile && reactor run ``` Connect a client from the [Reactor Sandbox](https://reactor-sandbox.vercel.app/) diff --git a/examples/echo/README.md b/examples/echo/README.md index 2794840..ac384c6 100644 --- a/examples/echo/README.md +++ b/examples/echo/README.md @@ -14,21 +14,22 @@ to install on your host but the CLI and Docker. ```sh cd examples/echo -reactor build +reactor build --no-dockerfile reactor run ``` -The build is automatic: `reactor build` renders the image from `reactor.yaml`'s -`build:` block — no Dockerfile to write or maintain. `build.runtime_version` -pins the `reactor-runtime` release the image installs; bump it there to +`--no-dockerfile` renders the image from `reactor.yaml`'s `build:` block — no +Dockerfile to write or maintain. `build.runtime_version` must match the +`reactor-runtime==` pin in `requirements.txt`; bump both together to upgrade. `reactor run` reuses the image `reactor build` produced (it builds one on first -run if none exists), then serves WebRTC signaling on `http://localhost:8080`. -Rebuild after editing anything baked into the image: +run if none exists, so pass `--no-dockerfile` there too), then serves WebRTC +signaling on `http://localhost:8080`. Rebuild after editing anything baked +into the image: ```sh -reactor build && reactor run +reactor build --no-dockerfile && reactor run ``` Connect a client from the [Reactor Sandbox](https://reactor-sandbox.vercel.app/)