Skip to content

chore: update NeMo Relay integrations to 0.10.0 - #384

Open
mnajafian-nv wants to merge 3 commits into
NVIDIA:mainfrom
mnajafian-nv:chore/update-nemo-relay-0.10
Open

mnajafian-nv wants to merge 3 commits into
NVIDIA:mainfrom
mnajafian-nv:chore/update-nemo-relay-0.10

Conversation

@mnajafian-nv

@mnajafian-nv mnajafian-nv commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Overview

Accept NeMo Relay 0.10 in Fabric and every Relay-enabled adapter, keep Relay 0.9 working, and move to observability configuration version 4. Relay 0.10 rejects the version 3 configuration Fabric writes today, so hosts that require Relay 0.10 cannot run Fabric's Relay paths. Relay 0.9 already accepts version 4, so one configuration works on both.

Breaking: observability version = 3 is now rejected, and the undocumented helper validate_relay_observability_v3 is renamed to validate_relay_observability (no alias). The Relay range widens to >=0.9,<0.11, and the locks move from 0.9.3 to 0.10.0; no other package changes.

Details

  • Widen the nemo-relay and nemo-relay-cli-bin bounds in the SDK and six adapters, and relock on 0.10.0.
  • Require observability version 4 in the Rust core, Python SDK, shared adapter validator, and Pi adapter.
  • Accept Relay 0.9.x and 0.10.x in the Claude, Codex, Hermes, NOOA, and Pi version checks; reject 0.11 and prereleases.
  • Add a relay-0-9 CI job that runs the Python suite against Relay 0.9.4.
  • Keep the NOOA compatibility shim (relay_compat.py), which NOOA 0.0.10 still needs on both Relay versions.
  • Document the version 4 migration. Relay 0.10 starts exporting OTLP traces when an OTEL_EXPORTER_OTLP_* endpoint variable is set, and those traces include prompt and response content; the docs call this out and show OTEL_SDK_DISABLED=true to turn it off.

Validation

  • Python suite: 1,934 passed, 94 skipped on Relay 0.10.0 and on 0.9.4. Rust 161 passed. TypeScript 208 of 209 passed, 1 skipped (macOS temp paths resolved for two Kilo tests).
  • Hermes adapter on Relay 0.9.4: 73 passed. Pi Relay smoke test passed with CLI 0.10.0 and 0.9.4.
  • Real model runs: Claude Code and Codex on Relay 0.10.0 each completed a turn with observability version 4 and wrote ATOF and ATIF artifacts; the Deep Agents (Relay 0.10.0) and Hermes (Relay 0.9.4) multi-turn Relay tests passed.
  • The full suites ran before the final review fix. After that fix (92872956), the Hermes adapter and the two affected example tests were rerun, and the real-model runs used that commit. After rebasing onto a17f3165 (head 0cb3d728, which changes only the generated adapter catalog), the catalog check, Pi TypeScript (76 passed), and Pi Python (23 passed) were rerun. Pre-commit and docs generation passed before the rebase.

Where should the reviewer start?

Start with RELAY_OBSERVABILITY_VERSION in crates/fabric-core/src/config.rs, then RELAY_MINIMUM_VERSION in adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py and the relay-0-9 job in .github/workflows/ci_python.yml. The key decision is supporting Relay 0.9 and 0.10 together until Fabric pins a Hermes Agent revision that accepts 0.10.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

NeMo Relay 0.10.0 rejects observability config version 3, so Relay-enabled
runs fail on hosts whose managed Relay policy requires 0.10. Relay 0.9.0
through 0.9.4 already accept version 4, and current Hermes Agent caps
nemo-relay below 0.10, so requiring 0.10 alone would leave Hermes users
without a compatible Relay.

Allow nemo-relay and nemo-relay-cli-bin >=0.9,<0.11 in the SDK
metapackage and the claude, codex, deepagents, hermes, mini-swe-agent, and
nooa adapters, and keep every lock on 0.10.0. Accept 0.9.x and 0.10.x in
the CLI gateway, Hermes, NOOA, and Pi version checks. Move the Rust core,
Python SDK models, shared adapter validation, and Pi validation to config
version 4 and reject earlier versions.

Rename validate_relay_observability_v3 and validateRelayObservabilityV3
to the version-free validate_relay_observability and
validateRelayObservability so the next config version does not rename them
again. Neither is documented API; the documented helpers keep their names.

Pin the SWE-bench example and the TypeScript Relay smoke test to the 0.10.0
CLI, and check that the SWE-bench pin falls inside the supported range.
Regenerate the SDK JSON Schemas, the Python API reference,
ATTRIBUTIONS-Python.md, and the adapter catalog.

Signed-off-by: mnajafian-nv <mnajafian@nvidia.com>
The packages now accept nemo-relay >=0.9,<0.11 while every lock resolves
0.10.0, so the regular Python jobs only exercise Relay 0.10. Add one Linux
lane that syncs the same extras, installs nemo-relay and nemo-relay-cli-bin
0.9.4 over the locked versions, and runs the Python suite, so a 0.10-only
change fails before release. Wheel builds wait for the lane like they wait
for the Hermes job.

The Hermes job needs no change: with 0.9 allowed, the pinned Hermes
revision and the adapter's relay extra resolve to Relay 0.9.x together.

Signed-off-by: mnajafian-nv <mnajafian@nvidia.com>
Update install guides, harness pages, adapter READMEs, and examples to the
>=0.9,<0.11 range, with Relay 0.10 recommended and the Pi extension taken
from the Relay release that matches the CLI. Replace the 0.6 migration
section with the version 4 migration, which applies to Relay 0.9 and 0.10.

Relay 0.10 exports OTLP automatically when an OTEL_EXPORTER_OTLP endpoint
variable is set, and those traces use the gen_ai projection, which carries
prompt and response content. State that, and that OTEL_SDK_DISABLED=true
turns every Relay OTLP exporter off, so users who set the variables for
another tool can opt out. State that the Hermes extras resolve to Relay 0.9
next to current upstream Hermes Agent.

Signed-off-by: mnajafian-nv <mnajafian@nvidia.com>
@coderabbitai

coderabbitai Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: NVIDIA/NeMo-Fabric/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Enterprise
  • Run ID: 1e15b39c-dd8c-4a5a-a9c6-189d9938040d



📥 Commits

Reviewing files that changed from the base of the PR and between a17f316 and 0cb3d72.




⛔ Files ignored due to path filters (8)
  • adapters/python/claude/uv.lock is excluded by !**/*.lock
  • adapters/python/codex/uv.lock is excluded by !**/*.lock
  • adapters/python/deepagents/uv.lock is excluded by !**/*.lock
  • adapters/python/hermes/uv.lock is excluded by !**/*.lock
  • adapters/python/mini-swe-agent/uv.lock is excluded by !**/*.lock
  • adapters/python/nooa/uv.lock is excluded by !**/*.lock
  • sdk/python/nemo-fabric/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock



📒 Files selected for processing (65)
  • .github/workflows/ci_python.yml
  • .github/workflows/ci_typescript.yml
  • ATTRIBUTIONS-Python.md
  • adapters/README.md
  • adapters/python/claude/README.md
  • adapters/python/claude/pyproject.toml
  • adapters/python/codex/README.md
  • adapters/python/codex/pyproject.toml
  • adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py
  • adapters/python/common/src/nemo_fabric_adapters/common/utils.py
  • adapters/python/deepagents/pyproject.toml
  • adapters/python/hermes/README.md
  • adapters/python/hermes/pypi.md
  • adapters/python/hermes/pyproject.toml
  • adapters/python/hermes/src/nemo_fabric_adapters/hermes/telemetry.py
  • adapters/python/mini-swe-agent/pyproject.toml
  • adapters/python/nooa/pyproject.toml
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/relay_compat.py
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/telemetry.py
  • adapters/python/remote-agent/README.md
  • adapters/typescript/pi/README.md
  • adapters/typescript/pi/pi.fabric-adapter.json
  • adapters/typescript/pi/src/pi-sdk.ts
  • adapters/typescript/pi/src/relay-config.ts
  • adapters/typescript/pi/src/relay-gateway.ts
  • adapters/typescript/pi/src/relay.ts
  • adapters/typescript/pi/test/pi-sdk.test.mjs
  • adapters/typescript/pi/test/relay-smoke.test.mjs
  • adapters/typescript/pi/test/relay.test.mjs
  • crates/fabric-core/src/config.rs
  • docs/getting-started/install.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/pi.mdx
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/sdk/python.mdx
  • examples/README.md
  • examples/code_review_agent/README.md
  • examples/code_review_agent/__main__.py
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/nooa_bench/verify_run.py
  • examples/harbor/swebench/README.md
  • examples/langgraph_custom_agent/adapter/telemetry.py
  • schemas/sdk/agent.schema.json
  • schemas/sdk/run-plan.schema.json
  • sdk/python/nemo-fabric-adapter-catalog/src/nemo_fabric_adapter_catalog/catalog.json
  • sdk/python/nemo-fabric-runtime/src/nemo_fabric/models.py
  • sdk/python/nemo-fabric/pyproject.toml
  • tests/adapters/test_adapaters_common_utils.py
  • tests/adapters/test_adapters_common_relay_gateway.py
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_deepagents.py
  • tests/adapters/test_hermes_adapter.py
  • tests/adapters/test_nooa_adapter.py
  • tests/adapters/test_pi_adapter.py
  • tests/e2e/test_claude.py
  • tests/examples/langgraph_custom_agent/test_telemetry.py
  • tests/examples/test_nooa_bench_harbor_example.py
  • tests/fixtures/pi-relay-core-plugin.json
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_code_review_example.py
  • tests/python/test_sdk_contract.py



Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 9 remain after this review.




📜 Recent review details
⏰ Context from checks skipped due to timeout. (28)
  • GitHub Check: Preview docs
  • GitHub Check: Cline E2E
  • GitHub Check: Test (Python 3.11, linux-amd64)
  • GitHub Check: Test (Python 3.12, linux-amd64)
  • GitHub Check: Test (Python 3.12, linux-arm64)
  • GitHub Check: Test (Python 3.11, linux-arm64)
  • GitHub Check: Test (Python 3.13, linux-arm64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
  • GitHub Check: OpenCode E2E
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Qwen Code E2E
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.14, linux-amd64)
  • GitHub Check: Relay 0.9 (Python 3.12, linux-amd64)
  • GitHub Check: Hermes adapter (upstream Relay 0.9, Python 3.14)
  • GitHub Check: Test (x86_64)
  • GitHub Check: Test adapters (Node 24)
  • GitHub Check: Test (Node 20.18.3)
  • GitHub Check: Pre-commit
  • GitHub Check: Test adapters (Node 22.19.0)
  • GitHub Check: Test (arm64)



🧰 Additional context used
📚 Code guidelines (10)
.agents/skills/maintain-packaging/SKILL.md — configured
.agents/skills/update-project-version/SKILL.md — configured
.agents/skills/maintain-ci/SKILL.md — configured
.agents/skills/contribute-adapter/SKILL.md — configured
.agents/skills/review-doc-style/SKILL.md — configured
.agents/skills/contribute-docs/SKILL.md — configured
.agents/skills/prepare-pr/SKILL.md — configured
adapters/README.md — auto-discovered
RELEASING.md — auto-discovered
examples/README.md — auto-discovered

📓 Path-based instructions (26)
Review Python SDK changes for typed API consistency, import-time dependency neutrality, async/session behavior, and parity with the native extension.

⚙️ CodeRabbit configuration file

Files:

  • sdk/python/nemo-fabric-runtime/src/nemo_fabric/models.py

Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.

⚙️ CodeRabbit configuration file

Files:

  • crates/fabric-core/src/config.rs

Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.

⚙️ CodeRabbit configuration file

Files:

  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/pi.mdx
  • docs/getting-started/install.mdx

Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter.

⚙️ CodeRabbit configuration file

Files:

  • adapters/python/codex/README.md
  • adapters/python/hermes/pypi.md
  • adapters/python/claude/README.md
  • adapters/python/remote-agent/README.md
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
  • docs/integrations/harness/codex.mdx
  • examples/README.md
  • adapters/README.md
  • examples/harbor/swebench/README.md
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/typescript/pi/README.md
  • adapters/python/hermes/README.md
  • ATTRIBUTIONS-Python.md
  • docs/integrations/harness/pi.mdx
  • examples/code_review_agent/README.md
  • docs/getting-started/install.mdx

Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public NeMo Fabric contracts.

⚙️ CodeRabbit configuration file

Files:

  • adapters/python/codex/README.md
  • adapters/python/hermes/pypi.md
  • adapters/python/claude/README.md
  • adapters/python/remote-agent/README.md
  • adapters/python/mini-swe-agent/pyproject.toml
  • examples/harbor/nooa_bench/verify_run.py
  • adapters/typescript/pi/src/pi-sdk.ts
  • adapters/typescript/pi/test/relay-smoke.test.mjs
  • examples/README.md
  • adapters/typescript/pi/src/relay-gateway.ts
  • adapters/python/nooa/pyproject.toml
  • adapters/README.md
  • adapters/typescript/pi/src/relay.ts
  • adapters/python/hermes/pyproject.toml
  • examples/harbor/swebench/README.md
  • adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py
  • adapters/python/deepagents/pyproject.toml
  • examples/harbor/README.md
  • examples/code_review_agent/config.py
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/telemetry.py
  • adapters/typescript/pi/README.md
  • adapters/typescript/pi/test/pi-sdk.test.mjs
  • adapters/python/hermes/README.md
  • examples/langgraph_custom_agent/adapter/telemetry.py
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/relay_compat.py
  • adapters/typescript/pi/pi.fabric-adapter.json
  • adapters/python/claude/pyproject.toml
  • adapters/typescript/pi/src/relay-config.ts
  • adapters/python/common/src/nemo_fabric_adapters/common/utils.py
  • examples/code_review_agent/README.md
  • adapters/python/hermes/src/nemo_fabric_adapters/hermes/telemetry.py
  • examples/code_review_agent/__main__.py
  • adapters/typescript/pi/test/relay.test.mjs
  • adapters/python/codex/pyproject.toml

Schemas are generated public contract snapshots.

⚙️ CodeRabbit configuration file

Files:

  • schemas/sdk/agent.schema.json
  • schemas/sdk/run-plan.schema.json

Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

⚙️ CodeRabbit configuration file

Files:

  • tests/python/test_code_review_example.py
  • tests/e2e/test_claude.py
  • tests/fixtures/pi-relay-core-plugin.json
  • tests/adapters/test_pi_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_adapters_common_relay_gateway.py
  • tests/examples/test_nooa_bench_harbor_example.py
  • tests/integrations/test_harbor_runner.py
  • tests/examples/langgraph_custom_agent/test_telemetry.py
  • tests/adapters/test_nooa_adapter.py
  • tests/adapters/test_hermes_adapter.py
  • tests/adapters/test_deepagents.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_sdk_contract.py
  • tests/adapters/test_adapaters_common_utils.py

Source excerpt: Metadata-only adapter catalog under `sdk/python/nemo-fabric-adapter-catalog`: regenerate its single resource bundle with `just adapter-catalog` and check freshness with `just check-adapter-catalog`.

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Files:

  • sdk/python/nemo-fabric-adapter-catalog/src/nemo_fabric_adapter_catalog/catalog.json

Source excerpt: The setuptools projects do not derive their versions from Cargo.

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Files:

  • adapters/python/mini-swe-agent/pyproject.toml
  • adapters/python/hermes/pyproject.toml
  • adapters/python/deepagents/pyproject.toml
  • sdk/python/nemo-fabric/pyproject.toml
  • adapters/python/claude/pyproject.toml
  • adapters/python/codex/pyproject.toml

Source excerpt: Use this skill when a change touches `.github/workflows/*.yml` or `.github/workflows/*.yaml`, or when reviewing CI behavior for security, reliability, or reproducibility.

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

Files:

  • .github/workflows/ci_typescript.yml
  • .github/workflows/ci_python.yml

Source excerpt: Follow these repository-specific requirements after applying the public skill: Place a Python adapter under `adapters/python//` with `LICENSE -> ../../../LICENSE`, `README.md`, `.fabric-adapter.json`, Python pack...

📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)

Files:

  • adapters/python/codex/README.md
  • adapters/python/hermes/pypi.md
  • adapters/python/claude/README.md
  • adapters/python/remote-agent/README.md
  • adapters/python/mini-swe-agent/pyproject.toml
  • adapters/typescript/pi/src/pi-sdk.ts
  • adapters/typescript/pi/test/relay-smoke.test.mjs
  • adapters/typescript/pi/src/relay-gateway.ts
  • adapters/python/nooa/pyproject.toml
  • adapters/typescript/pi/src/relay.ts
  • adapters/python/hermes/pyproject.toml
  • adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py
  • adapters/python/deepagents/pyproject.toml
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/telemetry.py
  • adapters/typescript/pi/README.md
  • adapters/typescript/pi/test/pi-sdk.test.mjs
  • adapters/python/hermes/README.md
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/relay_compat.py
  • adapters/typescript/pi/pi.fabric-adapter.json
  • adapters/python/claude/pyproject.toml
  • adapters/typescript/pi/src/relay-config.ts
  • adapters/python/common/src/nemo_fabric_adapters/common/utils.py
  • adapters/python/hermes/src/nemo_fabric_adapters/hermes/telemetry.py
  • adapters/typescript/pi/test/relay.test.mjs
  • adapters/python/codex/pyproject.toml

Source excerpt: Treat all files under `docs/reference/api/` as generated output.

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Files:

  • docs/reference/api/python-library-reference/nemo_fabric.models.md

Source excerpt: In MDX files, top-of-file comments must use JSX comment delimiters: `{/*` to open and `*/}` to close.

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Files:

  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/pi.mdx
  • docs/getting-started/install.mdx

Source excerpt: MDX top-of-file SPDX comments use HTML comment delimiters instead of `{/* ...

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Files:

  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/pi.mdx
  • docs/getting-started/install.mdx

Source excerpt: For links between files under `docs/`, use paths relative to the source file and include the target file's `.mdx` extension.

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Files:

  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/pi.mdx
  • docs/getting-started/install.mdx

Source excerpt: Follow these repository-specific requirements after applying the public skill: Update `examples/code_review_agent/` and `examples/harbor/calculator/` to support the new adapter.

📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)

Files:

  • examples/code_review_agent/config.py
  • examples/code_review_agent/README.md
  • examples/code_review_agent/__main__.py

Source excerpt: [ ] Relevant adapter or example `README.md` files updated when examples or adapters have changed.

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Files:

  • adapters/python/codex/README.md
  • adapters/python/claude/README.md
  • adapters/python/remote-agent/README.md
  • examples/README.md
  • adapters/README.md
  • examples/harbor/swebench/README.md
  • examples/harbor/README.md
  • adapters/typescript/pi/README.md
  • adapters/python/hermes/README.md
  • examples/code_review_agent/README.md

Source excerpt: Keep `nemo-fabric` as a metapackage that unconditionally installs the exact-version `nemo-fabric-runtime` distribution.

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Files:

  • sdk/python/nemo-fabric/pyproject.toml

Source excerpt: [ ] Any Rust change ran `just test-rust` Source excerpt: [ ] Any Rust change ran `cargo fmt --all -- --check` Source excerpt: [ ] `crates/fabric-core` changes ran both the Rust and Python suites

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Files:

  • crates/fabric-core/src/config.rs

Source excerpt: Follow these repository-specific requirements after applying the public skill: If the new adapter provides a coding harness, update `examples/harbor/swebench/` to support it.

📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)

Files:

  • examples/harbor/swebench/README.md

Source excerpt: [ ] Changed `ATTRIBUTIONS-*.md` files are regenerated and included

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Files:

  • ATTRIBUTIONS-Python.md

Source excerpt: Follow these repository-specific requirements after applying the public skill: Give each Python leaf adapter a small base installation, a `harness` extra for package-installable target packages, and a `full` extra for packag...

📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)

Files:

  • adapters/python/codex/README.md
  • adapters/python/hermes/pypi.md
  • adapters/python/claude/README.md
  • adapters/python/remote-agent/README.md
  • adapters/python/mini-swe-agent/pyproject.toml
  • adapters/python/nooa/pyproject.toml
  • adapters/python/hermes/pyproject.toml
  • adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py
  • adapters/python/deepagents/pyproject.toml
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/telemetry.py
  • adapters/python/hermes/README.md
  • adapters/python/nooa/src/nemo_fabric_adapters/nooa/relay_compat.py
  • adapters/python/claude/pyproject.toml
  • adapters/python/common/src/nemo_fabric_adapters/common/utils.py
  • adapters/python/hermes/src/nemo_fabric_adapters/hermes/telemetry.py
  • adapters/python/codex/pyproject.toml

Source excerpt: NeMo Fabric adapters translate the normalized NeMo Fabric contract into the native models, tools, sessions, and telemetry of an agent harness or custom agent.

📄 CodeRabbit inference engine (adapters/README.md)

Files:

  • adapters/python/codex/README.md
  • adapters/python/claude/README.md
  • adapters/python/remote-agent/README.md
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
  • docs/integrations/harness/codex.mdx
  • examples/README.md
  • adapters/README.md
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/integrations/harness/hermes.mdx
  • adapters/typescript/pi/README.md
  • adapters/python/hermes/README.md
  • docs/integrations/harness/pi.mdx
  • docs/getting-started/install.mdx

Source excerpt: Inspect explicit Python versions and internal pins: `rg -n '^version =|nemo-fabric-[a-z-]+(?:\[[^]]+\])?

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Files:

  • adapters/python/mini-swe-agent/pyproject.toml
  • adapters/python/nooa/pyproject.toml
  • adapters/python/hermes/pyproject.toml
  • adapters/python/deepagents/pyproject.toml
  • adapters/python/claude/pyproject.toml
  • adapters/python/codex/pyproject.toml

Source excerpt: Review docs and snippets that mention explicit versions, including:

📄 CodeRabbit inference engine (RELEASING.md)

Files:

  • docs/getting-started/install.mdx

Source excerpt: New to NeMo Fabric?

📄 CodeRabbit inference engine (examples/README.md)

Files:

  • examples/README.md

🪛 ast-grep (0.45.3)
tests/examples/langgraph_custom_agent/test_telemetry.py

[info] 186-221: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 1,
"components": [
{
"kind": "observability",
"enabled": True,
"config": {
"version": 4,
"atof": {
"enabled": True,
"sinks": [
{
"type": "file",
"output_directory": "relay",
"filename": "events.atof.jsonl",
"mode": "append",
}
],
},
"atif": {
"enabled": True,
"output_directory": "relay",
"filename_template": (
"trajectory-{session_id}.atif.json"
),
},
},
}
],
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


tests/adapters/test_nooa_adapter.py

[info] 1672-1709: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 1,
"components": [
{
"kind": "observability",
"enabled": True,
"config": {
"version": 4,
"atof": {
"enabled": True,
"sinks": [
{
"type": "file",
"output_directory": str(
tmp_path / "relay"
),
"filename": "events.atof.jsonl",
"mode": "overwrite",
}
],
},
"atif": {
"enabled": True,
"output_directory": str(tmp_path / "relay"),
"filename_template": (
"trajectory-{session_id}.atif.json"
),
},
},
}
],
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


tests/adapters/test_hermes_adapter.py

[info] 224-245: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 4,
"atof": {"enabled": True, "sinks": [{"type": "file"}]},
"atif": {"enabled": True},
"opentelemetry": {
"enabled": True,
"endpoints": [
{
"type": "full",
"endpoint": "https://otel.example/v1/traces",
"service_name": "fabric",
"instrumentation_scope": "nemo-relay-otel",
}
],
},
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 300-329: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 4,
"opentelemetry": {
"enabled": True,
"endpoints": [
{
"type": "full",
"endpoint": "https://otel.example/v1/traces",
"service_name": "fabric",
"instrumentation_scope": "nemo-relay-otel",
},
{
"type": "openinference",
"endpoint": (
"https://openinference.example/v1/traces"
),
"service_name": "fabric",
"instrumentation_scope": (
"nemo-relay-openinference"
),
},
],
},
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 622-640: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 4,
"atof": {
"enabled": True,
"sinks": [
{
"type": "file",
"output_directory": "relay/atof",
}
],
},
"atif": {"enabled": True, "output_directory": "relay/atif"},
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


tests/adapters/test_claude_adapter.py

[info] 527-537: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 4,
"atof": {"enabled": True},
"atif": {"enabled": True},
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


tests/adapters/test_adapaters_common_utils.py

[info] 659-681: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
{
"relay": {
"config": {
"version": 4,
"atof": {
"enabled": True,
"sinks": [
{
"type": "file",
"output_directory": "custom-relay",
},
{
"type": "stream",
"url": "https://example.test/events",
},
],
},
"atif": {"enabled": True},
}
}
}
)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


🪛 zizmor (1.30.1)
.github/workflows/ci_typescript.yml

[warning] 4-115: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)




.github/workflows/ci_python.yml

[warning] 4-428: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)


[error] 138-138: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting enable-cache enables caching for this action version

(cache-poisoning)


[error] 141-141: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)







🔇 Additional comments (46)
adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py (1)

25-25: LGTM!

Also applies to: 106-106


adapters/python/hermes/src/nemo_fabric_adapters/hermes/telemetry.py (1)

11-11: LGTM!

Also applies to: 53-55, 63-63, 66-68, 76-76, 80-80


adapters/python/nooa/src/nemo_fabric_adapters/nooa/telemetry.py (1)

29-29: LGTM!

Also applies to: 79-79


adapters/typescript/pi/src/relay-config.ts (1)

80-80: LGTM!

Also applies to: 93-93, 95-95, 116-116, 195-195, 380-380


adapters/typescript/pi/src/relay-gateway.ts (1)

125-125: LGTM!

Also applies to: 127-127


adapters/typescript/pi/src/relay.ts (1)

30-30: LGTM!

Also applies to: 32-32


adapters/typescript/pi/src/pi-sdk.ts (1)

1123-1123: LGTM!


adapters/typescript/pi/test/pi-sdk.test.mjs (1)

885-885: LGTM!


adapters/typescript/pi/test/relay.test.mjs (1)

18-18: LGTM!

Also applies to: 71-71, 88-89, 94-95, 97-97, 103-103, 253-253, 279-279, 301-301, 330-330, 362-362, 366-366, 371-371, 389-389, 392-392, 404-404, 565-565, 567-567, 595-595, 826-826, 892-892, 914-914, 918-918, 1018-1018, 1038-1038, 1041-1041, 1055-1055, 1084-1084


tests/adapters/test_adapters_common_relay_gateway.py (1)

53-56: LGTM!

Also applies to: 78-79, 92-92


tests/adapters/test_pi_adapter.py (1)

74-74: LGTM!


tests/e2e/test_claude.py (1)

56-56: LGTM!


adapters/typescript/pi/test/relay-smoke.test.mjs (1)

120-120: LGTM!


.github/workflows/ci_python.yml (1)

108-159: LGTM!

Also applies to: 359-360


.github/workflows/ci_typescript.yml (1)

104-105: LGTM!


adapters/python/claude/pyproject.toml (1)

36-36: LGTM!

Also applies to: 40-40


adapters/python/codex/pyproject.toml (1)

36-36: LGTM!

Also applies to: 40-40


adapters/python/deepagents/pyproject.toml (1)

44-44: LGTM!

Also applies to: 52-52


adapters/python/hermes/pyproject.toml (1)

35-35: LGTM!

Also applies to: 39-39


adapters/python/mini-swe-agent/pyproject.toml (1)

37-37: LGTM!

Also applies to: 41-41


adapters/python/nooa/pyproject.toml (1)

33-33: LGTM!

Also applies to: 41-41, 47-47


sdk/python/nemo-fabric/pyproject.toml (1)

105-105: LGTM!


tests/integrations/test_harbor_runner.py (1)

464-467: LGTM!

Also applies to: 470-470, 472-474


ATTRIBUTIONS-Python.md (1)

6105-6105: LGTM!

Also applies to: 6315-6315


adapters/python/common/src/nemo_fabric_adapters/common/utils.py (1)

447-447: LGTM!


crates/fabric-core/src/config.rs (2)

1782-1782: LGTM!


1805-1805: LGTM!

Also applies to: 4543-4561, 4584-4599


docs/reference/api/python-library-reference/nemo_fabric.models.md (1)

1783-1783: LGTM!


schemas/sdk/agent.schema.json (1)

1045-1046: LGTM!


schemas/sdk/run-plan.schema.json (1)

2406-2407: LGTM!


sdk/python/nemo-fabric-runtime/src/nemo_fabric/models.py (1)

730-748: LGTM!

Also applies to: 758-766, 812-820, 837-837


tests/adapters/test_adapaters_common_utils.py (1)

654-654: LGTM!

Also applies to: 663-663, 706-706, 792-792, 1071-1071, 1082-1082, 1109-1113, 1132-1132, 1156-1162, 1173-1173, 1217-1217, 1231-1231, 1287-1294, 1310-1315, 1329-1329, 1340-1350, 1367-1372, 1394-1394, 1405-1405, 1416-1427, 1462-1462, 1472-1491, 1508-1516, 1530-1534, 1550-1572, 1600-1600, 1677-1677, 1687-1687, 1752-1752


tests/python/test_sdk_contract.py (1)

939-939: LGTM!

Also applies to: 1009-1024, 1034-1034, 1043-1052, 1064-1065, 1086-1089, 1120-1120, 1177-1177, 1194-1194, 1226-1226, 1241-1248, 1257-1257


adapters/python/remote-agent/README.md (1)

221-221: LGTM!


examples/code_review_agent/config.py (1)

575-575: LGTM!


examples/langgraph_custom_agent/adapter/telemetry.py (1)

61-61: LGTM!


tests/adapters/test_claude_adapter.py (1)

531-531: LGTM!

Also applies to: 591-592, 664-664, 1109-1109


tests/adapters/test_codex_adapter.py (1)

285-285: LGTM!

Also applies to: 1625-1625, 1645-1645, 1666-1666, 1710-1710


tests/adapters/test_deepagents.py (1)

632-674: LGTM!

Also applies to: 1376-1376, 1489-1489, 1516-1516


tests/adapters/test_hermes_adapter.py (1)

122-134: LGTM!

Also applies to: 153-153, 212-212, 228-228, 266-266, 289-289, 304-304, 346-346, 626-626


tests/adapters/test_nooa_adapter.py (1)

1509-1509: LGTM!

Also applies to: 1590-1590, 1682-1682, 1764-1764


examples/harbor/nooa_bench/verify_run.py (1)

78-78: LGTM!

Also applies to: 139-139


tests/fixtures/pi-relay-core-plugin.json (1)

8-8: LGTM!


tests/python/test_code_review_example.py (1)

243-243: LGTM!

Also applies to: 253-253


tests/examples/langgraph_custom_agent/test_telemetry.py (1)

83-83: LGTM!

Also applies to: 100-100, 196-196, 251-251, 297-297


tests/examples/test_nooa_bench_harbor_example.py (1)

78-78: LGTM!

Also applies to: 138-138






Walkthrough

This change expands NeMo Relay compatibility to stable 0.10 releases and updates Relay observability configuration from version 3 to version 4. It updates runtime validation, adapter dependency ranges, schemas, tests, CI jobs, examples, and documentation.

Changes

Relay compatibility and observability configuration

Layer / File(s) Summary
Observability version 4 contract
crates/fabric-core/src/config.rs, sdk/python/nemo-fabric-runtime/src/nemo_fabric/models.py, adapters/python/common/src/nemo_fabric_adapters/common/utils.py, schemas/sdk/*, tests/*
Core configuration and runtime validation now require observability version 4. Schemas, defaults, error messages, and test fixtures reflect the new version.
Adapter observability v4 integration
adapters/python/*, adapters/typescript/pi/*, examples/*, tests/adapters/*
Adapter configuration fixtures and expectations use version 4. Adapter tests cover version-4 pass-through, generated configuration, and validation.
Relay 0.10 runtime compatibility
adapters/python/common/src/nemo_fabric_adapters/common/relay_gateway.py, adapters/python/hermes/src/nemo_fabric_adapters/hermes/telemetry.py, adapters/python/nooa/src/nemo_fabric_adapters/nooa/telemetry.py, adapters/typescript/pi/src/*, tests/adapters/*, adapters/typescript/pi/test/*
Runtime checks accept stable Relay 0.9.x and 0.10.x releases. They continue to reject prereleases and versions outside the supported ranges.
Relay package ranges and CI coverage
.github/workflows/ci_python.yml, .github/workflows/ci_typescript.yml, adapters/python/*/pyproject.toml, sdk/python/nemo-fabric/pyproject.toml, tests/integrations/test_harbor_runner.py, ATTRIBUTIONS-Python.md
Adapter dependency ranges extend to versions below 0.11. CI adds a Python test job pinned to Relay 0.9.4 and updates the TypeScript smoke-test setup to Relay CLI 0.10.0.
Documentation and example updates
docs/*, adapters/*/README.md, examples/*, tests/examples/*, tests/fixtures/*, sdk/python/nemo-fabric-adapter-catalog/src/nemo_fabric_adapter_catalog/catalog.json
Installation and migration guidance, adapter documentation, examples, and catalog descriptions cover Relay 0.10 and observability version 4.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Merge Risk: ⚪ Minimal · up to 0cb3d

No issue identified here needs to be fixed before merging; the version-3 wording is accurate migration guidance.

Pre-merge checks | Passed 4 | Failed 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 16.81% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 113 functions across 32 files. (33 skippe… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Title check Passed The title follows Conventional Commits format, uses the allowed lowercase type "chore," provides an imperative summary related to the Relay integration update, and is 47 characters without a trailing …
Description check Passed The description includes the required overview, reviewer starting point, related issue with the "Relates to" action keyword, contribution confirmations, and duplicate-check confirmation. It also provi…

Full details: Docstring Coverage

Explanation

Docstring coverage is 16.81% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 113 functions across 32 files. (33 skipped: 33 unsupported.)


  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR





  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@github-actions

Copy link
Copy Markdown

@mnajafian-nv
mnajafian-nv marked this pull request as ready for review October 10, 2026 17:32
@mnajafian-nv
mnajafian-nv requested review from a team as code owners October 10, 2026 17:32
@mnajafian-nv mnajafian-nv self-assigned this Oct 10, 2026

@AjayThorve AjayThorve left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed 0cb3d72. The Relay 0.9/0.10 bounds, observability version 4 validation, schemas, adapter configs, and migration docs are consistent. Keeping Relay 0.9 supported covers the current Hermes constraint. No blocking findings.

Validated locally: Python 1,929 passed / 103 skipped on Relay 0.10.0; Rust workspace 161 passed; Pi 76 unit tests plus the released Relay 0.10 CLI/extension smoke passed; 165 shared config/gateway tests passed on Relay 0.9.4; TypeScript contract checks passed. License diff contains only the two Relay version upgrades, both Apache-2.0. Current CI is green, including the Relay 0.9.4 and Hermes compatibility lanes. Explicit observability version 3 configs require the documented migration to version 4.

This branch was successfully deployed

1 active deployment
fern — 0cb3d728 Deployed Oct 10, 2026 by copy-pr-bot[bot] via Preview docs #1987
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants