Developing VIPR Plugins¶
Start from the Example¶
The best way to create a plugin is to copy and adapt the example plugin in example-plugin/.
Minimal Plugin - Step by Step¶
This follows the structure of example-plugin/.
1. Project Configuration (pyproject.toml)¶
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "vipr-log-file" # PyPI package name
version = "0.1.0"
dependencies = ["vipr"]
[project.entry-points."vipr.plugins"]
log_file = "vipr_log_file:load" # entry_point_name = "package:function"
[tool.setuptools.packages.find]
where = ["."]
include = ["vipr_log_file*"]
2. Package Structure¶
vipr_log_file/ # Package name (matches entry point target)
└── __init__.py # Contains load(app) function
3. Implementation (init.py)¶
def load(app):
"""Plugin initialization - called by VIPR"""
app.log.info("Loading log_file plugin")
# Register hook
def write_logs_to_file(app):
# Your plugin logic here
pass
# Register with weight to control execution order
# Hooks are executed from lowest to highest weight value
app.hook.register('INFERENCE_COMPLETE_HOOK', write_logs_to_file, weight=250)
Note on weights: The weight parameter controls execution order for hooks. Hooks are executed from lowest to highest weight value, regardless of registration order. This allows plugins to ensure their hooks run at the right time in relation to other plugins.
Installation¶
cd example-plugin/
pip install -e . # Development mode
Plugin is automatically discovered via entry points.
Optional: Plugin Control¶
Create vipr-plugins.yaml in your working directory to disable a plugin:
plugin.log_file:
enabled: false
Note: log_file matches the entry point name in pyproject.toml, NOT the package name.
Complete Working Example¶
See example-plugin/ for the full implementation that:
Registers a hook
Writes logs to a file after inference
Shows proper project structure
Copy it and adapt for your needs.