diff --git a/AGENTS.md b/AGENTS.md
index 705ee418bb..b52ecc2571 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -242,7 +242,7 @@ Ensure all pre-commit hooks pass by running `uv run pre-commit run -a`. A clean
- **uv version pin:** Root `pyproject.toml` requires `uv>=0.9.14,<0.10.0`. Newer uv releases (e.g. 0.11.x) fail `uv sync` with a version mismatch. Install the pinned range before bootstrapping: `pip install 'uv>=0.9.14,<0.10.0'`.
- **Native build deps:** `make bootstrap-python` builds `annoy` (via `nemoguardrails`). Install system headers once per VM image: `sudo apt-get install -y python3-dev build-essential`.
- **Python bootstrap:** Run `make bootstrap-python` from repo root (creates `.venv`, runs `uv sync --frozen --all-packages`). See [SETUP.md](SETUP.md) for the full playbook.
-- **Studio (optional):** `make bootstrap-studio` requires Node **22.18.x** and pnpm per `web/package.json` engines. The VM may ship an older Node (e.g. 22.14); API services still run without Studio assets. Upgrade Node then run `make bootstrap-studio` if you need `http://localhost:8080/studio/`.
+- **Studio (optional):** `make bootstrap-studio` requires Node **22.23.x** and pnpm per `web/package.json` engines. The VM may ship an older Node (e.g. 22.14); API services still run without Studio assets. Upgrade Node then run `make bootstrap-studio` if you need `http://localhost:8080/studio/`.
### Running the platform
diff --git a/Makefile b/Makefile
index d512d1a5bb..e8433caea3 100644
--- a/Makefile
+++ b/Makefile
@@ -233,7 +233,7 @@ bootstrap: bootstrap-python ## Bootstrap the local dev environment, including St
echo "warning: optional Studio asset bootstrap did not complete."; \
echo "Studio will be unavailable at http://localhost:8080/studio/ until assets are built."; \
echo "Install Node.js matching web/package.json with pnpm, then rerun:"; \
- echo " pnpm env use --global 22.18.0"; \
+ echo " pnpm env use --global 22.23.2"; \
echo " make bootstrap-studio"; \
fi
@echo "bootstrap completed"
diff --git a/README.md b/README.md
index ee7f5d2f97..7395ad0ee0 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ NeMo Platform brings NVIDIA NeMo libraries together under one CLI, Python SDK, a
## Get started
-**Prerequisites:** Python 3.12-3.13, `uv>=0.9.14,<0.10.0`, and an API key for an inference provider (NVIDIA Build, OpenAI, Anthropic, Google Gemini, or a local Ollama instance). For source development, you also need Git, GNU Make, and Node.js 22.18.x with `pnpm` if you want the web UI.
+**Prerequisites:** Python 3.12-3.13, `uv>=0.9.14,<0.10.0`, and an API key for an inference provider (NVIDIA Build, OpenAI, Anthropic, Google Gemini, or a local Ollama instance). For source development, you also need Git, GNU Make, and — if you want the web UI — Node.js `>=22.23.2 <23` with `pnpm>=10.34.5`.
Quick install from PyPI:
@@ -79,7 +79,7 @@ nemo services run
Studio (web UI) bootstrap troubleshooting
-If `make bootstrap` reports that Studio asset bootstrap did not complete, the API still runs but the web UI is unavailable until the bundle is built. Install Node 22.18.x with `pnpm env use --global 22.18.0`, then run `make bootstrap-studio` from the repo root.
+If `make bootstrap` reports that Studio asset bootstrap did not complete, the API still runs but the web UI is unavailable until the bundle is built. Install Node 22.23.x with `pnpm env use --global 22.23.2`, then run `make bootstrap-studio` from the repo root.
diff --git a/docs/get-started/setup.mdx b/docs/get-started/setup.mdx
index dca5008dd1..fb99f940ba 100644
--- a/docs/get-started/setup.mdx
+++ b/docs/get-started/setup.mdx
@@ -13,7 +13,7 @@ Install NeMo Platform and start working with AI agents.
- An API key from one of: [NVIDIA Build](https://build.nvidia.com), [OpenAI](https://platform.openai.com/api-keys), [Anthropic](https://console.anthropic.com/settings/keys), [Google Gemini](https://aistudio.google.com/apikey), or a local [Ollama](https://ollama.com) instance (no key needed)
- 16 GB available disk space and 8 GB RAM
- For the PyPI install: `pip` in a Python environment
-- For the source checkout install: [Git](https://git-scm.com/), GNU Make, [uv](https://docs.astral.sh/uv/) `>=0.9.14,<0.10.0`, [Node.js (≥22.18.0, \<23)](https://nodejs.org/en/download) satisfying `web/package.json`, and [pnpm](https://pnpm.io/installation)
+- For the source checkout install: [Git](https://git-scm.com/), GNU Make, [uv](https://docs.astral.sh/uv/) `>=0.9.14,<0.10.0`, [Node.js (≥22.23.2, \<23)](https://nodejs.org/en/download) satisfying `web/package.json`, and [pnpm](https://pnpm.io/installation)
## Install
@@ -50,7 +50,7 @@ source .venv/bin/activate
The `make bootstrap` target creates the Python environment, syncs Python dependencies, builds Studio assets, and installs local plugins.
-If Studio asset bootstrap fails, the API can still run but Studio is unavailable until the web bundle is built. Install Node.js with pnpm using `pnpm env use --global 22.18.0`, then rerun `make bootstrap-studio` from the repository root.
+If Studio asset bootstrap fails, the API can still run but Studio is unavailable until the web bundle is built. Install Node.js with pnpm using `pnpm env use --global 22.23.2`, then rerun `make bootstrap-studio` from the repository root.
Verify the installation:
@@ -244,7 +244,7 @@ Check `~/.local/state/nmp/instances//services.log` in the directory where
### Studio returns 404 or unavailable
-Studio requires the FastAPI web assets built by `make bootstrap-studio`. If `make bootstrap` warned that Studio asset bootstrap did not complete, install Node.js with pnpm using `pnpm env use --global 22.18.0`, then rerun `make bootstrap-studio` and `nemo services restart` from the repository root.
+Studio requires the FastAPI web assets built by `make bootstrap-studio`. If `make bootstrap` warned that Studio asset bootstrap did not complete, install Node.js with pnpm using `pnpm env use --global 22.23.2`, then rerun `make bootstrap-studio` and `nemo services restart` from the repository root.
### No models discovered
diff --git a/web/.nvmrc b/web/.nvmrc
index 8fdd954df9..c94711948a 100644
--- a/web/.nvmrc
+++ b/web/.nvmrc
@@ -1 +1 @@
-22
\ No newline at end of file
+22.23.2
diff --git a/web/package.json b/web/package.json
index 799cce9903..3d864627e2 100644
--- a/web/package.json
+++ b/web/package.json
@@ -54,8 +54,8 @@
"typescript-eslint": "^8.59.0"
},
"engines": {
- "node": ">=22.18.0 <23",
- "pnpm": ">=10.32.1"
+ "node": ">=22.23.2 <23",
+ "pnpm": ">=10.34.5"
},
- "packageManager": "pnpm@10.32.1"
+ "packageManager": "pnpm@10.34.5"
}
diff --git a/web/packages/studio/package.json b/web/packages/studio/package.json
index 11cc1508b2..d9b416e5dc 100644
--- a/web/packages/studio/package.json
+++ b/web/packages/studio/package.json
@@ -115,7 +115,7 @@
"@vitest/ui": "catalog:",
"blob-polyfill": "^9.0.20240710",
"happy-dom": "catalog:",
- "js-yaml": "^4.2.0",
+ "js-yaml": "^4.3.0",
"jsdom": "catalog:",
"msw": "catalog:",
"postcss": "catalog:",
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index a11abc42f4..2fcf326f74 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -115,8 +115,8 @@ catalogs:
specifier: ^6.2.0
version: 6.2.0
postcss:
- specifier: ^8.5.15
- version: 8.5.15
+ specifier: ^8.5.18
+ version: 8.5.25
prettier:
specifier: ^3.5.3
version: 3.8.1
@@ -183,7 +183,12 @@ catalogs:
overrides:
'@codemirror/view': 6.43.1
- brace-expansion@1.1.15: 1.1.16
+ brace-expansion@<1.1.18: 1.1.18
+ brace-expansion@>=4.0.0 <5.0.9: 5.0.9
+ fast-uri@<3.1.4: ^3.1.4
+ js-yaml@>=4.0.0 <4.3.0: ^4.3.0
+ linkify-it@<5.0.2: ^5.0.2
+ postcss@<8.5.18: ^8.5.18
shell-quote@1.8.4: 1.9.0
importers:
@@ -819,8 +824,8 @@ importers:
specifier: 'catalog:'
version: 20.10.6
js-yaml:
- specifier: ^4.2.0
- version: 4.2.0
+ specifier: ^4.3.0
+ version: 4.3.1
jsdom:
specifier: 'catalog:'
version: 29.0.2
@@ -829,10 +834,10 @@ importers:
version: 2.13.3(@types/node@24.12.0)(typescript@7.0.2)
postcss:
specifier: 'catalog:'
- version: 8.5.15
+ version: 8.5.25
postcss-prefix-selector:
specifier: ^2.1.1
- version: 2.1.1(postcss@8.5.15)
+ version: 2.1.1(postcss@8.5.25)
prettier:
specifier: ^3.2.5
version: 3.8.1
@@ -4638,12 +4643,12 @@ packages:
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
- brace-expansion@1.1.16:
- resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==}
+ brace-expansion@1.1.18:
+ resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==}
- brace-expansion@5.0.7:
- resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==}
- engines: {node: 18 || 20 || >=22}
+ brace-expansion@5.0.9:
+ resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==}
+ engines: {node: 20 || >=22}
browserslist@4.28.4:
resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==}
@@ -5336,8 +5341,8 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- fast-uri@3.1.3:
- resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==}
+ fast-uri@3.1.5:
+ resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==}
fd-package-json@2.0.0:
resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==}
@@ -5838,8 +5843,8 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- js-yaml@4.2.0:
- resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==}
+ js-yaml@4.3.1:
+ resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==}
hasBin: true
jsdom@29.0.2:
@@ -6065,8 +6070,8 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- linkify-it@5.0.1:
- resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==}
+ linkify-it@5.0.2:
+ resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==}
lint-staged@16.4.0:
resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==}
@@ -6358,13 +6363,8 @@ packages:
resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
engines: {node: ^18.17.0 || >=20.5.0}
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
- nanoid@3.3.15:
- resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==}
+ nanoid@3.3.17:
+ resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -6618,14 +6618,10 @@ packages:
postcss-prefix-selector@2.1.1:
resolution: {integrity: sha512-ZBgf427Et6+XnrnJ9VXtJEKCjJwTvn2wn/qMg+wvvlRhIeFIAxdbrlZZ0CSsWYMJfcyPLBh8ogj5O1kb/Mcx3g==}
peerDependencies:
- postcss: ^8.0.0
-
- postcss@8.5.14:
- resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
- engines: {node: ^10 || ^12 || >=14}
+ postcss: ^8.5.18
- postcss@8.5.15:
- resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
+ postcss@8.5.25:
+ resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
@@ -10725,7 +10721,7 @@ snapshots:
'@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.2.2
'@tailwindcss/oxide': 4.2.2
- postcss: 8.5.14
+ postcss: 8.5.25
tailwindcss: 4.2.2
'@tailwindcss/vite@4.2.1(vite@8.0.16(@types/node@24.12.0)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.22.4)(yaml@2.8.3))':
@@ -10947,7 +10943,7 @@ snapshots:
'@types/postcss-prefix-selector@1.16.3':
dependencies:
- postcss: 8.5.15
+ postcss: 8.5.25
'@types/prop-types@15.7.15': {}
@@ -11548,7 +11544,7 @@ snapshots:
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
- fast-uri: 3.1.3
+ fast-uri: 3.1.5
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
@@ -11697,12 +11693,12 @@ snapshots:
boolbase@1.0.0: {}
- brace-expansion@1.1.16:
+ brace-expansion@1.1.18:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
- brace-expansion@5.0.7:
+ brace-expansion@5.0.9:
dependencies:
balanced-match: 4.0.4
@@ -11872,7 +11868,7 @@ snapshots:
cosmiconfig@8.3.6(typescript@7.0.2):
dependencies:
import-fresh: 3.3.1
- js-yaml: 4.2.0
+ js-yaml: 4.3.1
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
@@ -12549,7 +12545,7 @@ snapshots:
fast-levenshtein@2.0.6: {}
- fast-uri@3.1.3: {}
+ fast-uri@3.1.5: {}
fd-package-json@2.0.0:
dependencies:
@@ -13059,7 +13055,7 @@ snapshots:
js-tokens@4.0.0: {}
- js-yaml@4.2.0:
+ js-yaml@4.3.1:
dependencies:
argparse: 2.0.1
@@ -13257,7 +13253,7 @@ snapshots:
lines-and-columns@1.2.4: {}
- linkify-it@5.0.1:
+ linkify-it@5.0.2:
dependencies:
uc.micro: 2.1.0
@@ -13345,7 +13341,7 @@ snapshots:
dependencies:
argparse: 2.0.1
entities: 4.5.0
- linkify-it: 5.0.1
+ linkify-it: 5.0.2
mdurl: 2.0.0
punycode.js: 2.3.1
uc.micro: 2.1.0
@@ -13714,15 +13710,15 @@ snapshots:
minimatch@10.2.4:
dependencies:
- brace-expansion: 5.0.7
+ brace-expansion: 5.0.9
minimatch@10.2.5:
dependencies:
- brace-expansion: 5.0.7
+ brace-expansion: 5.0.9
minimatch@3.1.5:
dependencies:
- brace-expansion: 1.1.16
+ brace-expansion: 1.1.18
minimist@1.2.8: {}
@@ -13835,9 +13831,7 @@ snapshots:
mute-stream@2.0.0: {}
- nanoid@3.3.11: {}
-
- nanoid@3.3.15: {}
+ nanoid@3.3.17: {}
nanoid@5.1.9: {}
@@ -13996,7 +13990,7 @@ snapshots:
fs-extra: 11.3.4
get-tsconfig: 4.14.0
jiti: 2.6.1
- js-yaml: 4.2.0
+ js-yaml: 4.3.1
remeda: 2.33.6
string-argv: 0.3.2
typedoc: 0.28.19(typescript@7.0.2)
@@ -14154,19 +14148,13 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss-prefix-selector@2.1.1(postcss@8.5.15):
- dependencies:
- postcss: 8.5.15
-
- postcss@8.5.14:
+ postcss-prefix-selector@2.1.1(postcss@8.5.25):
dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
+ postcss: 8.5.25
- postcss@8.5.15:
+ postcss@8.5.25:
dependencies:
- nanoid: 3.3.15
+ nanoid: 3.3.17
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -15324,7 +15312,7 @@ snapshots:
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
- postcss: 8.5.15
+ postcss: 8.5.25
rolldown: 1.0.3
tinyglobby: 0.2.17
optionalDependencies:
@@ -15339,7 +15327,7 @@ snapshots:
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
- postcss: 8.5.15
+ postcss: 8.5.25
rolldown: 1.0.3
tinyglobby: 0.2.17
optionalDependencies:
diff --git a/web/pnpm-workspace.yaml b/web/pnpm-workspace.yaml
index f631d73440..c9c347e770 100644
--- a/web/pnpm-workspace.yaml
+++ b/web/pnpm-workspace.yaml
@@ -6,7 +6,12 @@ packages:
# https://pnpm.io/settings#overrides
overrides:
'@codemirror/view': 6.43.1
- 'brace-expansion@1.1.15': 1.1.16
+ 'brace-expansion@<1.1.18': 1.1.18
+ 'brace-expansion@>=4.0.0 <5.0.9': 5.0.9
+ 'fast-uri@<3.1.4': ^3.1.4
+ 'js-yaml@>=4.0.0 <4.3.0': ^4.3.0
+ 'linkify-it@<5.0.2': ^5.0.2
+ 'postcss@<8.5.18': ^8.5.18
'shell-quote@1.8.4': 1.9.0
# https://pnpm.io/catalogs
@@ -45,7 +50,7 @@ catalog:
hyparquet: ^1.8.1
p-limit: ^6.2.0
msw: ^2.13.2
- postcss: ^8.5.15
+ postcss: ^8.5.18
prettier: ^3.5.3
oidc-client-ts: ^3.3.0
openai: ^4.67.3