Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci_python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ jobs:
toolchain: stable
cache: false

# Remove nemo-relay once we are using 0.7 (and thus the Python package for nemo-relay-cli)
# The Python nemo-relay package does not install the Rust gateway CLI.
- name: Install test tools
uses: taiki-e/install-action@c070f87102a1c75b3183910f391c1cb887fe13c8 # v2.77.6
with:
tool: just@1.50.0,nemo-relay-cli@0.6.0
tool: just@1.50.0,nemo-relay-cli@0.7.2

- name: Set up uv
uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8
Expand Down
2 changes: 1 addition & 1 deletion ATTRIBUTIONS-Python.md
Original file line number Diff line number Diff line change
Expand Up @@ -5470,7 +5470,7 @@ Copyright 2016 Andrew Svetlov and aio-libs contributors
limitations under the License.
```

## nemo-relay (0.6.0)
## nemo-relay (0.7.2)

### Licenses
License: `Apache-2.0`
Expand Down
18 changes: 0 additions & 18 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,6 @@ cleanup validation.
validate both installed-wheel and standalone Rust CLI behavior before
removing this entry.

## NeMo Relay 0.6.x Request Decoding Release

- **Status:** Waiting for an upstream release
- **Added:** July 16, 2026
- **Affected documentation:** `adapters/codex/README.md` and
`docs/integrations/harness/codex.mdx`
- **Reason:** Released NeMo Relay versions do not yet decode the
`zstd`-compressed request bodies emitted by the Codex SDK, so semantic Relay
artifacts require a source installation.
- **Upstream resolution:**
[NVIDIA/NeMo-Relay#452](https://github.com/NVIDIA/NeMo-Relay/pull/452), merged
as `fe144d0d23e483c8216537118304e306abc20837`
- **Removal condition:** A published `nemo-relay-cli` version in NeMo Fabric's
supported `>=0.6.0,<0.7.0` range contains the merged request-decoding fix.
- **Cleanup:** Replace the pinned source-install instructions with the released
CLI installation, run the Codex Relay end-to-end test, update both affected
documentation files, and remove this entry.

# Planned Work

## Example Authoring Skill
Expand Down
4 changes: 2 additions & 2 deletions adapters/claude/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ by the SDK and is not persisted as a NeMo Fabric artifact.

## Relay Observability

Relay requires a separately installed NeMo Relay 0.6.x CLI on `PATH`; the Python
`nemo-relay` package does not provide the executable. Follow the
Relay requires a NeMo Relay CLI in the `>=0.7.2,<0.8` range on `PATH`. NeMo
Fabric's `relay` extra does not install the CLI. Follow the
[NeMo Relay installation instructions](https://docs.nvidia.com/nemo/fabric/getting-started/install#install-nemo-relay).

Enable Relay through the normalized NeMo Fabric configuration:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -575,12 +575,11 @@ def prepare_claude_relay(payload: dict[str, Any]) -> ClaudeRelaySettings | None:
) from error

try:
relay_contract = relay_gateway.relay_cli_contract(executable)
relay_gateway.relay_cli_contract(executable)
plugin_config = common_utils.load_relay_plugin_config(payload)
config_path, plugin_config_path = common_utils.write_relay_configs(
relay_config={"agents": {"claude": {"command": "claude"}}},
plugin_config=plugin_config,
observability_version=relay_contract.observability_version,
)
except (
OSError,
Expand Down
4 changes: 2 additions & 2 deletions adapters/codex/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ Codex state variables, the selected model's `api_key_env`, and explicit

## Relay Integration

Relay requires a separately installed NeMo Relay 0.6.x CLI on `PATH`; the Python
`nemo-relay` package does not provide the executable. Follow the
Relay requires a NeMo Relay CLI in the `>=0.7.2,<0.8` range on `PATH`. NeMo
Fabric's `relay` extra does not install the CLI. Follow the
[NeMo Relay installation instructions](https://docs.nvidia.com/nemo/fabric/getting-started/install#install-nemo-relay).

Enable Relay with `FabricConfig.enable_relay(...)`. The adapter starts the
Expand Down
3 changes: 1 addition & 2 deletions adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -761,7 +761,7 @@ def prepare_codex_relay(
) from error

try:
relay_contract = relay_gateway.relay_cli_contract(executable)
relay_gateway.relay_cli_contract(executable)
plugin_config = common_utils.load_relay_plugin_config(
{
"agent_name": agent_name,
Expand All @@ -774,7 +774,6 @@ def prepare_codex_relay(
# Codex execution remains SDK-owned; Relay runs only as a gateway.
relay_config={},
plugin_config=plugin_config,
observability_version=relay_contract.observability_version,
)
except (OSError, RuntimeError, ValueError, json.JSONDecodeError) as error:
raise AdapterRelayError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from __future__ import annotations

import os
import re
import shutil
import socket
Expand All @@ -20,8 +21,8 @@
RELAY_HEALTH_TIMEOUT_SECONDS = 10.0
RELAY_STOP_TIMEOUT_SECONDS = 5.0
RELAY_VERSION_TIMEOUT_SECONDS = 5.0
RELAY_MINIMUM_VERSION = (0, 6, 0)
RELAY_MAXIMUM_VERSION = (0, 7, 0)
RELAY_MINIMUM_VERSION = (0, 7, 2)
RELAY_MAXIMUM_VERSION = (0, 8, 0)


class RelayGatewayError(RuntimeError):
Expand All @@ -46,7 +47,6 @@ class RelayCliContract:
"""Versioned external Relay CLI contract consumed by Fabric adapters."""

version: tuple[int, int, int]
observability_version: int


def resolve_relay_command(base_dir: Path, value: str | Path) -> Path:
Expand Down Expand Up @@ -87,18 +87,25 @@ def relay_cli_contract(executable: Path) -> RelayCliContract:
raise RelayGatewayError(
"NeMo Relay CLI version could not be determined"
) from error
match = re.search(r"\b(\d+)\.(\d+)\.(\d+)", completed.stdout)
match = re.search(
r"\b(\d+)\.(\d+)\.(\d+)"
r"(-[0-9A-Za-z][0-9A-Za-z.-]*)?"
r"(?:\+[0-9A-Za-z][0-9A-Za-z.-]*)?(?=\s|$)",
completed.stdout,
)
if completed.returncode != 0 or match is None:
raise RelayGatewayError("NeMo Relay CLI version could not be determined")
major, minor, patch = (int(value) for value in match.groups())
major, minor, patch = (int(value) for value in match.groups()[:3])
version = (major, minor, patch)
if not RELAY_MINIMUM_VERSION <= version < RELAY_MAXIMUM_VERSION:
if match.group(4) is not None or not (
RELAY_MINIMUM_VERSION <= version < RELAY_MAXIMUM_VERSION
):
raise RelayGatewayError(
"unsupported NeMo Relay CLI version "
f"{'.'.join(str(value) for value in version)}; "
"NeMo Fabric requires >=0.6.0,<0.7.0"
"NeMo Fabric requires >=0.7.2,<0.8.0"
)
return RelayCliContract(version=version, observability_version=2)
return RelayCliContract(version=version)


def wait_for_relay_gateway(
Expand Down Expand Up @@ -169,10 +176,16 @@ def start_relay_gateway(
if launch.anthropic_base_url is not None:
command.extend(["--anthropic-base-url", launch.anthropic_base_url])
try:
env = os.environ.copy()
# The explicit, runtime-owned plugins.toml is the only non-system
# plugin source for this gateway. Keep ambient project config out of
# concurrent Fabric runtimes without mutating process-global state.
env["NEMO_RELAY_CONFIG_SCOPE"] = "user"
with launch.log_path.open("wb") as log_stream:
process = subprocess.Popen(
command,
cwd=cwd,
env=env,
stdout=log_stream,
stderr=subprocess.STDOUT,
start_new_session=True,
Expand Down
Loading
Loading