webgpu-cluster / AGENTS.md
apssouza22's picture
Deploy: refresh Space build (landing + docs)
9210bde verified
|
Raw
History Blame Contribute Delete
3.92 kB
# AGENTS.md
Guidance for AI agents working in this repository.
## Commands
```bash
npm run dev # Vite (5180) + detection broker API (8787)
npm run build # Type-check + Vite bundle → docs/ (base /webgpu-video-ai/ for GitHub Pages)
npm run build:space # Same, but base / for Hugging Face Spaces
npm run start # Production broker + static UI (SERVE_STATIC=1, PORT from env)
npm run preview # Serve the production build locally
npm run dev:web # Vite only
npm run dev:api # API broker only (8787)
```
No test suite exists — verify manually in the browser and via `curl`.
## Architecture
**Browser GPU detection cluster:** RF-DETR (and optional SmolVLM) inference runs in Web Workers on WebGPU; a Node broker exposes HTTP so backends can submit jobs.
### Data flow
```
curl / Python / app
→ Node broker (server/) — task queue, image fetch
→ SSE → browser host (src/pages/addNode.ts)
→ ObjectDetector / VideoDescriber → *.worker.ts (Transformers.js, WebGPU)
→ results POST back to broker → HTTP response
```
### Key modules
| Path | Role |
|------|------|
| `src/pages/addNode.ts` | Registers host, listens for SSE tasks, runs inference |
| `src/pages/clusterMonitor.ts` | Monitor dashboard (`monitor.html`) |
| `src/detection/ObjectDetector.ts` | Main-thread API to the detection worker |
| `src/detection/detection.worker.ts` | RF-DETR; model: `onnx-community/rfdetr_medium-ONNX` |
| `src/videodescription/VideoDescriber.ts` | SmolVLM image description worker API |
| `server/index.ts` | Express broker: `/v1/detect`, `/v1/describe`, host registration, SSE |
| `shared/clusterModels.ts` | Model ids exposed to host UI and `GET /v1/models` |
### Web Worker and COOP/COEP
Transformers.js uses `device: 'webgpu'`. The dev server and production broker set `Cross-Origin-Opener-Policy: same-origin` and `Cross-Origin-Embedder-Policy: require-corp` (see `vite.config.ts` and `server/index.ts`).
### Build outputs
| Target | Command | Base path | Served by |
|--------|---------|-----------|-------------|
| GitHub Pages | `npm run build` | `/webgpu-video-ai/` | static host of `docs/` |
| Hugging Face Space | `npm run build:space` | `/` | Docker Space (`Dockerfile`) |
Transformers.js is excluded from Vite `optimizeDeps`; models download at runtime from the Hub.
## Hugging Face Space
| | |
|--|--|
| **Repo** | [apssouza22/webgpu-cluster](https://huggingface.co/spaces/apssouza22/webgpu-cluster) |
| **Live app** | [apssouza22-webgpu-cluster.hf.space](https://apssouza22-webgpu-cluster.hf.space/) |
| **Monitor** | [apssouza22-webgpu-cluster.hf.space/monitor.html](https://apssouza22-webgpu-cluster.hf.space/monitor.html) |
| **SDK** | Docker (`app_port: 7860`) |
The Space container runs the Node broker and serves prebuilt static files from `docs/`. **WebGPU inference runs in the visitor’s browser**, not on Space hardware — a browser tab must stay open with **Start hosting** for API calls to succeed.
### Deploy a new version
1. `npm run build:space` — refresh `docs/` (base `/`; never use `npm run build` for Spaces).
2. `hf upload apssouza22/webgpu-cluster . . --repo-type space --exclude ".git/*" --exclude "node_modules/*" --commit-message "…"`
3. Wait for Space stage `RUNNING`; verify `curl https://apssouza22-webgpu-cluster.hf.space/health`.
Requires `hf auth login`. The `Dockerfile` does **not** run Vite; always build locally first. Use project `.npmrc` so `package-lock.json` stays on the public npm registry.
Full checklist: [SPACES.md § Deploy a new version](./SPACES.md#deploy-a-new-version).
### Space vs local dev
| | Local (`npm run dev`) | Space |
|--|----------------------|-------|
| UI | http://localhost:5180 | https://apssouza22-webgpu-cluster.hf.space/ |
| API | proxied via Vite to :8787 | same origin on :7860 |
| Build | `npm run build` or `build:space` | `npm run build:space` only |