This release is a pre-release and may not be stable for production use.
NeMo Relay
nemo-relay is the NeMo Relay package for Python applications. It gives Python
code access to a portable agent runtime for execution scopes, middleware,
plugins, lifecycle events, adaptive behavior, and observability around tool and
LLM calls.
The package wraps the shared Rust runtime, so Python applications use the same runtime semantics as the Rust and Node.js surfaces.
Why Use It?
Use the Python binding for the following tasks:
- Own execution context in Python: Group agent, tool, and LLM work into one scope tree from Python application code.
- Package policy around callbacks: Use guardrails and intercepts to block work, sanitize observability payloads, rewrite requests, or wrap execution.
- Emit one lifecycle stream: Send runtime events to in-process subscribers, Agent Trajectory Interchange Format (ATIF), or typed OpenTelemetry workflows.
- Integrate without a framework migration: Wrap framework or provider callbacks while preserving the application’s orchestration model.
What You Get
The Python package provides the following capabilities:
- Scope, tool, and LLM helpers: Managed boundaries that emit lifecycle events and run middleware in a consistent order.
- Middleware APIs: Guardrails and intercepts for tool and LLM requests,
responses, and execution, plus mark and scope event sanitizers for
data,category_profile, andmetadata. - Subscribers and exporters:
OpenTelemetrySubscriberexports traces;OpenTelemetryLogSubscriberandOpenTelemetryMetricSubscriberexport severity-tagged marks and typed metric measurements. Bare OTLP/HTTP origins resolve to/v1/traces,/v1/logs, or/v1/metricsfor the selected signal. Each direct OTLP subscriber exposesruntime_diagnostics()for bounded exporter and event-processing failure summaries. Trace export failures useotel.traces_export_failed; after a trace export fails,force_flush()continues to return an error until a later trace batch exports successfully. Thenemo_relay.observabilityhelpers configure plugin-owned endpoint fan-out. - Plugin and typed helpers: Public modules for plugins, codecs, typed wrappers, adaptive runtime behavior, and observability plugin configuration.
- Shared Rust runtime semantics: Python behavior aligned with the Rust and Node.js surfaces.
Installation
Install the published package with uv:
uv add nemo-relay
If you are not using uv, install it with pip:
pip install nemo-relay
Optional Dependencies
LangChain Integration
LangChain integration is available with the langchain extra:
# With uv
uv add "nemo-relay[langchain]"
# With pip
pip install "nemo-relay[langchain]"
LangGraph Integration
LangGraph integration is available with the langgraph extra, this builds upon and includes the langchain extra as well.
# With uv
uv add "nemo-relay[langgraph]"
# With pip
pip install "nemo-relay[langgraph]"
Deep Agents Integration
Deep Agents integration is available
with the deepagents extra. This extra builds upon and includes the
langgraph and langchain extras.
# With uv
uv add "nemo-relay[deepagents]"
# With pip
pip install "nemo-relay[deepagents]"
LangChain NVIDIA Integration
The LangChain NVIDIA extra builds upon the langchain extra adding a compatible version of the langchain-nvidia-ai-endpoints package.
# With uv
uv add "nemo-relay[langchain-nvidia]"
# With pip
pip install "nemo-relay[langchain-nvidia]"
To install this along with the langgraph extra, use:
# With uv
uv add "nemo-relay[langgraph,langchain-nvidia]"
# With pip
pip install "nemo-relay[langgraph,langchain-nvidia]"
Getting Started
Register a subscriber, create a scope, and emit a mark event:
import nemo_relay
def on_event(event) -> None:
print(f"{event.kind} {event.name}")
nemo_relay.subscribers.register("printer", on_event)
with nemo_relay.scope.scope("demo-agent", nemo_relay.ScopeType.Agent) as handle:
nemo_relay.scope.event("initialized", handle=handle, data={"binding": "python"})
nemo_relay.subscribers.flush()
nemo_relay.subscribers.deregister("printer")
Use nemo_relay.scope.event(..., severity=nemo_relay.LogSeverity.Info) for a
mark intended for log export. Use nemo_relay.scope.metric() with
nemo_relay.MetricMeasurement objects for metrics; Relay validates the complete
measurement group before publishing it.
OTLP Logs and Metrics
For plugin-managed export, configure version 4 and enable logs and metrics.
Omitting their endpoint lists derives /v1/logs and /v1/metrics from the
trace endpoint:
from nemo_relay.observability import (
ComponentSpec,
ObservabilityConfig,
OpenTelemetryEndpointConfig,
OpenTelemetryLogSectionConfig,
OpenTelemetryMetricSectionConfig,
OpenTelemetrySectionConfig,
)
component = ComponentSpec(
ObservabilityConfig(
opentelemetry=OpenTelemetrySectionConfig(
enabled=True,
endpoints=[
OpenTelemetryEndpointConfig(
type="gen_ai", endpoint="http://localhost:4318/v1/traces"
)
],
logs=OpenTelemetryLogSectionConfig(enabled=True),
metrics=OpenTelemetryMetricSectionConfig(enabled=True),
)
)
)
Emit a typed log mark and an atomically validated metric group with the public scope helpers:
from nemo_relay import DataSchema, LogSeverity, MetricKind, MetricMeasurement, MetricValueType
from nemo_relay import scope
scope.event(
"cache-nearly-full",
data={"entries": 900},
data_schema=DataSchema("example.cache", "1"),
severity=LogSeverity.Warn,
)
scope.metric(
"cache-entries",
[MetricMeasurement("example.cache.entries", MetricKind.Gauge, MetricValueType.U64, 900)],
)
Direct log and metric subscribers are independently managed. Register each
before emitting marks, then deregister, force-flush, and shut it down during
graceful teardown. Their runtime_diagnostics() snapshots contain bounded
code, message, and count entries:
A successful direct log or trace force_flush() also updates this snapshot
with any queue drops observed so far; the diagnostic count remains cumulative
through later flushes and shutdown.
from nemo_relay import (
OpenTelemetryLogConfig,
OpenTelemetryLogSubscriber,
OpenTelemetryMetricConfig,
OpenTelemetryMetricSubscriber,
)
# Equivalent explicit OTLP/HTTP paths are /v1/logs and /v1/metrics, respectively.
logs = OpenTelemetryLogSubscriber(OpenTelemetryLogConfig("http://localhost:4318"))
metrics = OpenTelemetryMetricSubscriber(OpenTelemetryMetricConfig("http://localhost:4318"))
logs.register("otlp-logs")
metrics.register("otlp-metrics")
try:
for diagnostic in logs.runtime_diagnostics().entries:
print(diagnostic.code, diagnostic.message)
finally:
logs.deregister("otlp-logs")
logs.force_flush()
logs.shutdown()
metrics.deregister("otlp-metrics")
metrics.force_flush()
metrics.shutdown()
Native subscriber delivery is asynchronous, so call
nemo_relay.subscribers.flush() before you read subscriber output or exit.
From an asyncio task, use await nemo_relay.subscribers.flush_async() so
async event sanitizers can continue running on that event loop.
For host integrations that need a serialized event shape, consume the canonical JSON payload from the subscriber event object:
import json
import nemo_relay
def on_event(event) -> None:
payload = event.to_dict()
print(payload["kind"], payload["name"])
assert json.loads(event.to_json()) == payload
nemo_relay.subscribers.register("host-exporter", on_event)
try:
with nemo_relay.scope.scope("demo-agent", nemo_relay.ScopeType.Agent):
nemo_relay.scope.event("initialized", data={"binding": "python"})
finally:
nemo_relay.subscribers.flush()
nemo_relay.subscribers.deregister("host-exporter")
Package Surface
The public package modules are:
nemo_relay.scopenemo_relay.toolsnemo_relay.llmnemo_relay.guardrailsnemo_relay.interceptsnemo_relay.subscribersnemo_relay.pluginnemo_relay.adaptivenemo_relay.observabilitynemo_relay.typednemo_relay.codecs
Integrations
nemo_relay.integrations.langchainnemo_relay.integrations.langgraphnemo_relay.integrations.deepagents
The compiled extension is exposed as nemo_relay._native.
Documentation
NeMo Relay Documentation: https://docs.nvidia.com/nemo/relay
Metadata
Release files for nemo-relay 0.9.0rc3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nemo_relay-0.9.0rc3.tar.gz | 1.7 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| nemo_relay-0.9.0rc3-cp311-abi3-win_arm64.whl | CPython 3.11 | abi3 | Windows ARM64 | Details |
| nemo_relay-0.9.0rc3-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| nemo_relay-0.9.0rc3-cp311-abi3-musllinux_1_2_x86_64.whl | CPython 3.11 | abi3 | Linux musl 1.2+ x86-64 | Details |
| nemo_relay-0.9.0rc3-cp311-abi3-musllinux_1_2_aarch64.whl | CPython 3.11 | abi3 | Linux musl 1.2+ ARM64 | Details |
| nemo_relay-0.9.0rc3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| nemo_relay-0.9.0rc3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| nemo_relay-0.9.0rc3-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 73.5 MB
Release files / nemo_relay-0.9.0rc3.tar.gz
| Download URL | nemo_relay-0.9.0rc3.tar.gz |
|---|---|
| Size | 1.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
334cfef47eec810818230965401647a967776290414ad3dfb427b67891c9dc1a
|
|
BLAKE2b-256 checksum How to use checksums |
1c93460bfd3b2e0586e45ae94193a76998e7eb4ebd597273f62c4be7efd6b9d2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-win_arm64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-win_arm64.whl |
|---|---|
| Size | 9.4 MB |
| Tags | CPython 3.11 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
12f065b60a06a20a8ef25cc7baea273668daea2b44e93add537c1bc580c27c4d
|
|
BLAKE2b-256 checksum How to use checksums |
42e88ae07fe85ba9d0385c17ea3080d652807e0294c7b248a50c9cf65ad47a86
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-win_amd64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 9.8 MB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b66023fff7bcdc53a1944885b25331a6fb404b626741711236215a935df236a5
|
|
BLAKE2b-256 checksum How to use checksums |
b0c872710987e9c29802944195e5c566fca65c53fdf541f9a35560f17f59fb5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-musllinux_1_2_x86_64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 11.9 MB |
| Tags | CPython 3.11 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c4b69f41c9dbc50704c6afaa5cd4bd86f2b0ae0a9ecd9b664b1fb6c6a0063bb6
|
|
BLAKE2b-256 checksum How to use checksums |
7f1b3ba7310eb035d0171bba67282b24d9a5b1245b38d1a7bb9cfe5c414747af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-musllinux_1_2_aarch64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 11.4 MB |
| Tags | CPython 3.11 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
10c465176f29ebb1111f83fcfa6b27e50ac0e82c59559908dea371f69c017ccf
|
|
BLAKE2b-256 checksum How to use checksums |
f6e359ec358bd129c5e05bfdb3a676965224d477249ee88933b1e5e25ebd7e91
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 9.8 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
0a7f4cd99ccb056043102249919635b4bc2a397ce29c15acab9b8cbdf8111be6
|
|
BLAKE2b-256 checksum How to use checksums |
c3d7ee87ffb5dea040aa0787f39fd0d256af687803726305f5a55bd4b2856d94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 9.2 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
10d1e64193a46e39b7170ca8e067e7297a0685483753c00985f5e9f5b0495944
|
|
BLAKE2b-256 checksum How to use checksums |
9077d4ec7109074011f9c2b48a388c58f74e83168fd161a1f3ba49ca7ea32556
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / nemo_relay-0.9.0rc3-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | nemo_relay-0.9.0rc3-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 10.3 MB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6425ac2b0020986b411e1c2694ade87c0c540af32a2f8c24569a6095f3583d9a
|
|
BLAKE2b-256 checksum How to use checksums |
fcef0c1996cc898bcea4d2dd6f4bd3c700e5e608e2ff6384ad253fb7cfdab292
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency log