Plugin API
Plugin SDK - Client and server helpers for the AIPC plugin system.
DEPRECATED: the platform does not ship the /run/aipc/plugins discovery
mechanism. This module is kept importable for compatibility, emits a
DeprecationWarning on use, and will be removed in v0.8.0.
- For plugin providers:
server = PluginServer(“my-plugin”) server.start(my_grpc_servicer)
- For plugin consumers:
discovery = PluginDiscovery() endpoint = discovery.get(“rtsp-server”) channel = endpoint.connect()
- class neoruntime_ipc_sdk.plugin.PluginEndpoint(app_id, capability_id, version, transport, socket_path=None, grpc_service=None, event_publish=<factory>, event_subscribe=<factory>, state='unknown')[source]
Bases:
objectResolved endpoint for a discovered plugin capability.
- app_id: str
- capability_id: str
- version: str
- transport: str
- state: str = 'unknown'
- connect(**kwargs)[source]
Create a gRPC channel to this plugin.
- property is_available: bool
- __init__(app_id, capability_id, version, transport, socket_path=None, grpc_service=None, event_publish=<factory>, event_subscribe=<factory>, state='unknown')
- class neoruntime_ipc_sdk.plugin.PluginDiscovery(discovery_dir='/run/aipc/plugins')[source]
Bases:
objectClient-side plugin discovery using discovery.json + optional file watcher.
- __init__(discovery_dir='/run/aipc/plugins')[source]
- reload()[source]
Reload discovery data from file.
- get(capability_id)[source]
Find the first running plugin providing a capability.
- require(capability_id, timeout=30.0)[source]
Wait for a capability to become available. Raises TimeoutError.
- list_plugins()[source]
Return all known plugins.
- list_capabilities()[source]
Return all known capability IDs.
- watch(callback)[source]
Register a callback invoked when discovery.json changes.
- close()[source]
- class neoruntime_ipc_sdk.plugin.PluginServer(plugin_id, socket_dir='/run/aipc/plugins')[source]
Bases:
objectHelper for plugin containers to set up a gRPC server on the standard socket path.
- __init__(plugin_id, socket_dir='/run/aipc/plugins')[source]
- create_server(max_workers=4, **kwargs)[source]
Create a gRPC server bound to the plugin socket.
- start()[source]
Start the gRPC server.
- wait()[source]
Block until server terminates.
- stop(grace=5.0)[source]
Gracefully stop the server.
PluginDiscovery
PluginEndpoint
- class neoruntime_ipc_sdk.PluginEndpoint(app_id, capability_id, version, transport, socket_path=None, grpc_service=None, event_publish=<factory>, event_subscribe=<factory>, state='unknown')[source]
Resolved endpoint for a discovered plugin capability.
- __init__(app_id, capability_id, version, transport, socket_path=None, grpc_service=None, event_publish=<factory>, event_subscribe=<factory>, state='unknown')
PluginServer
Usage Examples
App side: discover and call a plugin
from neoruntime_ipc_sdk import PluginDiscovery
discovery = PluginDiscovery() # defaults to /run/aipc/plugins
# List available capabilities
for cap in discovery.list_capabilities():
print(f"{cap}")
# Get an endpoint providing a capability (optional)
endpoint = discovery.get("lpr.postprocess")
# Or block until the plugin appears (consumer starts before provider)
endpoint = discovery.require("lpr.postprocess", timeout=30.0)
# Connect to the plugin's gRPC service
channel = endpoint.connect()
discovery.close()
Watch for plugin changes
def on_change(event):
print(f"plugin event: {event}")
discovery.watch(on_change)
Plugin side: advertise a capability
import grpc
from neoruntime_ipc_sdk import PluginServer
server = PluginServer("lpr.postprocess") # writes a discovery file
# under /run/aipc/plugins
grpc_server = server.create_server(max_workers=4)
my_service.add_to_grpc_server(grpc_server) # register your servicer
grpc_server.start()
server.start() # announce the capability
grpc_server.wait_for_termination()
server.stop()
Hot reload
# Rescan the discovery directory after plugin updates
discovery.reload()