chore: Remove the hermes_cli adapter, rename the hermes_sdk adapter to hermes - #59
Conversation
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
…er or to common utils Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
…es adapter Signed-off-by: David Gardner <dagardner@nvidia.com>
…s-agent-adapter Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Enterprise Run ID: 📒 Files selected for processing (1)
📜 Recent review details⏰ Context from checks skipped due to timeout. (2)
🧰 Additional context used📓 Path-based instructions (5)tests/**/*.py📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
Files:
**/*.py📄 CodeRabbit inference engine (CONTRIBUTING.md)
Files:
**/*.{rs,py}📄 CodeRabbit inference engine (CONTRIBUTING.md)
Files:
**/*📄 CodeRabbit inference engine (CONTRIBUTING.md)
Files:
{tests/**,python/tests/**}⚙️ CodeRabbit configuration file
Files:
🧠 Learnings (1)📓 Common learnings🔇 Additional comments (1)
WalkthroughThe PR consolidates Hermes SDK and CLI paths into one Hermes adapter, relocates shared helpers, updates package and adapter identifiers, removes the CLI adapter, and aligns configuration, documentation, examples, fixtures, and tests with the unified Hermes workflow. ChangesHermes adapter consolidation
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Fabric
participant HermesAdapter
participant CommonUtils
participant HermesRuntime
Fabric->>HermesAdapter: run Hermes configuration
HermesAdapter->>CommonUtils: resolve request and model settings
HermesAdapter->>HermesRuntime: write config and execute Hermes
HermesRuntime-->>Fabric: return result and native config summary
Possibly related PRs
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 error, 1 warning)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
📖 Fern docs preview: https://nvidia-preview-pull-request-59.docs.buildwithfern.com/nemo/fabric |
hermes_cli adapter, rename the hermes_sdk adapter to hermeshermes_cli adapter, rename the hermes_sdk adapter to hermes
There was a problem hiding this comment.
Actionable comments posted: 9
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
CONTRIBUTING.md (1)
26-30: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winUse “Hermes adapter” consistently in this installation step.
Line 26 still says “Hermes SDK adapter” while the command installs the unified
adapters-hermesextra. Rename the prose to avoid directing contributors toward the removed adapter terminology.Proposed fix
-Adapters are distributed as optional extras. For example, install the Hermes -SDK adapter with: +Adapters are distributed as optional extras. For example, install the Hermes +adapter with:As per path instructions, documentation changes must remain technically accurate against the current adapter naming.
🤖 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 `@CONTRIBUTING.md` around lines 26 - 30, Update the installation example prose in CONTRIBUTING.md to call it the “Hermes adapter” instead of the removed “Hermes SDK adapter” terminology, while leaving the existing adapters-hermes installation command unchanged.Source: Path instructions
🤖 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 `@adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py`:
- Around line 103-120: Remove the server["command"] fallback from
hermes_mcp_server_config and require the existing url field for target
resolution, since McpServerPlan only provides transport, url, and exposure.
Preserve transport handling and the existing validation for a missing target; do
not expand the schema.
In `@crates/fabric-core/src/config.rs`:
- Line 2028: Update the remaining embedded Hermes adapter identifier in the test
module configuration to use nvidia.fabric.hermes instead of
nvidia.fabric.hermes.sdk, matching the updated fixtures and descriptor contract.
Locate the stale value near the adapter_id configuration and preserve the
surrounding test setup.
In `@docs/getting-started/overview.mdx`:
- Line 120: Update the repository quick-start link in the documentation to use
the README heading’s valid GitHub anchor, quick-start-hermes-agent, while
preserving the existing link destination and label.
In `@examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml`:
- Around line 10-17: Restore the terminal_timeout setting to 120 under the
harness.settings configuration in hermes-relay.yaml. Preserve the existing
Hermes adapter behavior and ensure long-running terminal and MCP operations
retain the 120-second timeout instead of the 60-second default.
In `@examples/harbor/README.md`:
- Line 74: Update the adapter-selection instructions surrounding adapter_id so
they no longer reference the retired “Hermes CLI” and “Hermes SDK” names.
Describe the current unified Hermes adapter alongside the Codex CLI and
Relay-enabled variants, keeping the documented configuration technically
accurate.
In `@README.md`:
- Around line 50-53: Update the “Quick Start: Hermes Agent” setup instructions
to install the nemo-fabric-adapters-hermes package into the .tmp/hermes-venv
environment used by ADAPTER_PYTHON, or instead configure ADAPTER_PYTHON to
reference an environment where that adapter is already installed.
In `@tests/adapters/test_hermes_adapter.py`:
- Around line 318-364: Replace the hand-rolled FakeSessionDB and FakeAIAgent
classes with unittest.mock MagicMock/AsyncMock instances, using spec for the
corresponding production types. Configure get_session,
resolve_resume_session_id, get_messages_as_conversation, and run_conversation
through side_effects or return values while preserving captured-call behavior;
rename the test doubles to mock-prefixed variables and remove the bespoke
constructors and unused mirrored parameters.
- Around line 389-404: Replace the module-stub lambdas assigned to
hermes_config.load_config, hermes_plugins.discover_plugins, and
hermes_plugins.invoke_hook with named no-op callables or equivalent stubs that
avoid unused-argument warnings and satisfy Ruff PIE807/ARG005, while preserving
their current return and invocation behavior.
In `@tests/e2e/test_hermes_runtime.py`:
- Around line 60-69: Collapse the pass-through _run() and _run_sdk_runtime()
functions into a single _run_hermes_runtime() function, moving the existing
runtime setup and Fabric.start_runtime flow into it. Update the invocation to
use _run_hermes_runtime and remove the obsolete _sdk-named helper.
---
Outside diff comments:
In `@CONTRIBUTING.md`:
- Around line 26-30: Update the installation example prose in CONTRIBUTING.md to
call it the “Hermes adapter” instead of the removed “Hermes SDK adapter”
terminology, while leaving the existing adapters-hermes installation command
unchanged.
🪄 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: ASSERTIVE
Plan: Enterprise
Run ID: 1ad535d8-71d5-455d-881f-3071809c8148
⛔ Files ignored due to path filters (3)
adapters/hermes-cli/uv.lockis excluded by!**/*.lockadapters/hermes/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (57)
CONTRIBUTING.mdREADME.mdadapters/common/src/nemo_fabric_adapters/common/hermes.pyadapters/common/src/nemo_fabric_adapters/common/utils.pyadapters/hermes-cli/README.mdadapters/hermes-cli/fabric-adapter.jsonadapters/hermes-cli/pyproject.tomladapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/__init__.pyadapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/adapter.pyadapters/hermes/LICENSEadapters/hermes/README.mdadapters/hermes/fabric-adapter.jsonadapters/hermes/pyproject.tomladapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rscrates/fabric-core/src/doctor.rsdocs/getting-started/install.mdxdocs/getting-started/overview.mdxdocs/integrations/harbor.mdxdocs/sdk/python.mdxexamples/code_review_agent/README.mdexamples/code_review_agent/__init__.pyexamples/code_review_agent/__main__.pyexamples/code_review_agent/config.pyexamples/harbor/README.mdexamples/harbor/demo/README.mdexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamlexamples/harbor/demo/task/environment/fabric/configs/hermes.yamljustfilepyproject.tomltests/adapters/test_adapaters_common_utils.pytests/adapters/test_codex_cli.pytests/adapters/test_deepagents.pytests/adapters/test_hermes_adapter.pytests/adapters/test_hermes_cli.pytests/adapters/test_hermes_cli_preflight.pytests/adapters/test_hermes_sdk_adapter.pytests/conftest.pytests/e2e/test_cli.pytests/e2e/test_hermes_cli.pytests/e2e/test_hermes_config_mapping.pytests/e2e/test_hermes_e2e.pytests/e2e/test_hermes_runtime.pytests/fixtures/file-config-agent/agent.yamltests/fixtures/file-config-agent/profiles/hermes-cli.yamltests/fixtures/file-config-agent/profiles/hermes.yamltests/fixtures/hermes-cli-agent/agent.yamltests/fixtures/hermes-cli-agent/bin/fake-hermes.pytests/fixtures/hermes-cli-agent/profiles/env-local.yamltests/fixtures/hermes-cli-agent/repos/my-service/README.mdtests/fixtures/hermes-cli-agent/skills/code-review/SKILL.mdtests/python/test_code_review_example.pytests/python/test_harbor_integration.pytests/python/test_native_sdk.pytests/python/test_readme_examples.pytests/python/test_sdk_runtimes.pytests/python/test_typed_config.py
💤 Files with no reviewable changes (18)
- tests/fixtures/hermes-cli-agent/skills/code-review/SKILL.md
- tests/fixtures/hermes-cli-agent/profiles/env-local.yaml
- tests/fixtures/hermes-cli-agent/repos/my-service/README.md
- tests/fixtures/hermes-cli-agent/agent.yaml
- adapters/hermes-cli/fabric-adapter.json
- adapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/init.py
- tests/adapters/test_hermes_cli_preflight.py
- tests/fixtures/hermes-cli-agent/bin/fake-hermes.py
- tests/e2e/test_hermes_cli.py
- adapters/hermes-cli/README.md
- tests/adapters/test_hermes_cli.py
- tests/adapters/test_deepagents.py
- tests/adapters/test_hermes_sdk_adapter.py
- adapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/adapter.py
- tests/fixtures/file-config-agent/profiles/hermes-cli.yaml
- adapters/common/src/nemo_fabric_adapters/common/hermes.py
- tests/conftest.py
- adapters/hermes-cli/pyproject.toml
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
- GitHub Check: Test (x86_64)
🧰 Additional context used
📓 Path-based instructions (15)
**/*
📄 CodeRabbit inference engine (CONTRIBUTING.md)
All source files must include the appropriate SPDX copyright and Apache-2.0 license header.
Files:
adapters/hermes/LICENSEdocs/getting-started/install.mdxadapters/hermes/README.mdadapters/hermes/pyproject.tomltests/fixtures/file-config-agent/profiles/hermes.yamlCONTRIBUTING.mdexamples/harbor/demo/README.mdtests/python/test_readme_examples.pycrates/fabric-core/src/doctor.rsexamples/harbor/README.mdtests/python/test_native_sdk.pyexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamldocs/sdk/python.mdxtests/python/test_sdk_runtimes.pyREADME.mdtests/fixtures/file-config-agent/agent.yamlexamples/code_review_agent/__init__.pydocs/getting-started/overview.mdxexamples/harbor/demo/task/environment/fabric/configs/hermes.yamlexamples/code_review_agent/__main__.pytests/e2e/test_hermes_config_mapping.pypyproject.tomldocs/integrations/harbor.mdxtests/e2e/test_cli.pytests/adapters/test_adapaters_common_utils.pyadapters/hermes/fabric-adapter.jsonexamples/code_review_agent/config.pyjustfiletests/python/test_code_review_example.pyadapters/common/src/nemo_fabric_adapters/common/utils.pyexamples/code_review_agent/README.mdtests/python/test_typed_config.pytests/e2e/test_hermes_runtime.pytests/python/test_harbor_integration.pytests/adapters/test_hermes_adapter.pyadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_codex_cli.pytests/e2e/test_hermes_e2e.py
{adapters/**,examples/**}
⚙️ CodeRabbit configuration file
{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.
Files:
adapters/hermes/LICENSEadapters/hermes/README.mdadapters/hermes/pyproject.tomlexamples/harbor/demo/README.mdexamples/harbor/README.mdexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamlexamples/code_review_agent/__init__.pyexamples/harbor/demo/task/environment/fabric/configs/hermes.yamlexamples/code_review_agent/__main__.pyadapters/hermes/fabric-adapter.jsonexamples/code_review_agent/config.pyadapters/common/src/nemo_fabric_adapters/common/utils.pyexamples/code_review_agent/README.mdadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
**/*.{md,mdx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update documentation when public behavior, adapters, examples, or workspace structure changes.
Files:
docs/getting-started/install.mdxadapters/hermes/README.mdCONTRIBUTING.mdexamples/harbor/demo/README.mdexamples/harbor/README.mddocs/sdk/python.mdxREADME.mddocs/getting-started/overview.mdxdocs/integrations/harbor.mdxexamples/code_review_agent/README.md
**/*.mdx
📄 CodeRabbit inference engine (CONTRIBUTING.md)
For documentation-site changes, run
just docsto regenerate Python and Rust API references and validate Fern configuration.
Files:
docs/getting-started/install.mdxdocs/sdk/python.mdxdocs/getting-started/overview.mdxdocs/integrations/harbor.mdx
**/*.{rs,py,html,md,mdx,toml,yaml,yml,sh,bash}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use the file-type-specific SPDX comment syntax and required copyright/license text for Rust, Python, HTML/Markdown, MDX, TOML/YAML, and shell files.
Files:
docs/getting-started/install.mdxadapters/hermes/README.mdadapters/hermes/pyproject.tomltests/fixtures/file-config-agent/profiles/hermes.yamlCONTRIBUTING.mdexamples/harbor/demo/README.mdtests/python/test_readme_examples.pycrates/fabric-core/src/doctor.rsexamples/harbor/README.mdtests/python/test_native_sdk.pyexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamldocs/sdk/python.mdxtests/python/test_sdk_runtimes.pyREADME.mdtests/fixtures/file-config-agent/agent.yamlexamples/code_review_agent/__init__.pydocs/getting-started/overview.mdxexamples/harbor/demo/task/environment/fabric/configs/hermes.yamlexamples/code_review_agent/__main__.pytests/e2e/test_hermes_config_mapping.pypyproject.tomldocs/integrations/harbor.mdxtests/e2e/test_cli.pytests/adapters/test_adapaters_common_utils.pyexamples/code_review_agent/config.pytests/python/test_code_review_example.pyadapters/common/src/nemo_fabric_adapters/common/utils.pyexamples/code_review_agent/README.mdtests/python/test_typed_config.pytests/e2e/test_hermes_runtime.pytests/python/test_harbor_integration.pytests/adapters/test_hermes_adapter.pyadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_codex_cli.pytests/e2e/test_hermes_e2e.py
{docs/**,README.md,AGENTS.md}
⚙️ CodeRabbit configuration file
{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.
Files:
docs/getting-started/install.mdxdocs/sdk/python.mdxREADME.mddocs/getting-started/overview.mdxdocs/integrations/harbor.mdx
**/README.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update the relevant adapter or example
README.mdwhen that surface changes.
Files:
adapters/hermes/README.mdexamples/harbor/demo/README.mdexamples/harbor/README.mdREADME.mdexamples/code_review_agent/README.md
{tests/**,python/tests/**}
⚙️ CodeRabbit configuration file
{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.
Files:
tests/fixtures/file-config-agent/profiles/hermes.yamltests/python/test_readme_examples.pytests/python/test_native_sdk.pytests/python/test_sdk_runtimes.pytests/fixtures/file-config-agent/agent.yamltests/e2e/test_hermes_config_mapping.pytests/e2e/test_cli.pytests/adapters/test_adapaters_common_utils.pytests/python/test_code_review_example.pytests/python/test_typed_config.pytests/e2e/test_hermes_runtime.pytests/python/test_harbor_integration.pytests/adapters/test_hermes_adapter.pytests/adapters/test_codex_cli.pytests/e2e/test_hermes_e2e.py
tests/**/*.py
📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
tests/**/*.py: Usepytestto run Python tests.
Do not add@pytest.mark.asyncioto test functions; async tests are detected and run automatically.
Do not add-> Nonereturn type annotations to test functions.
When mocking a class, do not define a new class; useunittest.mock.MagicMockorunittest.mock.AsyncMock, addingspecwhen needed.
Name mocked classes with amockprefix, notfake.
Prefer pytest fixtures over helper methods.
Do not duplicate fixtures across test files; if a fixture is needed in multiple test files, define it inconftest.py.
When creating a fixture, use@pytest.fixture(name="<fixture_name>"[, scope="<scope>"])and define the function as<fixture_name>_fixture() -> <return_type>; only passscopewhen it is notfunction.
Preferpytest.mark.parametrizeover creating separate tests for different input types.
If a fixture is needed for a test but does not return a value, or its value is unused, use@pytest.mark.usefixtures.
When modifying environment variables in a test, useos.environ;tests/conftest.pyprovides an autouserestore_environ_fixturethat restores environment variables after each test, somonkeypatch.setenvis unnecessary.
Files:
tests/python/test_readme_examples.pytests/python/test_native_sdk.pytests/python/test_sdk_runtimes.pytests/e2e/test_hermes_config_mapping.pytests/e2e/test_cli.pytests/adapters/test_adapaters_common_utils.pytests/python/test_code_review_example.pytests/python/test_typed_config.pytests/e2e/test_hermes_runtime.pytests/python/test_harbor_integration.pytests/adapters/test_hermes_adapter.pytests/adapters/test_codex_cli.pytests/e2e/test_hermes_e2e.py
**/*.{rs,py}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.{rs,py}: Usesnake_casefor functions and variables; usePascalCasefor Rust types and Python classes.
Keep native Python binding declarations synchronized with their Rust implementations.
Run tests for every language surface affected by a change; changes to the Rust core or public schemas require both Rust and Python test suites.
When adding functionality, include tests in the corresponding Rust crate or relevant area undertests/.
Files:
tests/python/test_readme_examples.pycrates/fabric-core/src/doctor.rstests/python/test_native_sdk.pytests/python/test_sdk_runtimes.pyexamples/code_review_agent/__init__.pyexamples/code_review_agent/__main__.pytests/e2e/test_hermes_config_mapping.pytests/e2e/test_cli.pytests/adapters/test_adapaters_common_utils.pyexamples/code_review_agent/config.pytests/python/test_code_review_example.pyadapters/common/src/nemo_fabric_adapters/common/utils.pytests/python/test_typed_config.pytests/e2e/test_hermes_runtime.pytests/python/test_harbor_integration.pytests/adapters/test_hermes_adapter.pyadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_codex_cli.pytests/e2e/test_hermes_e2e.py
**/*.py
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use type annotations for public Python APIs.
Files:
tests/python/test_readme_examples.pytests/python/test_native_sdk.pytests/python/test_sdk_runtimes.pyexamples/code_review_agent/__init__.pyexamples/code_review_agent/__main__.pytests/e2e/test_hermes_config_mapping.pytests/e2e/test_cli.pytests/adapters/test_adapaters_common_utils.pyexamples/code_review_agent/config.pytests/python/test_code_review_example.pyadapters/common/src/nemo_fabric_adapters/common/utils.pytests/python/test_typed_config.pytests/e2e/test_hermes_runtime.pytests/python/test_harbor_integration.pytests/adapters/test_hermes_adapter.pyadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pytests/adapters/test_codex_cli.pytests/e2e/test_hermes_e2e.py
**/*.rs
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.rs: Format Rust code withcargo fmt --alland ensurecargo fmt --all -- --checkpasses.
Runcargo check --workspace --lockedwhen changing the Rust core, CLI, or native Python extension.
Files:
crates/fabric-core/src/doctor.rscrates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs
⚙️ CodeRabbit configuration file
crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.
Files:
crates/fabric-core/src/doctor.rscrates/fabric-core/src/config.rs
README.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Keep
README.mdcurrent with the workspace, supported adapters, and top-level documentation.
Files:
README.md
**/*.{json,jsonschema}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Public contract changes must keep checked-in JSON Schema snapshots synchronized.
Files:
adapters/hermes/fabric-adapter.json
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-13T23:57:26.252Z
Learning: Versioned release tags must use raw Rust-compatible SemVer without a leading `v`, such as `0.1.0` or `0.1.0-rc.1`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-13T23:57:26.252Z
Learning: All contributors must sign off commits using `git commit -s`; unsigned-off contributions are not accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-13T23:57:26.252Z
Learning: Before submitting a pull request, identify an issue, run relevant tests, verify builds, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-13T23:57:26.252Z
Learning: Pull requests require at least one approving review, passing CI, and a completed PR template.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-13T23:57:26.252Z
Learning: Address review feedback with additional commits and do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-13T23:57:26.252Z
Learning: Use commit messages formatted as `type: short description`, with one of the listed types, and keep the first line under 72 characters.
📚 Learning: 2026-06-29T22:34:52.407Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 27
File: adapters/codex-cli/fabric-adapter.json:13-15
Timestamp: 2026-06-29T22:34:52.407Z
Learning: In NeMo-Fabric adapter manifest files (e.g., `*/fabric-adapter.json`), keep `config.accepts` limited to the top-level Fabric capability sections that `resolve_capability_plan` consumes (such as `models`, `tools`, `mcp`, `skills`, `telemetry`). Do not add adapter-owned `harness.settings` keys to `config.accepts`; `harness.settings` should remain adapter-owned and be passed through unchanged.
Applied to files:
adapters/hermes/fabric-adapter.json
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.
Applied to files:
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
🧬 Code graph analysis (8)
crates/fabric-core/src/doctor.rs (1)
crates/fabric-core/src/config.rs (1)
resolve_run_plan(1172-1175)
examples/code_review_agent/config.py (1)
crates/fabric-core/src/runtime.rs (1)
adapter_id(1129-1134)
tests/python/test_code_review_example.py (1)
crates/fabric-core/src/runtime.rs (1)
harness(1147-1152)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)
tests/e2e/test_hermes_config_mapping.py (1)
payload(46-77)
tests/adapters/test_hermes_adapter.py (1)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (3)
get_messages_as_conversation(169-169)run_conversation(317-317)get_session(166-166)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (2)
adapters/common/src/nemo_fabric_adapters/common/utils.py (7)
settings_payload(107-109)environment_payload(103-104)normalize_list(169-176)telemetry_providers(149-153)dump_yaml(183-189)capability_plan(165-166)relay_enabled(156-157)tests/e2e/test_hermes_config_mapping.py (1)
payload(46-77)
crates/fabric-core/src/config.rs (1)
crates/fabric-core/src/runtime.rs (2)
adapter_id(1129-1134)harness(1147-1152)
tests/e2e/test_hermes_e2e.py (1)
examples/code_review_agent/config.py (1)
with_relay(189-211)
🪛 Ruff (0.15.21)
tests/adapters/test_hermes_adapter.py
[warning] 334-334: Missing return type annotation for special method __init__
Add return type annotation: None
(ANN204)
[warning] 337-337: Unused method argument: base_url
(ARG002)
[warning] 338-338: Unused method argument: api_key
(ARG002)
[warning] 341-341: Unused method argument: max_iterations
(ARG002)
[warning] 342-342: Unused method argument: enabled_toolsets
(ARG002)
[warning] 343-343: Unused method argument: quiet_mode
(ARG002)
[warning] 344-344: Unused method argument: skip_context_files
(ARG002)
[warning] 345-345: Unused method argument: skip_memory
(ARG002)
[warning] 346-346: Unused method argument: save_trajectories
(ARG002)
[warning] 347-347: Unused method argument: max_tokens
(ARG002)
[warning] 348-348: Unused method argument: temperature
(ARG002)
[warning] 349-349: Unused method argument: reasoning_config
(ARG002)
[warning] 350-350: Unused method argument: insert_reasoning
(ARG002)
[warning] 353-353: Dynamically typed expressions (typing.Any) are disallowed in session_db
(ANN401)
[warning] 391-391: Prefer dict over useless lambda
Replace with lambda with dict
(PIE807)
[warning] 393-393: Unused lambda argument: force
(ARG005)
[warning] 394-394: Unused lambda argument: args
(ARG005)
[warning] 394-394: Unused lambda argument: kwargs
(ARG005)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
[warning] 29-29: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 110-110: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 205-205: Avoid specifying long messages outside the exception class
(TRY003)
🔇 Additional comments (43)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)
54-57: LGTM!Also applies to: 115-142, 178-181, 247-247, 455-456
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (1)
5-5: LGTM!Also applies to: 26-30, 32-88, 90-100, 122-131, 141-144, 173-262, 265-335
adapters/hermes/LICENSE (1)
1-1: LGTM!adapters/hermes/README.md (1)
6-8: LGTM!adapters/hermes/fabric-adapter.json (1)
3-7: LGTM!adapters/hermes/pyproject.toml (1)
11-13: LGTM!Also applies to: 38-41
crates/fabric-core/src/config.rs (1)
2017-2017: LGTM!Also applies to: 2093-2093, 2111-2111, 2139-2139, 2349-2361, 2392-2397, 2440-2450, 2721-2730, 2764-2773
justfile (1)
13-13: 🗄️ Data Integrity & IntegrationVerify that excluding
pythonis intentional.
build-python’sno_uv=truepath and thewheelstarget iteratepython_projects, butpyproject.tomlmapsnemo-fabric-runtimeto thepythonproject and the normal path explicitly installs theruntimeextra. Unlessbuild-rusthandles that project separately, these paths may omit the runtime package. Addpythonback or confirm the separate build ownership.pyproject.toml (1)
53-54: LGTM!Also applies to: 75-75, 94-94, 129-129
docs/getting-started/install.mdx (1)
71-81: LGTM!crates/fabric-core/src/doctor.rs (1)
532-549: LGTM!tests/fixtures/file-config-agent/agent.yaml (1)
11-11: LGTM!tests/fixtures/file-config-agent/profiles/hermes.yaml (1)
5-9: LGTM!Also applies to: 26-31
CONTRIBUTING.md (1)
255-255: LGTM!README.md (1)
111-111: LGTM!Also applies to: 140-142, 174-174
docs/getting-started/overview.mdx (2)
13-13: 📐 Maintainability & Code QualityRun the MDX documentation validation.
Run
just docsto regenerate the Python and Rust API references and validate the Fern configuration.As per coding guidelines,
**/*.mdxchanges requirejust docsto regenerate API references and validate Fern configuration.Also applies to: 54-54, 100-105, 120-120
Source: Coding guidelines
13-13: LGTM!Also applies to: 54-54, 100-105
docs/integrations/harbor.mdx (2)
12-12: LGTM!Also applies to: 71-72
12-12: 📐 Maintainability & Code QualityRun the MDX documentation validation.
Run
just docsto regenerate the Python and Rust API references and validate the Fern configuration.As per coding guidelines,
**/*.mdxchanges requirejust docsto regenerate API references and validate Fern configuration.Also applies to: 71-72
Source: Coding guidelines
docs/sdk/python.mdx (2)
45-45: LGTM!Also applies to: 195-196
45-45: 📐 Maintainability & Code QualityRun the MDX documentation validation.
Run
just docsto regenerate the Python and Rust API references and validate the Fern configuration.As per coding guidelines,
**/*.mdxchanges requirejust docsto regenerate API references and validate Fern configuration.Also applies to: 195-196
Source: Coding guidelines
examples/harbor/demo/task/environment/fabric/configs/hermes.yaml (1)
8-17: 🩺 Stability & AvailabilityVerify that removing
terminal_timeoutdoes not remove the only wall-clock guard.
max_iterationslimits iterations, but it does not necessarily stop a hung model or API call. Confirm that the unified Hermes adapter or Harbor runtime enforces an equivalent timeout; otherwise this demo can remain running indefinitely.As per path instructions, example configuration changes must preserve command correctness and compatibility with the public Fabric contracts.
Source: Path instructions
examples/code_review_agent/README.md (1)
23-25: LGTM!Also applies to: 44-63, 72-74, 89-96
examples/code_review_agent/__init__.py (1)
8-12: LGTM!Also applies to: 20-32
examples/code_review_agent/__main__.py (1)
19-27: LGTM!Also applies to: 30-32
examples/code_review_agent/config.py (1)
36-36: LGTM!Also applies to: 70-75, 92-97
examples/harbor/README.md (1)
194-194: LGTM!examples/harbor/demo/README.md (1)
77-77: LGTM!tests/adapters/test_adapaters_common_utils.py (1)
73-76: LGTM!Also applies to: 78-91, 93-116, 118-152, 274-276
tests/adapters/test_codex_cli.py (1)
1-16: LGTM!Also applies to: 142-685
tests/adapters/test_hermes_adapter.py (2)
4-19: LGTM!Also applies to: 23-44, 85-85, 185-185, 222-222, 267-267, 281-285
304-451: Logic verified:run_hermes/_invoke_hermeswiring matches (session-id resolution, DB history load,hermes_homepath). No functional issues found in the async coverage itself.tests/e2e/test_cli.py (1)
37-37: LGTM!Also applies to: 56-63, 64-66
tests/e2e/test_hermes_config_mapping.py (1)
10-16: LGTM!tests/python/test_typed_config.py (1)
44-49: LGTM!Also applies to: 104-106
tests/python/test_code_review_example.py (1)
16-16: LGTM!Also applies to: 30-40, 49-49, 79-79, 88-90
tests/e2e/test_hermes_e2e.py (1)
9-31: LGTM!Also applies to: 122-123, 197-198
tests/python/test_harbor_integration.py (2)
119-120: LGTM!Also applies to: 222-222
17-18: 🩺 Stability & AvailabilityKeep
nemo_fabricimportable in plainpytestruns
tests/conftest.pyonly prepends the repo root, notpython/src, andpyproject.tomlhere doesn’t show a pytestpythonpathor editable-install hook. Ifnemo_fabricstill lives underpython/src, this removal will break imports outside the current environment.tests/python/test_native_sdk.py (1)
69-69: LGTM!Also applies to: 81-81
tests/python/test_readme_examples.py (1)
10-10: LGTM!Also applies to: 44-44
tests/python/test_sdk_runtimes.py (1)
25-28: LGTM!Also applies to: 83-83
tests/e2e/test_hermes_runtime.py (1)
88-89: 📐 Maintainability & Code QualityNo leftover
hermes_cli_configimport remains.> Likely an incorrect or invalid review comment.
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
examples/code_review_agent/README.md (1)
23-24: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winFix the quick-start anchor.
The root heading is
Quick Start: Hermes Agent, whose generated anchor is#quick-start-hermes-agent;#quick-start-hermeswill not navigate to it.🤖 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 `@examples/code_review_agent/README.md` around lines 23 - 24, Update the Hermes quick-start link in the default variant instructions to use the generated anchor for the root heading, `#quick-start-hermes-agent`, while preserving the existing README reference and link text.Source: Path instructions
🤖 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 `@tests/adapters/test_hermes_adapter.py`:
- Around line 310-334: Remove the monkeypatch.setattr block targeting
mock_ai_agent_type.__init__.__func__, as it mutates the shared MagicMock
initializer and is redundant for a specced AIAgent mock. Retain
mock_ai_agent_type = MagicMock(spec=AIAgent, return_value=mock_ai_agent) and
rely on the spec-based constructor signature matching for
assert_called_once_with.
---
Outside diff comments:
In `@examples/code_review_agent/README.md`:
- Around line 23-24: Update the Hermes quick-start link in the default variant
instructions to use the generated anchor for the root heading,
`#quick-start-hermes-agent`, while preserving the existing README reference and
link text.
🪄 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: ASSERTIVE
Plan: Enterprise
Run ID: 1e722b7e-76a6-483e-9633-f429179364a6
📒 Files selected for processing (9)
CONTRIBUTING.mdREADME.mdadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rsexamples/code_review_agent/README.mdexamples/harbor/README.mdexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamltests/adapters/test_hermes_adapter.pytests/e2e/test_hermes_runtime.py
💤 Files with no reviewable changes (1)
- tests/e2e/test_hermes_runtime.py
📜 Review details
🧰 Additional context used
📓 Path-based instructions (11)
**/*.{rs,py,md,mdx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
If a change affects public behavior, adapters, examples, or workspace structure, update the corresponding documentation in the same branch.
Files:
CONTRIBUTING.mdexamples/harbor/README.mdREADME.mdexamples/code_review_agent/README.mdadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_hermes_adapter.py
**/*.{rs,py,html,md,mdx,toml,yaml,yml,sh,bash}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
All source files must include the appropriate SPDX copyright and Apache-2.0 license headers using the comment syntax required for their file type.
Files:
CONTRIBUTING.mdexamples/harbor/README.mdREADME.mdexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamlexamples/code_review_agent/README.mdadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_hermes_adapter.py
{adapters/**,examples/**}
⚙️ CodeRabbit configuration file
{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.
Files:
examples/harbor/README.mdexamples/harbor/demo/task/environment/fabric/configs/hermes-relay.yamlexamples/code_review_agent/README.mdadapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
{docs/**,README.md,AGENTS.md}
⚙️ CodeRabbit configuration file
{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.
Files:
README.md
**/*.{rs,py}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.{rs,py}: Use language-appropriate naming: Rust and Python functions and variables usesnake_case; Rust types and Python classes usePascalCase.
Run tests for every affected language surface; changes touching the Rust core or public schemas require both Rust and Python test suites.
Keep native Python binding declarations synchronized with their Rust implementations.
Files:
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_hermes_adapter.py
**/*.py
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.
Files:
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pytests/adapters/test_hermes_adapter.py
**/*.{rs,py,json}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
When adding functionality, include tests in the corresponding Rust crate or relevant
tests/area, and keep checked-in JSON Schema snapshots and native Python binding declarations synchronized for public contract changes.
Files:
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.pycrates/fabric-core/src/config.rstests/adapters/test_hermes_adapter.py
**/*.rs
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.rs: Format Rust code withcargo fmt --alland ensure the format check passes withcargo fmt --all -- --check.
Runcargo check --workspace --lockedto verify Rust workspace compilation.
Files:
crates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs
⚙️ CodeRabbit configuration file
crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.
Files:
crates/fabric-core/src/config.rs
tests/**/*.py
📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
tests/**/*.py: Usepytestto run Python tests.
Do not add@pytest.mark.asyncioto test functions; async tests are detected and run automatically.
Do not add-> Nonereturn type annotations to test functions.
When mocking a class, do not define a new class; useunittest.mock.MagicMockorunittest.mock.AsyncMock, addingspecwhen needed.
Name mocked classes with amockprefix, notfake.
Prefer pytest fixtures over helper methods.
Do not duplicate fixtures across test files; if a fixture is needed in multiple test files, define it inconftest.py.
When creating a fixture, use@pytest.fixture(name="<fixture_name>"[, scope="<scope>"])and define the function as<fixture_name>_fixture() -> <return_type>; only passscopewhen it is notfunction.
Preferpytest.mark.parametrizeover creating separate tests for different input types.
If a fixture is needed for a test but does not return a value, or its value is unused, use@pytest.mark.usefixtures.
When modifying environment variables in a test, useos.environ;tests/conftest.pyprovides an autouserestore_environ_fixturethat restores environment variables after each test, somonkeypatch.setenvis unnecessary.
Files:
tests/adapters/test_hermes_adapter.py
{tests/**,python/tests/**}
⚙️ CodeRabbit configuration file
{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.
Files:
tests/adapters/test_hermes_adapter.py
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-14T16:46:54.970Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-14T16:46:54.970Z
Learning: All contributors must sign off commits using Git commit sign-off; unsigned-off commits are not accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-14T16:46:54.970Z
Learning: Use commit messages in the format `type: short description`, with a valid type and a first line under 72 characters.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-14T16:46:54.970Z
Learning: Pull requests require at least one approving review, passing CI, and no force-pushing during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-14T16:46:54.970Z
Learning: Release tags must use raw Rust-compatible SemVer without a leading `v`, such as `0.1.0` or `0.1.0-rc.1`.
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.
Applied to files:
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
🧬 Code graph analysis (1)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (1)
tests/adapters/test_hermes_adapter.py (1)
hermes_mcp_server_config(260-260)
🪛 Ruff (0.15.21)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
[warning] 108-108: Avoid specifying long messages outside the exception class
(TRY003)
🔇 Additional comments (11)
crates/fabric-core/src/config.rs (1)
2017-2017: LGTM!Also applies to: 2028-2028, 2093-2093, 2111-2111, 2139-2139, 2176-2176, 2349-2360, 2392-2397, 2440-2450, 2721-2773
examples/code_review_agent/README.md (1)
44-61: LGTM!Also applies to: 72-72, 89-94
examples/harbor/README.md (1)
63-63: LGTM!Also applies to: 74-74, 194-194
examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml (1)
10-18: LGTM!README.md (1)
50-53: LGTM!Also applies to: 69-97, 118-118, 147-149, 181-181
CONTRIBUTING.md (2)
254-254: LGTM!
26-30: 🎯 Functional Correctness
CONTRIBUTING.mdis already using the canonical Hermes extra. The mismatch is inREADME.md, which still refers tonemo-fabric[hermes]instead ofnemo-fabric[adapters-hermes].> Likely an incorrect or invalid review comment.tests/adapters/test_hermes_adapter.py (3)
335-350: Module-stub lambdas still trigger Ruff PIE807/ARG005.Same low-value static-analysis nit already noted in prior review rounds on this pattern; not re-raising as a fresh issue given its previously assessed low value.
8-18: LGTM!Also applies to: 50-120, 123-217, 243-274
387-417: LGTM!adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (1)
103-110: LGTM!
Signed-off-by: David Gardner <dagardner@nvidia.com>
|
/merge |
Overview
common/hermes.pymodule, any hermes specific methods moved into back into the adapercommon/hermes.pythat are of general use were moved tocommon/utils.pyWhere should the reviewer start?
adapters/hermes/pyproject.tomlRelated Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Closes FABRIC-66
I confirm this contribution is my own work, or I have the right to submit it under this project's license.
I searched existing issues and open pull requests, and this does not duplicate existing work.
Summary by CodeRabbit
nvidia.fabric.hermes), including updated profiles and artifact output paths (artifacts/hermes).