Independent providers
The application chooses which providers to load. Its image consumer discovers the operations each one offers. The lab's backends agree on the requested image behavior, including convolution's kernel centering and boundary conditions, while using different algorithms and storage.
Adding a provider to the scene
The controller finds renderer nodes and gathers the operations they offer by UUID. It uses those offers to construct the available choices. Configuration selects a module, script or Resource to load. That decision stays at the application boundary rather than spreading into every image operation.
When a project adds a new CUDA effect, the project supplies its meaning and implementation, the renderer advertises it, and the controller can discover it without learning a new backend name. Another renderer may not offer that effect at all. The scene shows which renderers support it.
Offering an operation also leaves room for request-specific limits. The script provider can accept a small convolution while refusing one that would consume too much synchronous work. The UI can help the user stay within those limits, but the provider enforces the policy. Otherwise any caller that bypassed the UI would accidentally bypass the agreement as well.
The Godot example combines two providers and measures the transfers needed to produce the result. Observation and reuse explains when the resulting image can be cached.