Use this guide when you want to package reusable NeMo Relay behavior as a plugin that can be activated from configuration.
You will define the plugin’s purpose, stable kind name, configuration boundary, runtime surfaces, and activation lifecycle. The result is a small plugin contract that can be validated and registered through the more focused follow-on guides.
NeMo Relay plugin configuration keys use snake_case in every language and file
format. Node.js helper function names are camelCase, but the objects passed to
plugin.initialize(...) use the same canonical snake_case keys as Python,
Rust, JSON, and TOML plugin configuration.
You need:
A plugin needs a stable shape before operators can activate it from config:
Keep runtime objects out of config. Provider clients, callbacks, file handles, caches, and credentials should be created inside plugin code or resolved from safe references during registration.
A plugin can install one or more of these runtime surfaces:
Start with one surface. Add a bundle only when one configuration document clearly controls related behavior, such as a subscriber plus the request intercepts needed to add correlation metadata.
The diagram below shows how plugin configuration turns into registered runtime behavior.
The lifecycle is staged: register the plugin kind, validate component config, initialize enabled components, and let PluginContext install runtime behavior. If registration fails partway through, the plugin system can roll back partial setup.
The easiest first plugin is one of these:
Avoid a first plugin that combines unrelated subscribers, request transforms, policy checks, and adaptive behavior. Multi-surface bundles are useful later, but they need stronger validation and rollout controls.
The top-level config document has version, components, and policy. Each component chooses a plugin kind and passes component-local JSON config to that plugin.
Use this document as the boundary between operator intent and plugin implementation. Keep business logic in the plugin code, not in the config parser.
Before you write the plugin implementation, answer these questions:
kind?Use these links to continue from this workflow into the next related task.