Skip to content
Aphelion

Product compatibility and troubleshooting

Product namespaces

New plugins target Aphelion Editor through aphelion_sdk.editor. Editor is the only current product. Its node, audio, UI and extension contracts live under that namespace; another product can have its own namespace without mixing its APIs into editor plugins. Packaging and installation tooling remain shared.

Convenience submodules include aphelion_sdk.editor.nodes, .video, .audio, .properties, .widgets and .extensions. Prefer the main product namespace when combining several features in one plugin.

plugin_product defaults to "editor"; plugin_api_version defaults to 1. The loader ignores other products and unsupported API versions. This API version is separate from the SDK distribution's version number. Publishing/installing a new SDK does not update the editor application: the new APIs require the editor implementation that supports them.

Migrating existing plugins

Existing usageRecommended usage
import aphelion_sdkfrom aphelion_sdk import editor as sdk and use sdk.*
aphelion_sdk.VideoEffectPluginaphelion_sdk.editor.VideoEffectPlugin
Audio/general logic in a custom video pluginAudioEffectPlugin, AudioNodePlugin or NodePlugin
Node-specific properties UIAttached InspectorWidget or existing node UI hook
Dummy node used only to own a dockEditorExtension
aphelion.plugins package entry pointsaphelion.editor.plugins for new packages

Root imports and old video/widget modules remain supported. Legacy entry points are still discovered, and duplicate class objects are deduplicated. The video base supports both process_frame effects and custom setup_input_outputs + evaluate implementations. Properties now initialize after custom socket setup.

Use the actual hook signatures: build_property_panel(host) and build_property_qt_widget(parent, host). Zero-argument implementations do not match the editor's calls. Attached widgets receive those arguments through build_view and build_qt_widget instead.

Do not rename saved plugin categories/names, sockets or property keys merely to adopt the new imports. Those identities are used by existing projects.

Discovery and reload

Decorated source plugins load from bundled/user folders. A user file with the same filename overrides the bundled module. Files beginning with _ are skipped. Installed packages can expose classes via entry points. Preferences > Plugins controls discovery sources and per-plugin enablement.

Plugins cannot replace an already registered built-in node type. Use a distinct category/name pair. Failed drop-in imports are logged and their partially registered classes are excluded from discovery.

Reload updates discovery, menus and docks. Existing graph nodes keep their old Python class; recreate them or reopen the project to use revised implementations. The SDK does not automatically migrate renamed types or arbitrary instance state.

Troubleshooting

SymptomCheck
ModuleNotFoundError: core when importing a node baseThe SDK needs the editor runtime. Use the editor environment and local setup.
Plugin absent from Add NodeCheck @register_plugin, folder, filename, preferences and import errors in the editor log. EditorExtension has no graph node by design.
Installed plugin not discoveredInstall into the editor's Python environment; enable entry-point loading and check the entry-point group.
Old processing after ReloadRecreate the graph node or reopen the project.
Inline custom UI absentAttach an InspectorWidget in widgets = (...), select its node and return a view/QWidget from the correct hook.
Dialog cannot find a propertyCheck host.context().node_id. Docks and menu-opened dialogs are not bound to selection.
Custom property button opens nothingIts widget_id must match a DialogWidget attached to the same plugin.
Cancel does not revert an editHost setters commit immediately. Stage values in the dialog and write them in on_accept for commit-on-OK behavior.
Audio processor fails on outputReturn AudioData with float32 samples, unchanged shape and sample rate; use AudioNodePlugin for resampling.
Time-dependent output stays unchangedSet is_temporal = True when output varies by frame independently of inputs.
A graph edit creates several undo stepsEach host operation is separate; only set_node_properties groups its property batch.

Tutorials and examples