maintain-dynamic-plugins
ดูแล NeMo Relay dynamic plugin loaders, manifests, Rust native SDKs, gRPC worker protocol, Python worker SDK, เอกสาร, การทดสอบ และความครอบคลุมของเวิร์กโฟลว์การเผยแพร่
npx skills add https://github.com/nvidia/nemo-relay --skill maintain-dynamic-pluginsMaintain Dynamic Plugins
Companion Guidance
Use karpathy-guidelines, validate-change, maintain-packaging, and
contribute-docs alongside this skill when implementation, packaging, CI, or
documentation changes are involved.
Use this skill for plugin.kind = "rust_dynamic", plugin.kind = "worker",
nemo-relay-plugin, nemo-relay-worker, nemo-relay-worker-proto,
nemo-relay-types, and the Python nemo-relay-plugin package.
Rules
- Keep the stable boundary explicit: native plugins cross a C ABI; worker
plugins cross
grpc-v1. - Do not pass Rust runtime types, trait objects, futures, or allocator-owned strings across the native dynamic-library boundary.
- Typed native middleware futures run on the SDK-owned Tokio executor. Keep subscribers synchronous and preserve raw synchronous ABI registrations.
- Define closed worker transport structures in protobuf when generated clients
must enforce their fields. Keep open application payloads lossless by using
JsonValueorJsonEnveloperather thangoogle.protobuf.Value. - Keep
relay-plugin.tomldynamic records separate from generic runtime components. Enabled dynamic records may synthesize internal component specs; disabled records stay inspectable but unloaded. - Relay 0.8 establishes the native API 1 and
grpc-v1canonicalToolExecutionResultbaseline. Require every dynamic plugin to rebuild and declare acompat.relayrange that excludes versions before 0.8. Recommend>=0.8.0,<1.0; open-ended or narrower 0.8-or-newer ranges are valid. - Treat
compat.relayas the plugin author's compatibility assertion, not proof that an artifact was rebuilt. Do not add a legacy raw-result adapter. - Relay 0.8 retains the
grpc-v1identifier andnemo.relay.worker.v1package while changing the tool-result protobuf types; every worker must regenerate its bindings and rebuild. Native ABI v4 remains unchanged. After this baseline reset, future incompatible native JSON or worker protobuf changes must bumpnative_apiorworker_protocol. - Do not add tests under
src; Rust tests belong in cratetests/trees and Python SDK tests belong underpython/tests. - Native and worker plugins are trusted extensions. Document that native plugins are in-process and unsandboxed; worker plugins provide process isolation but not a security sandbox.
Checklist
- Manifest validation covers kind, compatibility, load contract, integrity, capability mismatch, and disabled-plugin behavior.
- Native loader keeps libraries alive until registered callbacks are cleared and deregisters plugin kinds before unload.
- Worker activation covers process launch, token auth, handshake, validation, declarative registration, proxy rollback, cancellation, and shutdown.
- Rust and Python SDKs expose every supported registration surface.
- Runtime helpers cover marks, scopes, continuations, and isolated scope stacks.
-
plugins list,plugins inspect, andplugins validatereport lifecycle and compatibility status without leaking secret config. - Top-level
doctorreports resolved dynamic plugin and host configuration status. - When detailed dynamic plugin guides exist, they keep Rust native, Python
worker, and
grpc-v1protocol details on separate pages. -
justfile, Codecov, and CI package/test workflows include new plugin crates and packages.
Validation
just build-test-plugin-fixtures
cargo test -p nemo-relay-types
cargo test -p nemo-relay-plugin
cargo test -p nemo-relay-worker-proto
cargo test -p nemo-relay-worker
cargo test -p nemo-relay --features worker-grpc --test native_plugin_integration --test worker_plugin_integration
just test-python-plugin
just test-rust
just test-python
just docs
The canonical just test-rust, just test-python, and just test-go recipes
prepare plugin fixtures automatically. Run just build-test-plugin-fixtures
before raw focused native or worker plugin tests; fixture compilation must not
happen inside an individual test case.
For broad runtime or public API changes, run the full validate-change matrix.
References
crates/core/src/plugin/dynamic/crates/plugincrates/workercrates/worker-protocrates/typespython/pluginexamples/rust-native-plugindocs/build-pluginsexamples/python-grpc-worker-plugin