Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
2 changes: 0 additions & 2 deletions packages/nemo_helix/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,6 @@ nemo-helix-sdk = [
nemo-insights-plugin = [
"fastapi>=0.115",
"httpx",
"insight-agent @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137",
"nemo-fabric-adapter-contract>=0.3.0,<0.4.0",
"nemo-fabric-adapters-common>=0.3.0,<0.4.0",
"nemo-helix-plugin",
Expand All @@ -477,7 +476,6 @@ nemo-insights-plugin = [
"opentelemetry-sdk>=1.42.1",
"pydantic>=2.12.0",
"pyyaml>=6.0.3",
"trace-ingest @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137#subdirectory=packages/trace-ingest",
"typer>=0.20.0",
"tzdata==2026.2",
]
Expand Down
17 changes: 17 additions & 0 deletions plugins/nemo-insights/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,23 @@ uv sync

The plugin is installed by default through the root workspace's `enabled-plugins` group.

## Install analyst dependencies for PyPI installations

PyPI does not accept Git dependencies in wheel metadata, so `nemo-helix[all]`
does not install `insight-agent` and `trace-ingest`. For a `uv tool install`
installation, include both when installing Helix before running Insights analysis:

```bash
uv tool install --force \
--with "insight-agent @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137" \
--with "trace-ingest @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137#subdirectory=packages/trace-ingest" \
"nemo-helix[all]"
```

For a virtual environment, install the same two requirements with `uv pip install`
in the environment that runs the analyst. Source checkouts and the platform images
install these pinned dependencies through the workspace's `insights` group.
Comment thread
svvarom marked this conversation as resolved.
Resolved

## CLI

Submit analysis through NeMo Helix. Replace `<run-name>` with the name
Expand Down
2 changes: 0 additions & 2 deletions plugins/nemo-insights/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ requires-python = ">=3.12,<3.15"
dependencies = [
"fastapi>=0.115",
"httpx",
"insight-agent @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137",
"nemo-fabric-adapter-contract>=0.3.0,<0.4.0",
"nemo-fabric-adapters-common>=0.3.0,<0.4.0",
"nemo-helix",
Expand All @@ -20,7 +19,6 @@ dependencies = [
"opentelemetry-sdk>=1.42.1",
"pydantic>=2.12.0",
"pyyaml>=6.0.3",
"trace-ingest @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137#subdirectory=packages/trace-ingest",
"typer>=0.20.0",
"tzdata==2026.2",
]
Expand Down
12 changes: 8 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,12 @@ dependencies = [
version = "0.0.0"

[dependency-groups]
# Insights analyst plugin convenience group.
insights = ["nemo-insights-plugin"]
# Keep Git-only analyst dependencies out of published wheel metadata.
insights = [
"nemo-insights-plugin",
"insight-agent @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137",
"trace-ingest @ git+https://github.com/NVIDIA-NeMo/labs-trace-intel.git@cd639d223e06ee9d27783df6b461d302ceb09137#subdirectory=packages/trace-ingest",
]
typecheck = ["transformers>=5.5.0,<5.9.0"]
# The scaled-evals plugin is opt-in: it is a path dependency rather than a workspace
# member, so neither `enabled-plugins` nor `uv sync --all-packages` installs it. It needs
Expand Down Expand Up @@ -184,7 +188,7 @@ enabled-plugins = [
"nemo-anonymizer-plugin",
"nemo-data-designer-plugin[retrieval-sdg]",
"nemo-evaluator-plugin",
"nemo-insights-plugin",
{ include-group = "insights" },
"nemo-guardrails-plugin",
"nemo-auditor-plugin",
"nemo-safe-synthesizer-plugin",
Expand Down Expand Up @@ -251,7 +255,7 @@ cpu-tasks = [
# managed CPU task environment. Hermes requires a separate execution image.
"nemo-agents-plugin[all]",
# Insights Analyst Fabric adapter and insights.analysis execute extension.
"nemo-insights-plugin",
{ include-group = "insights" },
"nemo-evaluator-plugin",
"nemo-sandboxed-gym[server,opensandbox]",
"nemo-anonymizer-plugin",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import pytest
import tomlkit
from packaging.requirements import Requirement

REPO_ROOT = Path(__file__).resolve().parents[5]
WRAPPER_PYPROJECT = REPO_ROOT / "packages" / "nemo_helix" / "pyproject.toml"
Expand All @@ -35,6 +36,14 @@ def _load(path: Path) -> dict:
return tomlkit.parse(path.read_text(encoding="utf-8")).unwrap()


def test_wrapper_dependencies_have_no_direct_urls() -> None:
project = _load(WRAPPER_PYPROJECT)["project"]
dependency_groups = [project.get("dependencies", []), *project.get("optional-dependencies", {}).values()]
for dependencies in dependency_groups:
for dependency in dependencies:
assert Requirement(dependency).url is None, f"PyPI rejects direct dependency: {dependency}"


def _source_pyproject(source: Path) -> Path:
for candidate in [source, *source.parents]:
pyproject = candidate / "pyproject.toml"
Expand Down
Loading
Loading