Skip to content

Commit 8ffda77

Browse files
[RELEASE] NeMo-Agent-Toolkit v1.6.0 (#1861)
<!-- SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> ## ❄️ Code freeze for `develop` and `v1.6.0` release ### What does this mean? Only critical/hotfix level issues should be merged into `develop` until release (merging of this PR). ### What is the purpose of this PR? - Update documentation - Allow testing for the new release - Enable a means to merge `develop` into `main` for the release
2 parents 89c6d26 + ffe5fd1 commit 8ffda77

642 files changed

Lines changed: 51473 additions & 10911 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.coderabbit.yaml

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ reviews:
131131
instructions: >-
132132
This directory contains the core functionality of the toolkit. Changes should prioritize backward compatibility.
133133
134+
- path: "packages/nvidia_nat_core/src/nat/eval/**/*"
135+
instructions: >-
136+
- This is a deprecated compatibility shim area and should not grow.
137+
- Flag any PR that adds new files under this path as a blocking issue.
138+
- New evaluation code should be added under `packages/nvidia_nat_eval/src/nat/plugins/eval/` instead.
139+
- Changes in this path should be limited to compatibility-only fixes that are explicitly justified in PR notes.
140+
134141
- path: "packages/**/*"
135142
instructions: >-
136143
- This directory contains packages for the toolkit, each should contain a `pyproject.toml` file.
@@ -145,17 +152,31 @@ reviews:
145152
- `nvidia-nat-test` should likely be listed as an optional dependency in the `test` extra
146153
- A single dependency should be listed on each line and should always have a version specifier.
147154
- All dependencies should be listed under the `[tool.setuptools_dynamic_dependencies]` section
148-
- Any dependency that is an NVIDIA NeMo Agent Toolkit package should be declared with a version constraint of `== {version}`
155+
- Any dependency that is an NVIDIA NeMo Agent Toolkit package should be declared with a version constraint of `== {version}`
156+
157+
- path: "packages/nvidia_nat_core/pyproject.toml"
158+
instructions: >-
159+
- This package is part of the thin-core strategy; default to minimizing direct dependencies.
160+
- Treat any new dependency addition as high-risk and require explicit justification in PR review notes.
161+
- Prefer moving framework-specific or optional capabilities into non-core plugin packages instead of adding dependencies here.
162+
- If a new dependency is unavoidable, confirm it is required by core contracts/runtime and not by optional evaluators, exporters, profiling, or framework integrations.
163+
164+
- path: "packages/nvidia_nat_eval/pyproject.toml"
165+
instructions: >-
166+
- This package follows a thin-core eval strategy; prioritize keeping dependencies minimal.
167+
- Treat any new dependency addition as high-risk and require explicit justification in PR review notes.
168+
- Prefer package-affinity placement (framework/profiler/security/exporter packages) instead of adding dependencies here.
169+
- If a new dependency is unavoidable, confirm it supports core harness/contracts only and is not better hosted in optional packages.
149170
150171
- path: "**/tests/**/*.py"
151172
instructions: >-
152173
- Ensure that tests are comprehensive, cover edge cases, and validate the functionality of the code.
153174
- Test functions should be named using the `test_` prefix, using snake_case.
154175
- Any frequently repeated code should be extracted into pytest fixtures.
155176
- Pytest fixtures should define the name argument when applying the pytest.fixture decorator. The fixture
156-
function being decorated should be named using the `fixture_` prefix, using snake_case. Example:
157-
@pytest.fixture(name="my_fixture")
158-
def fixture_my_fixture():
177+
function being decorated should be named using either a `fixture_` prefix or `_fixture` suffix, using snake_case. Example:
178+
@pytest.fixture(name="my_custom_config")
179+
def my_custom_config_fixture():
159180
pass
160181
- Do NOT add `@pytest.mark.asyncio` to any test. Async tests are automatically detected and run by the
161182
async runner - the decorator is unnecessary clutter.

.cursor/rules/general.mdc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,11 @@ These are the overarching standards that every **source, test, documentation and
113113
- Test functions should be named using the `test_` prefix, using snake_case.
114114
- Any frequently repeated code should be extracted into pytest fixtures.
115115
- Pytest fixtures should define the name argument when applying the pytest.fixture decorator.
116-
- The fixture function being decorated should be named using the `fixture_` prefix, using snake_case.
116+
- The fixture function being decorated should be named using the `fixture_` prefix or `_fixture` suffix, using snake_case.
117117
- Example:
118118
```python
119-
@pytest.fixture(name="my_fixture")
120-
def fixture_my_fixture():
119+
@pytest.fixture(name="my_custom_config")
120+
def my_custom_config_fixture():
121121
pass
122122
```
123123
- Maintain **≥ 80 %** coverage; add or update tests when introducing changes.

.cursor/rules/nat-tests/general.mdc

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,26 @@ All tests in NeMo Agent Toolkit use pytest. See the general coding guidelines fo
2323

2424
- Use `pytest` for all unit tests
2525
- Name test files `test_*.py`
26-
- Use `@pytest.fixture(name="fixture_name")` decorator pattern
2726
- Mock external services with `pytest_httpserver` or `unittest.mock`
2827
- Maintain ≥ 80% code coverage
2928
- Do NOT add `@pytest.mark.asyncio` to any test - async tests are automatically detected and run by the async runner
3029

30+
### Fixtures
31+
- Use `@pytest.fixture(name="fixture_name")` decorator pattern
32+
- Fixtures that are used in multiple tests should be defined in the `packages/nvidia_nat_test/src/nat/test/plugin.py` file, fixtures specific to a single package should be defined in a `conftest.py` file in the `tests` directory of the package, and fixtures that are specific to a single test can be defined in the test file itself.
33+
34+
#### Available Fixtures
35+
36+
**API Keys**: `nvidia_api_key`, `openai_api_key`, `tavily_api_key`, `mem0_api_key`
37+
38+
**Services**: `milvus_uri`, `redis_url`, `mysql_connection_info`, `phoenix_url`
39+
40+
**Directories**: `root_repo_dir`, `examples_dir` (NAT repo only)
41+
42+
**Mocked Objects**: `mock_httpx_async_client`, `mock_httpx_sync_client`, `mock_builder`
43+
44+
There are many more fixtures available, refer to the [plugin.py](mdc:packages/nvidia_nat_test/src/nat/test/plugin.py) file and any `conftest.py` files defined in the file hierarchy of the current test file for the complete list.
45+
3146
### Integration Tests
3247

3348
For workflows that require actual LLM services or external services, follow the integration testing guidelines:
@@ -94,14 +109,6 @@ pytest --run_slow --run_integration packages/nvidia_nat_langchain
94109
- `run_workflow(config_file, question, expected_answer)` - Run and validate workflows
95110
- `load_config(config_file)` - Load configuration objects
96111

97-
### Available Fixtures
98-
99-
**API Keys**: `nvidia_api_key`, `openai_api_key`, `tavily_api_key`, `mem0_api_key`
100-
101-
**Services**: `milvus_uri`, `redis_url`, `mysql_connection_info`, `phoenix_url`
102-
103-
**Directories**: `root_repo_dir`, `examples_dir` (NAT repo only)
104-
105112
### Test LLM
106113

107114
- `_type: nat_test_llm` - Use in YAML configs to stub LLM responses

.github/workflows/ci_pipe.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,15 @@ jobs:
209209
shell: bash
210210
run: ./nat/ci/scripts/github/build_wheel.sh
211211

212+
- name: Upload Package Reports
213+
uses: actions/upload-artifact@v6
214+
if: ${{ always() }}
215+
with:
216+
name: "package_listings"
217+
path: "${{ github.workspace }}/tmp/package_listings.tar.bz2"
218+
if-no-files-found: error
219+
compression-level: 0
220+
212221
- name: Upload Wheels
213222
uses: actions/upload-artifact@v6
214223
with:

.pre-commit-config.yaml

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,39 +26,25 @@ repos:
2626
# Run the linter.
2727
- id: ruff-check
2828
args: [ --fix ]
29-
30-
- repo: https://github.com/astral-sh/uv-pre-commit
31-
rev: 0.9.28
29+
- repo: local
3230
hooks:
33-
- { id: uv-lock, name: "uv-lock", files: "pyproject.toml" }
34-
- { id: uv-lock, name: "uv-lock-a2a", args: [--project, packages/nvidia_nat_a2a], files: "packages/nvidia_nat_a2a/pyproject.toml" }
35-
- { id: uv-lock, name: "uv-lock-adk", args: [--project, packages/nvidia_nat_adk], files: "packages/nvidia_nat_adk/pyproject.toml" }
36-
- { id: uv-lock, name: "uv-lock-agno", args: [--project, packages/nvidia_nat_agno], files: "packages/nvidia_nat_agno/pyproject.toml" }
37-
- { id: uv-lock, name: "uv-lock-autogen", args: [--project, packages/nvidia_nat_autogen], files: "packages/nvidia_nat_autogen/pyproject.toml" }
38-
- { id: uv-lock, name: "uv-lock-core", args: [--project, packages/nvidia_nat_core], files: "packages/nvidia_nat_core/pyproject.toml" }
39-
- { id: uv-lock, name: "uv-lock-crewai", args: [--project, packages/nvidia_nat_crewai], files: "packages/nvidia_nat_crewai/pyproject.toml" }
40-
- { id: uv-lock, name: "uv-lock-data_flywheel", args: [--project, packages/nvidia_nat_data_flywheel], files: "packages/nvidia_nat_data_flywheel/pyproject.toml" }
41-
- { id: uv-lock, name: "uv-lock-eval", args: [--project, packages/nvidia_nat_eval], files: "packages/nvidia_nat_eval/pyproject.toml" }
42-
- { id: uv-lock, name: "uv-lock-fastmcp", args: [--project, packages/nvidia_nat_fastmcp], files: "packages/nvidia_nat_fastmcp/pyproject.toml" }
43-
- { id: uv-lock, name: "uv-lock-langchain", args: [--project, packages/nvidia_nat_langchain], files: "packages/nvidia_nat_langchain/pyproject.toml" }
44-
- { id: uv-lock, name: "uv-lock-llama_index", args: [--project, packages/nvidia_nat_llama_index], files: "packages/nvidia_nat_llama_index/pyproject.toml" }
45-
- { id: uv-lock, name: "uv-lock-mcp", args: [--project, packages/nvidia_nat_mcp], files: "packages/nvidia_nat_mcp/pyproject.toml" }
46-
- { id: uv-lock, name: "uv-lock-mem0ai", args: [--project, packages/nvidia_nat_mem0ai], files: "packages/nvidia_nat_mem0ai/pyproject.toml" }
47-
- { id: uv-lock, name: "uv-lock-mysql", args: [--project, packages/nvidia_nat_mysql], files: "packages/nvidia_nat_mysql/pyproject.toml" }
48-
- { id: uv-lock, name: "uv-lock-nemo_customizer", args: [--project, packages/nvidia_nat_nemo_customizer], files: "packages/nvidia_nat_nemo_customizer/pyproject.toml" }
49-
- { id: uv-lock, name: "uv-lock-openpipe_art", args: [--project, packages/nvidia_nat_openpipe_art], files: "packages/nvidia_nat_openpipe_art/pyproject.toml" }
50-
- { id: uv-lock, name: "uv-lock-opentelemetry", args: [--project, packages/nvidia_nat_opentelemetry], files: "packages/nvidia_nat_opentelemetry/pyproject.toml" }
51-
- { id: uv-lock, name: "uv-lock-phoenix", args: [--project, packages/nvidia_nat_phoenix], files: "packages/nvidia_nat_phoenix/pyproject.toml" }
52-
- { id: uv-lock, name: "uv-lock-rag", args: [--project, packages/nvidia_nat_rag], files: "packages/nvidia_nat_rag/pyproject.toml" }
53-
- { id: uv-lock, name: "uv-lock-ragaai", args: [--project, packages/nvidia_nat_ragaai], files: "packages/nvidia_nat_ragaai/pyproject.toml" }
54-
- { id: uv-lock, name: "uv-lock-redis", args: [--project, packages/nvidia_nat_redis], files: "packages/nvidia_nat_redis/pyproject.toml" }
55-
- { id: uv-lock, name: "uv-lock-s3", args: [--project, packages/nvidia_nat_s3], files: "packages/nvidia_nat_s3/pyproject.toml" }
56-
- { id: uv-lock, name: "uv-lock-semantic_kernel", args: [--project, packages/nvidia_nat_semantic_kernel], files: "packages/nvidia_nat_semantic_kernel/pyproject.toml" }
57-
- { id: uv-lock, name: "uv-lock-strands", args: [--project, packages/nvidia_nat_strands], files: "packages/nvidia_nat_strands/pyproject.toml" }
58-
- { id: uv-lock, name: "uv-lock-test", args: [--project, packages/nvidia_nat_test], files: "packages/nvidia_nat_test/pyproject.toml" }
59-
- { id: uv-lock, name: "uv-lock-vanna", args: [--project, packages/nvidia_nat_vanna], files: "packages/nvidia_nat_vanna/pyproject.toml" }
60-
- { id: uv-lock, name: "uv-lock-weave", args: [--project, packages/nvidia_nat_weave], files: "packages/nvidia_nat_weave/pyproject.toml" }
61-
- { id: uv-lock, name: "uv-lock-zep_cloud", args: [--project, packages/nvidia_nat_zep_cloud], files: "packages/nvidia_nat_zep_cloud/pyproject.toml" }
31+
- id: uv-lock-all-pyprojects
32+
name: Ensure `uv lock` is run for all pyproject.toml files
33+
entry: >-
34+
bash -ec '
35+
status=0
36+
while IFS= read -r -d "" pyproject; do
37+
(
38+
echo "Locking $(dirname "$pyproject")" &&
39+
cd "$(dirname "$pyproject")" &&
40+
uv lock
41+
) || status=$?
42+
done < <(find . -name pyproject.toml -not -path "*/.*/*" -print0)
43+
exit "$status"
44+
'
45+
language: system
46+
files: "pyproject\\.toml$"
47+
pass_filenames: false
6248
- repo: local
6349
hooks:
6450
- id: clear-notebook-output-cells
@@ -73,7 +59,7 @@ repos:
7359
hooks:
7460
- id: markdown-link-check
7561
args: ["-q", "--config", "ci/markdown-link-check-config.json"]
76-
exclude: "^(src/nat/meta/pypi\\.md|CHANGELOG\\.md)$"
62+
exclude: "^(packages/nvidia_nat_core/src/nat/meta/pypi\\.md|CHANGELOG\\.md)$"
7763

7864
default_language_version:
7965
python: python3

.pytest.ini

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ markers =
1313
integration: Integration tests which do not use mocks and may require external services
1414
requires_cache: Tests that require a reverse-proxy cache to be running
1515
slow: Slow tests
16-
filterwarnings =
17-
# Work-around for a warning emitted by strands https://github.com/strands-agents/sdk-python/issues/1236
18-
ignore:^These events have been moved to production.*strands:DeprecationWarning
1916
asyncio_mode = auto
2017
asyncio_default_fixture_loop_scope = session
2118

0 commit comments

Comments
 (0)