Skip to content

refactor(guardrails)!: remove built-in integration - #1172

Closed
afourniernv wants to merge 5 commits into
NVIDIA:mainfrom
afourniernv:refactor/remove-deprecated-nemo-guardrails
Closed

afourniernv wants to merge 5 commits into
NVIDIA:mainfrom
afourniernv:refactor/remove-deprecated-nemo-guardrails

Conversation

@afourniernv

@afourniernv afourniernv commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Warning

BREAKING CHANGE: NeMo Relay 0.10 no longer ships the built-in nemo_guardrails component, its local or remote backend, its public Rust configuration module, or the guardrails-remote Cargo feature. Legacy [[components]] entries must be removed before upgrading.

Overview

Removes the built-in NeMo Guardrails integration after its deprecation in #753. This is the independently reviewed removal tracked by RELAY-692; it does not bundle or claim release of the replacement dynamic worker.

  • 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.

Details

  • Deletes the built-in local and remote implementations, public Rust configuration types, registration path, editor support, feature wiring, and implementation-specific tests.
  • Rejects enabled and disabled legacy [[components]] kind = "nemo_guardrails" entries with a migration-specific diagnostic. Manifest-backed dynamic plugins remain unaffected, including a future plugin that uses a Guardrails-related ID.
  • Removes stale built-in references from the docs and onboarding skill, redirects deleted documentation routes, and records the breaking change in the 0.10 release notes.
  • Documents that legacy settings do not migrate automatically and that the removed remote full-generation backend has no direct worker equivalent.
  • Leaves Relay's generic guardrail middleware APIs and conditional guardrails unchanged.
  • Tracks the separately packaged replacement in feat: add NeMo Guardrails worker plugin NeMo-Relay-Plugins#6 without describing that draft plugin as released.

Validation completed successfully:

  • just test-rust (5,308 workspace tests plus native, gRPC worker, and language-binding plugin example suites)
  • just docs
  • just docs-linkcheck
  • uv run pre-commit run
  • cargo check -p nemo-relay --lib --all-features
  • Core, CLI, Python, and Node build checks

The Fern checks passed with the expected unauthenticated warning that server-side missing-redirect validation was skipped.

Where should the reviewer start?

Start with the removed-component diagnostic in crates/cli/src/server/mod.rs, its regression coverage in crates/cli/tests/coverage/shared/server_tests.rs, and the migration guidance in docs/reference/migration-guides.mdx.

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

Summary by CodeRabbit

  • Breaking Changes

    • The built-in NeMo Guardrails component and its local and remote backends are no longer available. Legacy nemo_guardrails entries, including disabled entries, are rejected with migration guidance.
    • The CLI no longer supports editing NeMo Guardrails configurations.
    • The guardrails-remote Cargo feature is no longer available.
  • Documentation

    • NeMo Guardrails documentation now directs readers to the NeMo Relay 0.10 migration guide, which explains how to remove legacy entries and configure separately packaged plugins.

Signed-off-by: Alex Fournier <afournier@nvidia.com>
@afourniernv
afourniernv requested review from a team as code owners September 30, 2026 21:51
@github-actions github-actions Bot added size:XXL PR is very large Improvement improvement to existing functionality breaking PR introduces a breaking change lang:python PR changes/introduces Python code lang:rust PR changes/introduces Rust code labels Sep 30, 2026
@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration
  • Configuration used: Repository: NVIDIA/NeMo-Relay/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Enterprise
  • Run ID: 536682bc-02b5-4f27-bd3b-af51a8edf0b5
📥 Commits

Reviewing files that changed from the base of the PR and between 590e99b and 85100c0.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: NVIDIA/NeMo-Relay/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Enterprise
  • Run ID: 187903a3-9446-49af-bd47-f893b4e9da5a
📥 Commits

Reviewing files that changed from the base of the PR and between 8051eb9 and 590e99b.

📒 Files selected for processing (14)
  • crates/cli/src/plugins/editor_model.rs
  • crates/cli/src/plugins/prompt.rs
  • crates/cli/tests/coverage/shared/plugins_tests.rs
  • crates/cli/tests/coverage/shared/server_tests.rs
  • crates/core/src/plugin.rs
  • crates/core/src/plugin/dynamic/host.rs
  • crates/core/src/plugins/mod.rs
  • crates/core/src/plugins/nemo_guardrails/python.rs
  • crates/core/src/plugins/nemo_guardrails/remote.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • docs/about-nemo-relay/release-notes/index.mdx
  • docs/getting-started/configuration.mdx
  • docs/reference/migration-guides.mdx
💤 Files with no reviewable changes (7)
  • crates/core/src/plugins/mod.rs
  • crates/cli/src/plugins/prompt.rs
  • crates/core/src/plugins/nemo_guardrails/python.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • docs/getting-started/configuration.mdx
  • crates/core/src/plugins/nemo_guardrails/remote.rs
  • crates/cli/src/plugins/editor_model.rs

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

📜 Recent review details
⏰ Context from checks skipped due to timeout. (45)
  • GitHub Check: Rust / Package (macos-arm64)
  • GitHub Check: Rust / Package (windows-arm64)
  • GitHub Check: Rust / Package (linux-musl-arm64)
  • GitHub Check: Python / Test (windows-amd64)
  • GitHub Check: Rust / Package (linux-musl-amd64)
  • GitHub Check: Node.js / Package (linux-musl-amd64)
  • GitHub Check: Rust / Package (windows-amd64)
  • GitHub Check: Python / Test (macos-arm64)
  • GitHub Check: Python / Test (linux-amd64)
  • GitHub Check: Node.js / Package (windows-amd64)
  • GitHub Check: Python / Package (linux-musl-arm64)
  • GitHub Check: Rust / Package (linux-amd64)
  • GitHub Check: Python / Test (windows-arm64)
  • GitHub Check: Python / Test (linux-arm64)
  • GitHub Check: Python / Package (windows-arm64)
  • GitHub Check: Python / Package (linux-arm64)
  • GitHub Check: Python / Package (linux-amd64)
  • GitHub Check: Python / Package (windows-amd64)
  • GitHub Check: Python / Package (macos-arm64)
  • GitHub Check: Rust / Package (linux-arm64)
  • GitHub Check: Python / Package (linux-musl-amd64)
  • GitHub Check: Node.js / Package (windows-arm64)
  • GitHub Check: Rust / Test (linux-arm64)
  • GitHub Check: Node.js / Package (linux-musl-arm64)
  • GitHub Check: Node.js / Test (windows-arm64)
  • GitHub Check: Node.js / Package (linux-arm64)
  • GitHub Check: Node.js / Package (macos-arm64)
  • GitHub Check: Rust / Test (macos-arm64)
  • GitHub Check: Node.js / Test (macos-arm64)
  • GitHub Check: Node.js / Test (linux-amd64)
  • GitHub Check: Node.js / Package (linux-amd64)
  • GitHub Check: Rust / Test (windows-amd64)
  • GitHub Check: Node.js / Test (linux-arm64)
  • GitHub Check: Go / Test (macos-arm64)
  • GitHub Check: Node.js / Test (windows-amd64)
  • GitHub Check: Check / Run
  • GitHub Check: Go / Test (windows-arm64)
  • GitHub Check: Go / Test (linux-amd64)
  • GitHub Check: Go / Test (linux-arm64)
  • GitHub Check: Node.js / Package OpenClaw plugin
  • GitHub Check: Rust / Test (linux-amd64)
  • GitHub Check: Go / Test (windows-amd64)
  • GitHub Check: License Diff / Run
  • GitHub Check: Rust / Test (windows-arm64)
  • GitHub Check: Preview docs
🧰 Additional context used
📚 Code guidelines (4)
.agents/skills/contribute-docs/SKILL.md — configured
.agents/skills/review-doc-style/SKILL.md — configured
.agents/skills/draft-release-notes/SKILL.md — configured
.agents/skills/prepare-code-freeze/SKILL.md — configured
📓 Path-based instructions (8)
Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.

⚙️ CodeRabbit configuration file

Files:

  • docs/about-nemo-relay/release-notes/index.mdx
  • docs/reference/migration-guides.mdx
Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.

⚙️ CodeRabbit configuration file

Files:

  • crates/cli/tests/coverage/shared/server_tests.rs
  • crates/cli/tests/coverage/shared/plugins_tests.rs
  • crates/core/tests/unit/plugin_tests.rs
Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.

⚙️ CodeRabbit configuration file

Files:

  • crates/core/src/plugin/dynamic/host.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/src/plugin.rs
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/about-nemo-relay/release-notes/index.mdx
  • docs/reference/migration-guides.mdx
Source excerpt: Verify MDX files use JSX delimiters for top-of-file SPDX comments.

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

Files:

  • docs/about-nemo-relay/release-notes/index.mdx
  • docs/reference/migration-guides.mdx
Source excerpt: Update `docs/about-nemo-relay/release-notes/index.mdx` unless the release changes its route or navigation entry.

📄 CodeRabbit inference engine (.agents/skills/draft-release-notes/SKILL.md)

Files:

  • docs/about-nemo-relay/release-notes/index.mdx
Source excerpt: Search documentation source for references to the old version and update current-version install commands, package examples, and configuration examples to `` where appropriate: Review matches before changing th...

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

Files:

  • docs/reference/migration-guides.mdx
Source excerpt: Preserve MDX front matter and the JSX SPDX comment.

📄 CodeRabbit inference engine (.agents/skills/draft-release-notes/SKILL.md)

Files:

  • docs/about-nemo-relay/release-notes/index.mdx
  • docs/reference/migration-guides.mdx
🔇 Additional comments (7)
crates/core/src/plugin.rs (1)

1355-1367: LGTM!

crates/core/src/plugin/dynamic/host.rs (1)

166-166: LGTM!

Also applies to: 242-242

crates/core/tests/unit/plugin_tests.rs (1)

1046-1112: LGTM!

crates/cli/tests/coverage/shared/server_tests.rs (1)

2679-2700: LGTM!

crates/cli/tests/coverage/shared/plugins_tests.rs (1)

2416-2416: LGTM!

docs/about-nemo-relay/release-notes/index.mdx (1)

174-189: LGTM!

docs/reference/migration-guides.mdx (1)

16-45: LGTM!


Walkthrough

The built-in NeMo Guardrails component, its local and remote backends, and its CLI editor support are removed. Static legacy entries receive migration diagnostics. Release notes, migration guidance, and documentation routes are updated.

Changes

NeMo Guardrails removal

Layer / File(s) Summary
Remove the core component and backends
crates/core/Cargo.toml, crates/core/src/plugins/..., crates/core/tests/unit/plugins/nemo_guardrails/*, crates/cli/Cargo.toml, crates/node/Cargo.toml, crates/python/Cargo.toml, crates/python/tests/coverage/*
The built-in component, local and remote backend implementations, and related tests are removed. The guardrails-remote feature is removed from the listed dependency features and core defaults.
Reject legacy entries and remove CLI editing
crates/core/src/plugin.rs, crates/core/src/plugin/dynamic/host.rs, crates/core/tests/unit/plugin_tests.rs, crates/cli/src/server/mod.rs, crates/cli/src/plugins/*, crates/cli/tests/coverage/shared/*
Core validation reports legacy nemo_guardrails entries among static components. The CLI provides a removal diagnostic, and its editor and prompt no longer handle this component. Tests cover enabled and disabled static entries and a dynamic entry without a manifest.
Update migration guidance and references
docs/about-nemo-relay/concepts/plugins.mdx, docs/about-nemo-relay/release-notes/index.mdx, docs/configure-plugins/*, docs/getting-started/configuration.mdx, docs/index.yml, docs/reference/migration-guides.mdx, docs/resources/glossary.mdx, fern/docs.yml
Documentation describes the removal and migration requirements. The former NeMo Guardrails routes redirect to the migration guides.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to 590e9

Legacy configurations receive migration guidance, and dynamic plugins remain on their intended activation path. No actionable merge blocker is established.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 72.50% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 40 functions across 6 files. (2 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title follows the required Conventional Commits format, marks the breaking change with !, uses a lowercase scope, and summarizes the removal.
Description check ✅ Passed The description includes the required Overview, Details, reviewer-start, and Related Issues sections. It also completes both confirmation checkboxes and provides the changes, migration impact, and val…
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 72.50% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 40 functions across 6 files. (2 skipped: 2 unsupported.)

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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

@github-actions

Copy link
Copy Markdown

License Diff

Compared against origin/main.

Lockfile license changes

Lockfile License Changes

Rust

Added

  • None

Removed

  • None

Updated/Changed

  • None

Node

Added

  • None

Removed

  • None

Updated/Changed

  • None

Python

Added

  • None

Removed

  • None

Updated/Changed

  • None
Status output
[license-diff] selected languages: rust, node, python
[license-diff] generating current inventory
[license-diff] current: generating Rust inventory
[license-diff] current: Rust inventory complete (469 packages)
[license-diff] current: generating Node inventory
[license-diff] current: Node inventory complete (424 packages)
[license-diff] current: generating Python inventory
[license-diff] current: Python inventory complete (115 packages)
[license-diff] current inventory complete
[license-diff] checking out base ref origin/main into a temporary worktree
[license-diff] base: generating Rust inventory
[license-diff] base: Rust inventory complete (469 packages)
[license-diff] base: generating Node inventory
[license-diff] base: Node inventory complete (424 packages)
[license-diff] base: generating Python inventory
[license-diff] base: Python inventory complete (115 packages)
[license-diff] base inventory complete
[license-diff] removing temporary base worktree
[license-diff] comparing inventories
[license-diff] rendering Markdown output
[license-diff] done

@github-actions

Copy link
Copy Markdown

@afourniernv afourniernv added the DO NOT MERGE PR should not be merged; see PR for details label Sep 30, 2026
willkill07 added a commit that referenced this pull request Oct 1, 2026
#### Overview

Passes invocation-scoped codec context to every non-streaming and
streaming LLM execution interceptor across Relay core, language
bindings, native plugins, and gRPC workers.

Relay remains the codec owner. An interceptor can identify and use the
request codec selected for the invocation, safely decode and re-encode
the request, and—on non-streaming calls—decode the completed downstream
response. Streaming receives request codec access only because Relay
does not yet have a complete-response contract for provider chunks.

- [x] I confirm this contribution is my own work, or I have the right to
submit it under this project's license.
- [x] I searched existing issues and open pull requests, and this does
not duplicate existing work.

#### Details

- Adds one execution context argument across the existing
execution-interceptor surfaces; it does not add another middleware stage
or change ordering.
- Carries host-owned codec operations through in-process callbacks, the
native plugin ABI, language bindings, and gRPC workers.
- Preserves the current request-interceptor contract and keeps
complete-response decoding unavailable for streaming calls.

#### Why

Execution interceptors wrap the provider call but currently receive only
provider JSON. A consumer that needs structured request or response data
must maintain provider-specific adapters, guess the wire format, or
depend on Relay's full runtime package. Those approaches duplicate host
logic, can drift from Relay, and cannot cover host-owned runtime or
opaque codecs.

This change exposes the codec already selected by Relay through the
existing execution interceptor. It does not add another middleware stage
or change ordering. The NeMo Guardrails worker is the first consumer
([NVIDIA/NeMo-Relay-Plugins#6](NVIDIA/NeMo-Relay-Plugins#6)),
but the API is generic.

#### API contract

`LlmExecutionContext` is passed immediately before `next`:

| Surface | Callback shape |
|---|---|
| Rust core and Rust language binding | `(name, request, context, next)`
|
| Python language binding | `(name, request, context, next)` |
| Node.js language binding | `(request, context, next)` |
| Go language binding | `(request, context, next)` |
| Public C API | `(user_data, name, request, context, next, next_ctx)` |
| Native Rust plugin SDK | `(name, request, context, next)` for
typed/async wrappers; equivalent context in raw callbacks |
| Rust and Python worker SDKs | `(name, request, context, next)` |

The context is directional:

- `request_codec`: `LlmSanitizeRequestContext`, with identity plus
decode and encode operations whenever Relay resolved a codec;
- `response_codec`: optional `LlmSanitizeResponseContext`, with identity
plus decode for non-streaming execution;
- streaming `response_codec`: unavailable rather than offering
best-effort chunk decoding.

Execution intercepts reuse the existing `LlmSanitizeRequestContext` and
`LlmSanitizeResponseContext` types; no parallel generic aliases are
added. The native plugin SDK keeps distinct execution codec contexts
because its borrowed ABI capabilities have different ownership and
lifetime rules. The shared codec capability exposes identity and
operations; using it does not run sanitizer middleware.

Identity distinguishes absent, built-in, runtime, and opaque codecs. An
opaque codec still exposes operations when Relay has the resolved codec
object.

Request intercepts are unchanged; `annotated_request` remains their
normalized input.

#### Compatibility

This is an intentional source and binary break for consumers that
register execution-interceptor callbacks.

- Native execution callbacks move to internal ABI v7. ABI v6 remains the
frozen operational-logging layout.
- Native manifests continue to use `compat.native_api = "1"`.
- Worker manifests continue to use `compat.worker_protocol = "grpc-v1"`;
`LlmInvocation` gains an additive execution-context field.
- Native plugins must rebuild against the v7 layout and set a Relay
lower bound of `>=0.10.0` or another range that excludes 0.9.
- Workers that register LLM execution intercepts must regenerate or
upgrade their SDK, adopt the context argument, and use the same Relay
compatibility floor.
- Rust, Python, Node.js, Go, and C consumers using these callbacks must
update to the new argument order when they adopt this Relay release.

The host rejects native ABI v2-v6 layouts before callback registration.
This keeps early 0.10-alpha v6 artifacts, whose callback layout lacks
execution context, distinguishable from the current ABI instead of
invoking them through an incompatible function signature.

Keeping `native_api = "1"` and `grpc-v1` is deliberate: those labels
identify the authored plugin and protocol families, while the Relay
version range communicates the release-level callback break.

#### Notes for reviewers

- The changes under `crates/core/src/plugins/nemo_guardrails` only keep
the deprecated built-in integration compiling with the new callback
signature. They are not a redesign of that plugin and should disappear
when removal PR [#1172](#1172)
lands. Replacement source is tracked separately in
[NVIDIA/NeMo-Relay-Plugins#6](NVIDIA/NeMo-Relay-Plugins#6).
- Please review the native ABI path particularly closely:
`crates/core/src/plugin/dynamic/native.rs`, `crates/plugin/src/lib.rs`,
`crates/plugin/src/async_sdk.rs`, `crates/ffi/nemo_relay.h`, and the
native fixture/tests. The important questions are table layout and
versioning, rejection of stale binaries, handle ownership,
retain/release balance, cancellation, and capability expiry.

#### Lifetime and ownership

- Core and in-process binding contexts receive revocable codec facades.
Each interceptor gets an independent lease: a non-streaming lease
expires when its callback settles, while a streaming request lease moves
into the returned stream and expires on completion, error, close, drop,
or cancellation. Retaining a facade after expiry does not keep the
backing codec alive.
- Worker SDKs receive proxies, never capability IDs. The host authorizes
each operation against the activation and invocation that created it and
revokes capabilities when non-streaming execution settles or the
returned stream closes.
- Safe native async wrappers retain an owning completion or stream
lease. Calls after settlement fail instead of dereferencing a stale
codec handle.
- Streaming keeps the request capability alive through lazy polling and
close, but never exposes a response decoder.
- A worker stream error is terminal on both sides of the gRPC bridge.
Relay closes the forwarded stream and releases continuations, scope
state, active-invocation state, and codec capabilities even if the
consumer retains its stream object.

#### Non-goals

- No response encoding API.
- No generic response mutation contract beyond returning the execution
interceptor's existing JSON result.
- No buffering or output-guarded streaming.
- No change to request intercepts, conditional middleware, cache
ordering, or execution ordering.
- No claim that Relay's normalized response exposes every provider
candidate, tool payload, or reasoning field.

#### Validation

The branch covers:

- request decode/encode and non-streaming response decode;
- built-in, runtime, opaque, and absent codec identities;
- non-streaming and lazy streaming lifetime/expiry behavior;
- global and scope-local registration and callback argument order;
- Rust, Python, Node.js, Go, C/FFI, native plugin, Rust worker, and
Python worker surfaces;
- frozen ABI-v6 logging layout, current ABI-v7 layout, and v2-v6
rejection while keeping `native_api = "1"`;
- worker capability authorization, ownership, cancellation,
terminal-error cleanup, and expiry while keeping `grpc-v1`.

The repository CI matrix must run on the pushed head. This PR remains
draft until the design is approved and that matrix is green.

#### Where should the reviewer start?

1. `crates/core/src/api/runtime/llm_execution_context.rs` and
`crates/core/src/api/runtime/callbacks.rs` — callback and directional
context contract.
2. `crates/core/src/api/llm.rs` and the execution registry — context
construction and unchanged ordering.
3. **Native ABI focus:** `crates/core/src/plugin/dynamic/native.rs`,
`crates/plugin/src/lib.rs`, `crates/plugin/src/async_sdk.rs`,
`crates/ffi/nemo_relay.h`, and the native fixture/tests — table layout,
versioning, ownership, and stale-binary rejection.
4. `crates/worker-proto`, `crates/core/src/plugin/dynamic/worker.rs`,
`crates/worker`, and `python/plugin` — invocation-scoped worker
capabilities.
5. Language bindings and their global/scope-local tests.

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

- Relates to
[RELAY-681](https://linear.app/nvidia/issue/RELAY-681/ship-an-input-only-nemo-guardrails-dynamic-python-worker)
- Relates to #1172
- Consumer:
[NVIDIA/NeMo-Relay-Plugins#6](NVIDIA/NeMo-Relay-Plugins#6)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* LLM execution interceptors can access the selected request codec to
decode and encode requests. Non-streaming interceptors can also access
the codec for completed responses; streaming interceptors do not receive
response codec access.
* Codec access is limited to the callback or returned stream’s lifetime.
* **Compatibility**
* Plugins and workers using LLM execution interceptors must update
callback signatures and rebuild for Relay 0.10. Native plugins must use
ABI v7; affected compatibility ranges must start at 0.10.
* **Documentation**
  * Added codec-context guidance and Relay 0.10 migration instructions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Alex Fournier <afournier@nvidia.com>
Co-authored-by: Will Killian <wkillian@nvidia.com>

@lvojtku lvojtku left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Approved with 1 comment

Comment thread docs/reference/migration-guides.mdx Resolved
…or/remove-deprecated-nemo-guardrails

Signed-off-by: Alex Fournier <afournier@nvidia.com>

# Conflicts:
#	crates/core/src/plugin.rs
#	crates/core/src/plugins/mod.rs
#	crates/core/src/plugins/nemo_guardrails/python.rs
#	crates/core/src/plugins/nemo_guardrails/remote.rs
#	docs/about-nemo-relay/release-notes/index.mdx
#	docs/reference/migration-guides.mdx
…recated-nemo-guardrails

Signed-off-by: Alex Fournier <afournier@nvidia.com>

# Conflicts:
#	crates/cli/tests/coverage/shared/plugins_tests.rs
#	crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
#	docs/reference/migration-guides.mdx
Signed-off-by: Alex Fournier <afournier@nvidia.com>
Signed-off-by: Alex Fournier <afournier@nvidia.com>
@afourniernv

Copy link
Copy Markdown
Contributor Author

@willkill07 I don't think you want this folded in to 0.10 ... here when you are ready for it.

@willkill07

Copy link
Copy Markdown
Member

@afourniernv I'm going to close this so we can have a fresh pass once we are ready to remove.

@willkill07 willkill07 closed this Oct 22, 2026

This branch was previously deployed

1 inactive deployment
fern — 85100c0a Deployed Oct 6, 2026 by copy-pr-bot[bot] via Preview docs #5415
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking PR introduces a breaking change DO NOT MERGE PR should not be merged; see PR for details Improvement improvement to existing functionality lang:python PR changes/introduces Python code lang:rust PR changes/introduces Rust code size:XXL PR is very large

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants