with one click
add-middleware
// Add a new guardrail or intercept type to the NeMo Relay middleware pipeline
// Add a new guardrail or intercept type to the NeMo Relay middleware pipeline
Migrate applications, examples, integrations, documentation, package manifests, and repository code from NeMo Flow naming and packages to NeMo Relay across Python, Rust, Node.js, Go, WebAssembly, C FFI, CLI, config, and observability surfaces; use when a user asks to rename nemo_flow/nemo-flow/NeMo Flow APIs, automate a migration, update imports or dependencies, or validate a Flow-to-Relay conversion
Add or change a public NeMo Relay API surface across the core runtime and every affected binding
Add a new third-party framework integration maintained as a NeMo Relay patch set
Contribute a new NeMo Relay public API surface safely, with binding parity and docs in mind
Contribute documentation or example changes that stay aligned with NeMo Relay public behavior
Contribute a new or updated third-party framework integration for NeMo Relay
| name | add-middleware |
| description | Add a new guardrail or intercept type to the NeMo Relay middleware pipeline |
| author | NVIDIA Corporation and Affiliates |
| license | Apache-2.0 |
Use karpathy-guidelines alongside this skill for implementation or review
work. Keep changes scoped, surface assumptions, and define focused validation
before editing.
NeMo Relay supports guardrails (validate/gate) and intercepts (transform) at various pipeline stages. Adding a new middleware type requires changes across all layers.
Use this skill when introducing a new middleware registration surface or adding middleware behavior to a new pipeline stage.
Decide these before editing code:
event.input and event.output after this
middleware runs?See docs/about/concepts/middleware.md for the full diagrams.
crates/core/src/api/runtime/callbacks.rs.pub type MyNewFn = Box<dyn Fn(&str, Json) -> Json + Send + Sync>;
NemoRelayContextState in
crates/core/src/api/runtime/state.rs.Add a SortedRegistry<GuardrailEntry<MyNewFn>> or SortedRegistry<Intercept<MyNewFn>>
field to the state struct.
crates/core/src/api/.Use the existing global_*_registry_api! and scope_*_registry_api! macro
patterns in crates/core/src/api/registry.rs. Both global and scope-local
variants are needed unless the design explicitly rules one out.
NemoRelayContextState in
crates/core/src/api/runtime/state.rs.Follow the pattern of tool_sanitize_request_chain or tool_request_intercepts_chain.
Update crates/core/src/api/tool.rs or crates/core/src/api/llm.rs to call
the new chain method at the appropriate pipeline stage.
Follow the add-binding-feature skill for the cross-binding implementation checklist.
crates/core/src/api/tool.rs, crates/core/src/api/llm.rscrates/core/src/api/runtime/callbacks.rscrates/core/src/api/runtime/state.rscrates/core/src/context/registries.rscrates/core/src/registry.rsdocs/about/concepts/middleware.mddocs/about/architecture.mddocs/instrument-applications/advanced-guide.mdvalidate-change