Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,7 @@ jobs:
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
enable-cache: true
python-version: "3.11"
python-version: "3.12"
cache-dependency-glob: uv.lock
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
Expand Down Expand Up @@ -787,7 +787,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
python-version: "3.11"
python-version: "3.12"
enable-cache: true
cache-dependency-glob: uv.lock
- name: Run tools unit tests
Expand Down Expand Up @@ -817,7 +817,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
python-version: "3.11"
python-version: "3.12"
enable-cache: true
cache-dependency-glob: uv.lock
- name: Run unit tests
Expand Down Expand Up @@ -858,7 +858,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
python-version: "3.11"
python-version: "3.12"
enable-cache: true
cache-dependency-glob: uv.lock
- name: Log in to Docker Hub
Expand Down Expand Up @@ -912,7 +912,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
python-version: "3.11"
python-version: "3.12"
enable-cache: true
cache-dependency-glob: uv.lock
- name: Run auth-idp static tests
Expand Down Expand Up @@ -981,7 +981,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
python-version: "3.11"
python-version: "3.12"
enable-cache: true
cache-dependency-glob: uv.lock
- name: Setup Kind cluster
Expand Down Expand Up @@ -1073,6 +1073,9 @@ jobs:
matrix:
package: [nemo-platform, nemo-platform-plugin]
python-version: ["3.11", "3.12", "3.13", "3.14"]
exclude:
- package: nemo-platform
python-version: "3.11"
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
Expand Down Expand Up @@ -1115,6 +1118,9 @@ jobs:
matrix:
package: [nemo-platform, nemo-platform-plugin]
python-version: ["3.11", "3.12", "3.13", "3.14"]
exclude:
- package: nemo-platform
python-version: "3.11"
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
Expand Down Expand Up @@ -1551,7 +1557,7 @@ jobs:
# repo's `required-version` constraint from pyproject.toml. Other
# jobs check out into the workspace root and get this implicitly.
working-directory: nemo-platform
python-version: "3.11"
python-version: "3.12"
enable-cache: true
cache-dependency-glob: uv.lock
- name: Bootstrap Python environment
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![CI](https://github.com/NVIDIA-NeMo/nemo-platform/actions/workflows/ci.yaml/badge.svg)](https://github.com/NVIDIA-NeMo/nemo-platform/actions/workflows/ci.yaml)
[![License](https://img.shields.io/badge/license-Apache_2.0-D22128?style=flat-square)](LICENSE)
[![Python](https://img.shields.io/badge/python-3.11--3.13-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.12--3.13-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
[![Docs](https://img.shields.io/static/v1?label=docs&message=docs.nvidia.com%2Fnemo-platform&color=76B900&style=flat-square&logo=readthedocs&logoColor=white)](https://docs.nvidia.com/nemo-platform)

Make the agents you ship faster, more accurate, and safer.
Expand All @@ -13,7 +13,7 @@ NeMo Platform brings NVIDIA NeMo libraries together under one CLI, Python SDK, a

## Get started

**Prerequisites:** Python 3.11-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 Node.js 22.18.x with `pnpm` if you want the web UI.

Quick install from PyPI:

Expand Down
2 changes: 1 addition & 1 deletion docs/about/release-notes/current-release.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ workflows against the upgraded checkout.

## Compatibility

- Python 3.11-3.13
- Python 3.12-3.13
- macOS and Linux for local CLI, SDK, Studio, and hosted-provider workflows
- Linux x86_64 for local NVIDIA GPU workloads
- Self-managed Kubernetes clusters deployed with Helm
Expand Down
2 changes: 1 addition & 1 deletion docs/cli/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ pip uninstall nemo-microservices

### Install in a Virtual Environment

Install the PyPI `nemo-platform` wrapper package in a Python 3.11-3.13 virtual environment. If you are working from a source checkout, run `make bootstrap` from the repository root instead; the generated SDK package under `sdk/python/nemo-platform/pyproject.toml` does not define the wrapper extras.
Install the PyPI `nemo-platform` wrapper package in a Python 3.12-3.13 virtual environment. If you are working from a source checkout, run `make bootstrap` from the repository root instead; the generated SDK package under `sdk/python/nemo-platform/pyproject.toml` does not define the wrapper extras.

```bash
pip install "nemo-platform[all]"
Expand Down
2 changes: 1 addition & 1 deletion docs/get-started/setup.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Install NeMo Platform and start working with AI agents.
<a id="nemo-setup-prerequisites"></a>
## Prerequisites

- Python 3.11-3.13
- Python 3.12-3.13
- 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
Expand Down
2 changes: 1 addition & 1 deletion docs/requirements.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ clusters, use the NeMo Platform Helm chart on Kubernetes.

| Component | Requirement | Notes |
|-----------|-------------|-------|
| Python | 3.11, 3.12, or 3.13 | Use an isolated virtual environment. |
| Python | 3.12 or 3.13 | Use an isolated virtual environment. |
| Package installer | `uv>=0.9.14,<0.10.0` recommended; `pip` supported | The one-line installer sets up `uv` automatically when needed. |
| Operating system | Recent Linux or macOS release | See the [Support Matrix](/documentation/reference/support-matrix) for the supported OS list. |
| Memory | 8 GB RAM minimum | 16 GB or more is recommended for larger local workflows. |
Expand Down
4 changes: 2 additions & 2 deletions docs/support-matrix.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ self-managed Kubernetes deployments installed with the NeMo Platform Helm chart.
| Area | Supported | Notes |
|------|-----------|-------|
| Deployment mode | `nemo setup` local install; Helm chart on Kubernetes | `nemo setup` starts local services, registers a model provider, and configures the CLI and SDK. The Helm chart is the supported path for self-managed Kubernetes clusters. |
| Python | 3.11, 3.12, 3.13 | Use an isolated virtual environment. Python 3.11 is the lowest supported Python version and Python 3.13 is the highest supported Python version. |
| Python | 3.12, 3.13 | Use an isolated virtual environment. Python 3.12 is the lowest supported Python version and Python 3.13 is the highest supported Python version. |
| Linux | Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, RHEL 9, Rocky Linux 9, Debian 12 | Supported for CLI, SDK, local services, and NVIDIA GPU workloads. |
| macOS | [macOS Tahoe 26](https://support.apple.com/en-us/122868) and macOS Sequoia 15 | Supported for CLI, SDK, local services, and cloud/provider workflows. Local NVIDIA GPU workloads are not supported on macOS. |
| Architecture | x86_64 Linux; Apple Silicon and Intel macOS | NVIDIA GPU workloads require x86_64 Linux. |
Expand Down Expand Up @@ -63,5 +63,5 @@ The following are not part of the OSS support matrix:
- Docker Compose deployment guides.
- WSL-based local install or GPU validation.
- macOS local GPU workloads.
- Python earlier than 3.11 or Python 3.14 and later.
- Python earlier than 3.12 or Python 3.14 and later.
- CUDA versions earlier than 13 for GPU workloads.
4 changes: 2 additions & 2 deletions packages/nemo_platform/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# NeMo Platform

[![License](https://img.shields.io/badge/license-Apache_2.0-D22128?style=flat-square)](https://github.com/NVIDIA-NeMo/nemo-platform/blob/main/LICENSE)
[![Python](https://img.shields.io/badge/python-3.11--3.13-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.12--3.13-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
[![Docs](https://img.shields.io/static/v1?label=docs&message=docs.nvidia.com%2Fnemo-platform&color=76B900&style=flat-square&logo=readthedocs&logoColor=white)](https://docs.nvidia.com/nemo-platform)

Make the agents you ship faster, more accurate, and safer.
Expand All @@ -19,7 +19,7 @@ NeMo Platform brings NVIDIA NeMo libraries together under one CLI, Python SDK, a

## Install

**Prerequisites:** Python 3.11–3.13 and an API key for an inference provider (NVIDIA Build, OpenAI, Anthropic, Google Gemini, or a local Ollama instance).
**Prerequisites:** Python 3.12–3.13 and an API key for an inference provider (NVIDIA Build, OpenAI, Anthropic, Google Gemini, or a local Ollama instance).

The `nemo-platform` distribution is a convenience wrapper that bundles the SDK, shared runtime packages, default first-party plugins, and platform services into a single wheel. Install just the SDK and CLI, or install everything needed to run the platform locally:

Expand Down
3 changes: 1 addition & 2 deletions packages/nemo_platform/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@ description = "Convenience wrapper distribution for NeMo Platform Python package
readme = "README.md"
authors = [{ name = "NVIDIA Corporation" }]
license = "Apache-2.0"
requires-python = ">=3.11,<3.15"
requires-python = ">=3.12,<3.15"
classifiers = [
"Intended Audience :: Developers",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
Expand Down
4 changes: 2 additions & 2 deletions packages/nemo_platform_ext/tests/cli/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ def test_help_includes_getting_started():
assert "Getting started:" in result.stdout
assert "nemo docs --list" in result.stdout
assert "nemo services run --help" in result.stdout
# Help panel truncates long command descriptions; match the visible prefix.
assert "Set up NeMo Platform: connect or start services" in result.stdout
# Help panel truncation depends on terminal width; match a stable prefix.
assert "Set up NeMo Platform" in result.stdout
assert "--help, -h" in result.stdout
assert "nemo auth login --base-url" not in result.stdout
assert "nemo quickstart configure" not in result.stdout
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Build NeMo Platform plugins in Python.
pip install nemo-platform-plugin
```

To run a local NeMo Platform that loads and serves your plugin while you develop, use Python 3.11–3.13 and install [`nemo-platform`](https://pypi.org/project/nemo-platform/) too — it ships the platform services, the `nemo` CLI, and the runtime that wires entity-client injection into your plugin's FastAPI app:
To run a local NeMo Platform that loads and serves your plugin while you develop, use Python 3.12–3.13 and install [`nemo-platform`](https://pypi.org/project/nemo-platform/) too — it ships the platform services, the `nemo` CLI, and the runtime that wires entity-client injection into your plugin's FastAPI app:

```bash
pip install "nemo-platform[all]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ A plugin with an HTTP endpoint, a CLI command, a scheduled job, and typed config

## Prerequisites

Python 3.11–3.13, `uv`, `export NMP_BASE_URL=http://localhost:8080` (Steps 2–5), running NeMo Platform (Step 6).
Python 3.12–3.13, `uv`, `export NMP_BASE_URL=http://localhost:8080` (Steps 2–5), running NeMo Platform (Step 6).

## Step 1: Create the package structure

Expand All @@ -30,7 +30,7 @@ my-plugin/
name = "nemo-my-plugin"
version = "0.1.0"
description = "My NeMo Platform plugin."
requires-python = ">=3.11"
requires-python = ">=3.12"
dependencies = ["nemo-platform-plugin", "nemo-platform"]

[project.entry-points."nemo.services"]
Expand Down
10 changes: 3 additions & 7 deletions plugins/nemo-experimentalist/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@
name = "nemo-experimentalist-plugin"
version = "0.1.0"
description = "NeMo Experimentalist plugin for NeMo Platform."
# The plugin itself needs 3.12 (so do nooa and harbor), but a workspace member cannot
# raise its floor above the workspace's without dragging every other package up with it.
# The floor is declared here and enforced by the markers below plus the `experimentalist`
# dependency group in the workspace root.
requires-python = ">=3.11,<3.14"
requires-python = ">=3.12,<3.14"
dependencies = [
"pydantic>=2",
"httpx",
"harbor>=0.16 ; python_full_version >= '3.12'",
"harbor>=0.16",
"opentelemetry-proto>=1.42.1",
"protobuf>=6.0.0",
"nooa ; python_full_version >= '3.12'",
"nooa",
Comment thread
nicot marked this conversation as resolved.
Resolved
"pyyaml>=6.0.3",
"nemo-insights-plugin",
"nemo-platform",
Expand Down
20 changes: 4 additions & 16 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "nemoplatform"
description = "NeMo Platform"
readme = "README.md"
requires-python = ">=3.11,<3.15"
requires-python = ">=3.12,<3.15"
license = "Apache-2.0"
license-files = ["LICENSE", "NOTICE"]

Expand All @@ -17,7 +17,6 @@ classifiers = [

"License :: OSI Approved :: Apache Software License",

"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
Expand Down Expand Up @@ -69,10 +68,8 @@ version = "0.0.0"
[dependency-groups]
# Optional Insights analyst plugin.
insights = ["nemo-insights-plugin"]
# Optional Experimentalist agent-optimization plugin. Its agent framework (nooa) and
# evaluator (harbor) are both 3.12-only, so the whole plugin is gated rather than
# installed half-resolved on 3.11.
experimentalist = ["nemo-experimentalist-plugin ; python_full_version >= '3.12'"]
# Optional Experimentalist agent-optimization plugin.
experimentalist = ["nemo-experimentalist-plugin"]
dev = [
"pre-commit>=3.8.0",
"pydantic-settings>=2.6.1",
Expand Down Expand Up @@ -536,7 +533,7 @@ executionEnvironments = [
]

[tool.ty.environment]
python-version = "3.11"
python-version = "3.12"
extra-paths = [
# nemo-data-designer plugin is a workspace member; add its src so ty can
# resolve nemo_data_designer_plugin imports from plugin test files.
Expand Down Expand Up @@ -641,12 +638,3 @@ include = ["plugins/nemo-experimentalist/src/**"]

[tool.ty.overrides.rules]
empty-body = "ignore"

# The Experimentalist's agent framework (nooa) and evaluator (harbor) are both
# 3.12-only, so uv skips them when the lint job resolves on 3.11 and every import
# of them goes unresolved. Everything else about the plugin still gets checked.
[[tool.ty.overrides]]
include = ["plugins/nemo-experimentalist/**"]

[tool.ty.overrides.rules]
unresolved-import = "ignore"

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion third_party/licenses.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
{"name": "asyncpg", "license": "APACHE-2.0", "compatible": true}
{"name": "attrs", "license": "MIT", "compatible": true}
{"name": "authlib", "license": "BSD-3-CLAUSE", "compatible": true}
{"name": "backports-tarfile", "license": "MIT", "compatible": true}
{"name": "base58", "license": "MIT", "compatible": true}
{"name": "beartype", "license": "MIT", "compatible": true}
{"name": "beautifulsoup4", "license": "MIT", "compatible": true}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,22 +195,22 @@ def update_pyproject_toml(sdk_info: SdkInfo) -> bool:

project["urls"] = {"Homepage": "https://docs.nvidia.com/nemo/microservices/latest/about/index.html"}

# Drop support for Python versions older than 3.11.
version_to_remove = ["3.8", "3.9", "3.10"]
# Drop support for Python versions older than 3.12.
version_to_remove = ["3.8", "3.9", "3.10", "3.11"]
for ver in version_to_remove:
try:
project["classifiers"].remove(f"Programming Language :: Python :: {ver}")
except ValueError:
pass

project["requires-python"] = ">= 3.11"
project["requires-python"] = ">= 3.12"
dependencies = project.get("dependencies")
if dependencies is not None:
for dep in list(dependencies):
if dep.startswith("exceptiongroup"):
dependencies.remove(dep)
pyproject["tool"]["ruff"]["target-version"] = "py311"
pyproject["tool"]["pyright"]["pythonVersion"] = "3.11"
pyproject["tool"]["ruff"]["target-version"] = "py312"
pyproject["tool"]["pyright"]["pythonVersion"] = "3.12"

# Handle versioning
project.pop("version", None)
Expand Down
Loading
Loading