Immutable
release. Only release title and notes can be modified.
We are proud to release NeMo Relay 0.5.0!
Key Features
- 🔌 Dynamic plugin platform: plugin discovery, trust/attestation policies, lifecycle controls, and schema-aware
plugins.tomlconfiguration. - 🧩 Plugin authoring SDKs: native Rust
rust_dynamicplugin SDK plusgrpc-v1worker support with Rust and Python SDKs. - 🛠️ CLI setup experience: verified installers, plugin configuration workflows, and expanded readiness diagnostics via
nemo-relay doctor. - 📊 Observability and runtime contracts: canonical LLM/tool intercept outcomes with ordered pending marks, plus stable normalized token and model-cost semantics.
- 🧬 Better LLM lineage: automatic Dynamo session and parent-session headers, with CLI turn-scoped trace correlation.
- 🌐 Binding and storage additions: Go PII-redaction helpers, ATIF storage helpers, model-pricing helpers, and broader adaptive-runtime binding parity.
Curated Breaking Changes
- Plugin configuration migration:
plugins.tomlis now the source of truth - *Intercept contract change: LLM request and tool execution intercepts must return canonical outcome types, including pending marks.
- Removed surfaces and integrations: the experimental WebAssembly package, Cursor CLI support/entry points, and patch-based integrations are removed.
- Model pricing rename: pricing-related public surfaces are renamed to model pricing.
Non-Exhaustive Fixes
- Runtime and packaging reliability: enabled required Tokio/runtime features in distributed builds; generated references correctly for published packages; resolved the PyO3 advisory and remediated vulnerable dependencies.
- Observability and export delivery: hardened ATOF HTTP export, created missing JSONL output directories automatically, preserved late marks in parent traces, and flushes gateway events during shutdown.
- CLI diagnostics and host integration: improved Codex plugin discovery, cross-platform hook paths, guided setup, and status reporting for daemon binding, exporters, and remote ATIF storage.
- Safety and correctness: guarded FFI request-intercept output pointers and restricted unsafe
BestEffortAnyCodecpickle decoding.
What's Changed
💥 Breaking Changes
- fix!: rename pricing surfaces to model pricing by @willkill07 in #335
- fix!: drop Cursor support by @willkill07 in #333
- chore!: remove patch-based integrations by @willkill07 in #332
- refactor!: remove WebAssembly binding by @willkill07 in #339
- feat(plugin)!: support pending marks from LLM intercepts by @bbednarski9 in #327
- feat(plugin)!: support pending marks from tool execution intercepts by @bbednarski9 in #350
- fix!: streamline plugin configuration by @willkill07 in #346
✨ New Features
- feat: add Go PII redaction helpers by @willkill07 in #275
- feat: add ATIF storage binding helpers by @willkill07 in #274
- feat: add pricing plugin helper bindings by @willkill07 in #273
- feat: add adaptive runtime binding parity by @willkill07 in #272
- feat: add dynamic plugin control-plane foundation by @afourniernv in #279
- feat: support dynamic plugin discovery via plugins.toml by @afourniernv in #290
- feat: add dynamic plugin lifecycle CLI commands by @afourniernv in #292
- feat: implement dynamic plugin host policy and attestation gates by @afourniernv in #302
- feat(types): add shared relay DTO crate by @willkill07 in #305
- feat(plugin): add native Rust plugin SDK by @willkill07 in #306
- feat(plugin): load rust_dynamic plugins in relay by @willkill07 in #307
- feat(worker): add grpc-v1 protocol and Rust worker SDK by @willkill07 in #308
- feat(worker): activate grpc-v1 worker plugins in relay by @willkill07 in #309
- feat(python): add nemo-relay-plugin worker SDK package by @willkill07 in #310
- feat: configure dynamic plugins through CLI by @willkill07 in #325
- feat: add built-in Dynamo session lineage by @willkill07 in #348
- feat: add verified CLI installers by @bbednarski9 in #354
- feat: add setup readiness diagnostics by @willkill07 in #357
⚡ Improvements
- perf: snapshot middleware callbacks before execution by @fallintoplace in #283
- refactor: hoist provider schema detection and normalization by @zhongxuanwang-nv in #291
- refactor: align exporter cost fallback with normalized responses by @mnajafian-nv in #300
- refactor: codec-owned provider-surface detection via a built-in registry by @zhongxuanwang-nv in #301
- refactor: prefer normalized exporter fallbacks by @mnajafian-nv in #304
- refactor: share agent and provider extraction strategies by @yczhang-nv in #318
- refactor: use reqwest rustls provider defaults by @willkill07 in #352
🐛 Bug Fixes
- fix: guard FFI request intercept output pointers by @fallintoplace in #284
- fix: enable tokio time for core package builds by @willkill07 in #285
- fix: harden ATOF HTTP endpoint export by @bbednarski9 in #295
- fix: keep late mark spans in parent traces by @bbednarski9 in #296
- fix(atof): create ATOF output directory before opening JSONL output file by @willkill07 in #297
- fix(cli): parse codex
plugin listtext output instead of --json by @zhongxuanwang-nv in #314 - fix(cli): use forward slashes in transparent hook executable path by @nanzhijin in #320
- fix: make native dynamic plugin example satisfy trust policy by @bbednarski9 in #326
- fix: enable runtime features in distributed packages by @willkill07 in #331
- fix: implement worker invocation cancellation by @willkill07 in #336
- fix: manage Python dynamic plugin environments by @willkill07 in #337
- fix: flush gateway events on shutdown by @willkill07 in #347
- fix: restrict BestEffortAnyCodec pickle decoding by @willkill07 in #344
- fix: report daemon bind and exporter status by @willkill07 in #345
- fix: report ATIF remote storage destinations in CLI status banner by @zhongxuanwang-nv in #349
- fix(security): resolve PyO3 advisory; temporarily ignore object_store advisory by @willkill07 in #351
- fix(cli): guide setup into plugin configuration by @ericevans-nv in #358
- fix: generate references for published packages by @willkill07 in #378
✅ Tests
- test: improve Go and FFI coverage by @willkill07 in #298
- test: fix ResolvedConfig initializer in launcher startup test by @zhongxuanwang-nv in #299
- test: stabilize dynamic worker cleanup lock test by @willkill07 in #353
- test: backfill extraction and telemetry parity coverage by @yczhang-nv in #355
🧰 Maintenance
- chore: prepare 0.4 code freeze by @willkill07 in #250
- ci: make release publishing resumable by @willkill07 in #269
- ci: stop release 0.4 nightly tags by @willkill07 in #271
- chore: address current Sonar findings by @willkill07 in #276
- ci: publish pii redaction crate from GitLab by @willkill07 in #278
- ci: comment license diffs on PRs by @willkill07 in #286
- chore: bump node tar and python protobuf by @willkill07 in #316
- chore: update Fern CLI to 5.57.0 by @willkill07 in #328
- ci: use sticky comments for license and docs updates by @willkill07 in #329
- chore(skills): add dynamic plugin maintainer guidance by @willkill07 in #312
- chore: remediate vulnerable dependencies by @willkill07 in #342
- ci: publish Python plugin wheel by @willkill07 in #356
- chore: add NAT reviewers for docs by @willkill07 in #384
📝 Documentation Updates
- docs: include PII redaction Rust API reference by @willkill07 in #280
- docs: clarify README quick start paths by @exactlyallan in #289
- docs: clarify runtime contracts and integration boundaries by @mnajafian-nv in #294
- docs: strengthen example coverage across runtime and integrations by @mnajafian-nv in #303
- docs: document LLM request and tool execution outcomes by @bbednarski9 in #341
- docs: require issues before contribution PRs by @willkill07 in #343
- docs: clarify Codex
--configflag placement by @dagardner-nv in #338 - docs: document and stabilize token/cost field semantics by @zhongxuanwang-nv in #330
- docs: align package READMEs by @willkill07 in #377
- docs: reorganize plugin documentation by @willkill07 in #361
- docs: update 0.5 release notes by @willkill07 in #362
- docs: update stale plugin links by @willkill07 in #387
New Contributors
- @exactlyallan made their first contribution in #289
- @nanzhijin made their first contribution in #320
- @ericevans-nv made their first contribution in #358
Full Changelog: 0.4.0...0.5.0