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