Skip to content

Cut Redis plugin over to external nemo-agent-toolkit-redis package#2046

Open
bbednarski9 wants to merge 5 commits into
NVIDIA:developfrom
bbednarski9:bbednarski/NAT-380
Open

Cut Redis plugin over to external nemo-agent-toolkit-redis package#2046
bbednarski9 wants to merge 5 commits into
NVIDIA:developfrom
bbednarski9:bbednarski/NAT-380

Conversation

@bbednarski9

@bbednarski9 bbednarski9 commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Description

Closes N/A

Cut the Redis integration over from the in-tree nvidia-nat-redis implementation to the Redis-managed nemo-agent-toolkit-redis plugin while keeping the historical nvidia-nat-redis distribution as a compatibility shim.

This PR:

  • updates the redis and most extras to resolve nemo-agent-toolkit-redis;
  • converts packages/nvidia_nat_redis into a no-code compatibility package depending on nemo-agent-toolkit-redis;
  • removes the old in-tree nat.plugins.redis implementation and old direct Redis tests from NAT;
  • updates Redis docs to point at the external Redis plugin;
  • refreshes root/package/example lockfiles so Redis resolves through the external package;
  • adds shim metadata coverage to ensure the compatibility package does not ship Python modules or NAT entry points.

Validation:

  • uv run ruff check packages/nvidia_nat_redis/tests/test_shim_metadata.py
  • uv run python -m pytest packages/nvidia_nat_redis/tests/test_shim_metadata.py
  • uv run --extra redis python -m pytest ../nemo-agent-toolkit-redis-fork/tests/test_entry_points.py ../nemo-agent-toolkit-redis-fork/tests/test_nat_api_imports.py ../nemo-agent-toolkit-redis-fork/tests/test_auto_memory.py ../nemo-agent-toolkit-redis-fork/tests/test_redis_agent_memory_editor.py ../nemo-agent-toolkit-redis-fork/tests/test_redis_editor.py
  • uv run --with-editable packages/nvidia_nat_redis python ... direct shim install smoke
  • uv run --extra redis nat info components
  • uv run --extra redis --extra langchain --extra phoenix nat validate --config_file examples/memory/redis/configs/config.yml
  • uv run --extra redis --extra langchain --with-editable examples/object_store/user_report nat validate --config_file examples/object_store/user_report/configs/config_redis.yml
  • cd examples/object_store/user_report && uv run python -m pytest tests/test_objext_store_example_user_report_tool.py -q
  • cd examples/memory/redis && REDIS_PASSWORD= uv run python -m pytest tests/test_memory_redis.py -q -rs --run_integration with local Redis on 6379 and a local trace receiver on 6006
  • python3 ci/scripts/license_diff.py release/1.8
  • uv run python ci/scripts/sbom_list.py --uvlock uv.lock --output /tmp/nat-redis-cutover-sbom.tsv

License review:

Added packages:
- agent-memory-client 0.14.0 Apache-2.0
- ml-dtypes 0.5.4 Apache-2.0
- nemo-agent-toolkit-redis (source)
- python-ulid 3.1.0 MIT
- redisvl 0.20.0 MIT
Removed packages:
- langchain-tavily 0.2.18
Changed packages:
- redis 4.6.0 -> 5.3.1

Note: this branch currently uses a local/source override to the Redis fork while the external package changes are being staged.

By Submitting this PR I confirm:

  • I am familiar with the Contributing Guidelines.
  • We require that all contributors "sign-off" on their commits. This certifies that the contribution is your original work, or you have rights to submit it under the same license, or a compatible license.
    • Any contribution which contains commits that are not Signed-Off will not be accepted.
  • When the PR is ready for review, new or existing tests cover these changes.
  • When the PR is ready for review, the documentation is up to date with these changes.

Summary by CodeRabbit

  • Documentation

    • Updated installation, migration guide, and release notes to instruct using the external nemo-agent-toolkit-redis plugin for Redis memory/object-store support.
  • Chores

    • Redis memory and object-store implementations removed from the core distribution and provided via a compatibility package.
  • Tests

    • Removed bundled Redis integration tests; added packaging/metadata tests validating the shim dependency on the external Redis plugin.

…ty shim to the new nvidia-nemo-agent-toolkit-redis 3p repo

Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@bbednarski9 bbednarski9 requested review from a team as code owners June 9, 2026 23:58
@copy-pr-bot

copy-pr-bot Bot commented Jun 9, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e6a50bc1-dab4-4217-a12f-89955b1832c8

📥 Commits

Reviewing files that changed from the base of the PR and between ee40848 and da9d2d4.

📒 Files selected for processing (3)
  • docs/source/release-notes.md
  • docs/source/resources/migration-guide.md
  • packages/nvidia_nat_redis/tests/test_shim_metadata.py
✅ Files skipped from review due to trivial changes (2)
  • docs/source/release-notes.md
  • docs/source/resources/migration-guide.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/nvidia_nat_redis/tests/test_shim_metadata.py

Walkthrough

This PR migrates the Redis integration from an internal implementation in nvidia-nat-redis to an external nemo-agent-toolkit-redis plugin package. The nvidia-nat-redis package is converted to a compatibility shim with no Python code, while all documentation, dependencies, and tests are updated accordingly.

Changes

Redis External Package Migration

Layer / File(s) Summary
Documentation migration to external package reference
docs/source/build-workflows/memory.md, docs/source/build-workflows/object-store.md, docs/source/components/agents/auto-memory-wrapper/auto-memory-wrapper.md, docs/source/extend/custom-components/memory.md, docs/source/get-started/installation.md
All user-facing documentation is updated to reference nemo-agent-toolkit-redis instead of nvidia-nat-redis as the Redis plugin provider.
nvidia-nat-redis package restructured as compatibility shim
packages/nvidia_nat_redis/pyproject.toml, packages/nvidia_nat_redis/src/nat/meta/pypi.md
nvidia-nat-redis pyproject.toml removes dynamic dependency configuration and declares static external dependency on nemo-agent-toolkit-redis>=0.1.0,<2.0.0. Package discovery is disabled (packages = []). All Redis implementation code and related tests are removed from the package layout. PyPI metadata describes the package as a historical compatibility distribution.
Root project dependency wiring
pyproject.toml
Root project's redis and most extras are updated to depend on nemo-agent-toolkit-redis instead of nvidia-nat-redis. The tool.uv.sources configuration maps nemo-agent-toolkit-redis to the external fork repository.
Shim validation test suite
packages/nvidia_nat_redis/tests/test_shim_metadata.py
New test module validates that the nvidia-nat-redis package is properly structured as a shim: no Python packages, no entry points, no Redis plugin code, and exactly one external dependency on nemo-agent-toolkit-redis>=0.1.0,<2.0.0.

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Cut Redis plugin over to external nemo-agent-toolkit-redis package' is concise (66 chars), descriptive, uses imperative mood, and accurately summarizes the main change of migrating Redis integration to an external package.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@bbednarski9 bbednarski9 added DO NOT MERGE PR should not be merged; see PR for details doc Improvements or additions to documentation breaking Breaking change labels Jun 9, 2026
@coderabbitai coderabbitai Bot removed the DO NOT MERGE PR should not be merged; see PR for details label Jun 9, 2026
@bbednarski9

Copy link
Copy Markdown
Contributor Author

This PR is breaking because it will require folks to install nemo-agent-toolkit-redis, otherwise the compatibility shim should handle the API cutover

Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
packages/nvidia_nat_redis/tests/test_shim_metadata.py (3)

15-20: 💤 Low value

Consider adding a docstring to document test intent.

While the test name is descriptive, a brief docstring would help document what aspect of the shim is being validated.

📖 Suggested docstring
 def test_shim_has_no_python_packages_or_nat_entry_points():
+    """Verify that the compatibility shim ships no Python packages or NAT entry points."""
     pyproject = _load_pyproject()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/nvidia_nat_redis/tests/test_shim_metadata.py` around lines 15 - 20,
Add a short docstring to the test function
test_shim_has_no_python_packages_or_nat_entry_points describing the intent
(validate that the shim exposes no Python packages, no nat entry points, and no
Python files under src/nat/plugins/redis); update the function header where
_load_pyproject(), pyproject assertions, and the glob check against
(PACKAGE_ROOT / "src" / "nat" / "plugins" / "redis") are located to include this
one-line docstring so future readers understand what the test is verifying.

Source: Coding guidelines


23-27: 💤 Low value

Consider adding a docstring to document test intent.

A brief docstring would clarify that this test validates the shim's external dependency declaration.

📖 Suggested docstring
 def test_shim_depends_on_external_redis_plugin():
+    """Verify that the shim declares exactly one dependency on the external Redis plugin."""
     pyproject = _load_pyproject()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/nvidia_nat_redis/tests/test_shim_metadata.py` around lines 23 - 27,
Add a brief docstring to the test_shim_depends_on_external_redis_plugin function
that explains its intent: it verifies that the shim's pyproject declares the
external Redis dependency. Edit the test_shim_depends_on_external_redis_plugin
function (which calls _load_pyproject and asserts dependencies ==
["nemo-agent-toolkit-redis>=0.1.0,<2.0.0"]) and add a one- or two-sentence
docstring at the top of the function describing that it ensures the package
lists the external Redis plugin dependency.

Source: Coding guidelines


10-12: 💤 Low value

Consider adding a docstring for clarity.

While this helper function is straightforward, the coding guidelines require Google-style docstrings for functions. A brief docstring would improve maintainability.

📖 Suggested docstring
 def _load_pyproject() -> dict:
+    """Load and parse the package's pyproject.toml file.
+
+    Returns:
+        Parsed TOML configuration as a dictionary.
+    """
     with (PACKAGE_ROOT / "pyproject.toml").open("rb") as pyproject_file:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/nvidia_nat_redis/tests/test_shim_metadata.py` around lines 10 - 12,
Add a Google-style docstring to the helper function _load_pyproject that briefly
explains its purpose (loads and returns the parsed pyproject.toml as a dict),
describes the return type (dict), and notes any side effects or file assumptions
(reads PACKAGE_ROOT / "pyproject.toml"). Place the docstring immediately below
the def _load_pyproject() signature and follow Google docstring formatting for a
short summary and a Returns section.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/nvidia_nat_redis/tests/test_shim_metadata.py`:
- Around line 1-2: The file currently only has SPDX tags and must include the
full Apache-2.0 license header block; update the top of
packages/nvidia_nat_redis/tests/test_shim_metadata.py to prepend the complete
Apache-2.0 header template (the multi-line comment block used in this repo,
e.g., lines 4–15 from packages/nvidia_nat_redis/pyproject.toml) so the SPDX tags
remain but are followed by the full license header exactly as in other source
files.

---

Nitpick comments:
In `@packages/nvidia_nat_redis/tests/test_shim_metadata.py`:
- Around line 15-20: Add a short docstring to the test function
test_shim_has_no_python_packages_or_nat_entry_points describing the intent
(validate that the shim exposes no Python packages, no nat entry points, and no
Python files under src/nat/plugins/redis); update the function header where
_load_pyproject(), pyproject assertions, and the glob check against
(PACKAGE_ROOT / "src" / "nat" / "plugins" / "redis") are located to include this
one-line docstring so future readers understand what the test is verifying.
- Around line 23-27: Add a brief docstring to the
test_shim_depends_on_external_redis_plugin function that explains its intent: it
verifies that the shim's pyproject declares the external Redis dependency. Edit
the test_shim_depends_on_external_redis_plugin function (which calls
_load_pyproject and asserts dependencies ==
["nemo-agent-toolkit-redis>=0.1.0,<2.0.0"]) and add a one- or two-sentence
docstring at the top of the function describing that it ensures the package
lists the external Redis plugin dependency.
- Around line 10-12: Add a Google-style docstring to the helper function
_load_pyproject that briefly explains its purpose (loads and returns the parsed
pyproject.toml as a dict), describes the return type (dict), and notes any side
effects or file assumptions (reads PACKAGE_ROOT / "pyproject.toml"). Place the
docstring immediately below the def _load_pyproject() signature and follow
Google docstring formatting for a short summary and a Returns section.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 248891ff-e6fa-4b8e-95c5-d209e8d4cae2

📥 Commits

Reviewing files that changed from the base of the PR and between 33eade3 and 85c5145.

⛔ Files ignored due to path filters (54)
  • examples/A2A/math_assistant_a2a/uv.lock is excluded by !**/*.lock
  • examples/A2A/math_assistant_a2a_protected/uv.lock is excluded by !**/*.lock
  • examples/HITL/por_to_jiratickets/uv.lock is excluded by !**/*.lock
  • examples/HITL/simple_calculator_hitl/uv.lock is excluded by !**/*.lock
  • examples/MCP/service_account_auth_mcp/uv.lock is excluded by !**/*.lock
  • examples/MCP/simple_auth_mcp/uv.lock is excluded by !**/*.lock
  • examples/MCP/simple_calculator_fastmcp/uv.lock is excluded by !**/*.lock
  • examples/MCP/simple_calculator_fastmcp_protected/uv.lock is excluded by !**/*.lock
  • examples/MCP/simple_calculator_mcp/uv.lock is excluded by !**/*.lock
  • examples/MCP/simple_calculator_mcp_protected/uv.lock is excluded by !**/*.lock
  • examples/RAG/simple_rag/uv.lock is excluded by !**/*.lock
  • examples/a365_example/uv.lock is excluded by !**/*.lock
  • examples/advanced_agents/alert_triage_agent/uv.lock is excluded by !**/*.lock
  • examples/agents/uv.lock is excluded by !**/*.lock
  • examples/control_flow/hybrid_control_flow/uv.lock is excluded by !**/*.lock
  • examples/control_flow/parallel_executor/uv.lock is excluded by !**/*.lock
  • examples/control_flow/router_agent/uv.lock is excluded by !**/*.lock
  • examples/control_flow/sequential_executor/uv.lock is excluded by !**/*.lock
  • examples/custom_functions/automated_description_generation/uv.lock is excluded by !**/*.lock
  • examples/custom_functions/plot_charts/uv.lock is excluded by !**/*.lock
  • examples/documentation_guides/uv.lock is excluded by !**/*.lock
  • examples/documentation_guides/workflows/text_file_ingest/uv.lock is excluded by !**/*.lock
  • examples/dynamo_integration/latency_sensitivity_demo/uv.lock is excluded by !**/*.lock
  • examples/dynamo_integration/react_benchmark_agent/uv.lock is excluded by !**/*.lock
  • examples/evaluation_and_profiling/email_phishing_analyzer/uv.lock is excluded by !**/*.lock
  • examples/evaluation_and_profiling/simple_calculator_eval/uv.lock is excluded by !**/*.lock
  • examples/evaluation_and_profiling/simple_web_query_eval/uv.lock is excluded by !**/*.lock
  • examples/experimental/claude_code_agent_adapter/uv.lock is excluded by !**/*.lock
  • examples/experimental/codex_agent_adapter/uv.lock is excluded by !**/*.lock
  • examples/experimental/cursor_agent_adapter/uv.lock is excluded by !**/*.lock
  • examples/experimental/hermes_agent_adapter/uv.lock is excluded by !**/*.lock
  • examples/experimental/openclaw_agent_adapter/uv.lock is excluded by !**/*.lock
  • examples/finetuning/dpo_tic_tac_toe/uv.lock is excluded by !**/*.lock
  • examples/finetuning/rl_with_openpipe_art/uv.lock is excluded by !**/*.lock
  • examples/frameworks/adk_demo/uv.lock is excluded by !**/*.lock
  • examples/frameworks/agno_personal_finance/uv.lock is excluded by !**/*.lock
  • examples/frameworks/haystack_deep_research_agent/uv.lock is excluded by !**/*.lock
  • examples/frameworks/multi_frameworks/uv.lock is excluded by !**/*.lock
  • examples/frameworks/nat_autogen_demo/uv.lock is excluded by !**/*.lock
  • examples/frameworks/semantic_kernel_demo/uv.lock is excluded by !**/*.lock
  • examples/frameworks/strands_demo/uv.lock is excluded by !**/*.lock
  • examples/front_ends/per_user_workflow/uv.lock is excluded by !**/*.lock
  • examples/front_ends/simple_auth/uv.lock is excluded by !**/*.lock
  • examples/front_ends/simple_calculator_custom_routes/uv.lock is excluded by !**/*.lock
  • examples/getting_started/simple_calculator/uv.lock is excluded by !**/*.lock
  • examples/getting_started/simple_web_query/uv.lock is excluded by !**/*.lock
  • examples/memory/redis/uv.lock is excluded by !**/*.lock
  • examples/notebooks/uv.lock is excluded by !**/*.lock
  • examples/object_store/user_report/uv.lock is excluded by !**/*.lock
  • examples/observability/simple_calculator_observability/uv.lock is excluded by !**/*.lock
  • examples/prompt_from_file/uv.lock is excluded by !**/*.lock
  • examples/safety_and_security/retail_agent/uv.lock is excluded by !**/*.lock
  • packages/nvidia_nat_redis/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (18)
  • docs/source/build-workflows/memory.md
  • docs/source/build-workflows/object-store.md
  • docs/source/components/agents/auto-memory-wrapper/auto-memory-wrapper.md
  • docs/source/extend/custom-components/memory.md
  • docs/source/get-started/installation.md
  • packages/nvidia_nat_redis/pyproject.toml
  • packages/nvidia_nat_redis/src/nat/meta/pypi.md
  • packages/nvidia_nat_redis/src/nat/plugins/redis/__init__.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/memory.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/object_store.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/redis_editor.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/redis_object_store.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/register.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/schema.py
  • packages/nvidia_nat_redis/tests/test_redis_editor.py
  • packages/nvidia_nat_redis/tests/test_redis_object_store.py
  • packages/nvidia_nat_redis/tests/test_shim_metadata.py
  • pyproject.toml
💤 Files with no reviewable changes (8)
  • packages/nvidia_nat_redis/tests/test_redis_editor.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/schema.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/redis_object_store.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/object_store.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/redis_editor.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/memory.py
  • packages/nvidia_nat_redis/tests/test_redis_object_store.py
  • packages/nvidia_nat_redis/src/nat/plugins/redis/register.py

Comment thread packages/nvidia_nat_redis/tests/test_shim_metadata.py Outdated
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@bbednarski9

Copy link
Copy Markdown
Contributor Author

@bbednarski9 bbednarski9 added the DO NOT MERGE PR should not be merged; see PR for details label Jun 10, 2026
@bbednarski9

Copy link
Copy Markdown
Contributor Author

Making the call to kick this to 1.9, too close to 1.8 release to bring in this breaking change without QA

@bbednarski9 bbednarski9 reopened this Jun 10, 2026
@bbednarski9 bbednarski9 changed the base branch from release/1.8 to develop June 10, 2026 18:38
rapids-bot Bot pushed a commit that referenced this pull request Jun 10, 2026
Had previously removed this prior to validating updates to the nemo-agent-toolkit-redis third-party distribution. The feedback has been incorporated and a release that is compatible with nemo-agent-toolkit v1.8 is on the way.

This does not mean that we have closed out #2046. for NAT 1.8, both the NAT-native library and the third-party package will be viable paths. But we will not cutover the documentation until NAT 1.9 because requiring the uv install is a breaking change for existing Redis users.

## By Submitting this PR I confirm:
- I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA/NeMo-Agent-Toolkit/blob/develop/docs/source/resources/contributing/index.md).
- We require that all contributors "sign-off" on their commits. This certifies that the contribution is your original work, or you have rights to submit it under the same license, or a compatible license.
  - Any contribution which contains commits that are not Signed-Off will not be accepted.
- When the PR is ready for review, new or existing tests cover these changes.
- When the PR is ready for review, the documentation is up to date with these changes.




## Summary by CodeRabbit

* **Documentation**
  * Updated release notes and README to acknowledge NeMo-Agent-Toolkit-Redis as a newly supported third-party plugin toolkit available through the Public Plugin API, complementing existing plugin references and providing users a comprehensive view of integration options for extending the platform.

Authors:
  - Bryan Bednarski (https://github.com/bbednarski9)

Approvers:
  - David Gardner (https://github.com/dagardner-nv)

URL: #2051
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking Breaking change DO NOT MERGE PR should not be merged; see PR for details doc Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant