Plugin API Reference
This document provides detailed API reference for Sifaka's plugin system.
Table of Contents
Core Interfaces
PluginInterface
Base interface for all Sifaka plugins.
from sifaka.core.plugin_interfaces import PluginInterface
class PluginInterface(ABC):
def __init__(self) -> None
@property
@abstractmethod
def metadata(self) -> PluginMetadata
@property
def status(self) -> PluginStatus
@property
def config(self) -> Dict[str, Any]
@property
def error(self) -> Optional[Exception]
def initialize(self, config: Optional[Dict[str, Any]] = None) -> None
def activate(self) -> None
def deactivate(self) -> None
def cleanup(self) -> None
def validate_config(self, config: Dict[str, Any]) -> bool
def get_health_status(self) -> Dict[str, Any]
# Protected methods for subclasses
def _on_initialize(self) -> None
def _on_activate(self) -> None
def _on_deactivate(self) -> None
def _on_cleanup(self) -> None
def _validate_config(self, config: Dict[str, Any]) -> bool
Properties
metadata: Plugin metadata (name, version, author, etc.)status: Current plugin status (loaded, initialized, active, etc.)config: Current plugin configurationerror: Last error encountered (if any)
Methods
initialize(config): Initialize plugin with configurationactivate(): Activate the plugin for usedeactivate(): Deactivate the plugincleanup(): Clean up plugin resourcesvalidate_config(config): Validate plugin configurationget_health_status(): Get plugin health information
CriticPlugin
Interface for critic plugins that analyze text and provide feedback.
from sifaka.core.plugin_interfaces import CriticPlugin
class CriticPlugin(PluginInterface, Critic):
def __init__(self) -> None
@property
def name(self) -> str
@abstractmethod
async def critique(self, text: str, result: SifakaResult) -> CritiqueResult
def set_model_config(self, model: str, temperature: float = 0.7, max_tokens: Optional[int] = None) -> None
@property
def model_config(self) -> Optional[Dict[str, Any]]
Methods
critique(text, result): Analyze text and return critiqueset_model_config(model, temperature, max_tokens): Configure LLM settingsmodel_config: Get current model configuration
ValidatorPlugin
Interface for validator plugins that check text quality.
from sifaka.core.plugin_interfaces import ValidatorPlugin
class ValidatorPlugin(PluginInterface, Validator):
def __init__(self) -> None
@property
def name(self) -> str
@abstractmethod
async def validate(self, text: str, result: SifakaResult) -> ValidationResult
def set_validation_config(self, **kwargs: Any) -> None
@property
def validation_config(self) -> Dict[str, Any]
Methods
validate(text, result): Validate text and return resultset_validation_config(**kwargs): Configure validation settingsvalidation_config: Get current validation configuration
Plugin Metadata
PluginMetadata
Metadata describing a plugin.
from sifaka.core.plugin_interfaces import PluginMetadata
class PluginMetadata(BaseModel):
name: str
version: str
author: str
description: str
plugin_type: PluginType
dependencies: List[str] = []
sifaka_version: str = ">=0.1.0"
python_version: str = ">=3.10"
homepage: Optional[str] = None
documentation: Optional[str] = None
license: Optional[str] = None
keywords: List[str] = []
config_schema: Optional[Dict[str, Any]] = None
default_config: Optional[Dict[str, Any]] = None
Fields
name: Unique plugin nameversion: Plugin version (semantic versioning)author: Plugin author namedescription: Plugin descriptionplugin_type: Type of plugin (critic, validator, etc.)dependencies: List of required plugin namessifaka_version: Compatible Sifaka version rangepython_version: Required Python versionhomepage: Plugin homepage URLdocumentation: Plugin documentation URLlicense: Plugin licensekeywords: Plugin keywords for discoveryconfig_schema: JSON schema for plugin configurationdefault_config: Default configuration values
PluginType
Enumeration of plugin types.
from sifaka.core.plugin_interfaces import PluginType
class PluginType(str, Enum):
CRITIC = "critic"
VALIDATOR = "validator"
STORAGE = "storage"
MIDDLEWARE = "middleware"
TOOL = "tool"
PluginStatus
Enumeration of plugin lifecycle states.
from sifaka.core.plugin_interfaces import PluginStatus
class PluginStatus(str, Enum):
UNKNOWN = "unknown"
LOADING = "loading"
LOADED = "loaded"
INITIALIZED = "initialized"
ACTIVE = "active"
ERROR = "error"
DISABLED = "disabled"
Plugin Lifecycle
Lifecycle States
UNKNOWN: Initial stateLOADING: Plugin is being loadedLOADED: Plugin class instantiatedINITIALIZED: Plugin initialized with configurationACTIVE: Plugin is active and ready for useERROR: Plugin encountered an errorDISABLED: Plugin has been disabled/cleaned up
Lifecycle Methods
initialize(config: Optional[Dict[str, Any]] = None)
Initialize plugin with configuration.
Parameters:
- config: Optional configuration dictionary
Raises:
- PluginInitializationError: If initialization fails
Example:
activate()
Activate the plugin for use.
Raises:
- PluginActivationError: If activation fails
deactivate()
Deactivate the plugin.
Raises:
- PluginDeactivationError: If deactivation fails
cleanup()
Clean up plugin resources.
Raises:
- PluginCleanupError: If cleanup fails
Data Models
CritiqueResult
Result of a critic's analysis.
from sifaka.core.models import CritiqueResult
class CritiqueResult(BaseModel):
critic: str
feedback: str
suggestions: List[str]
needs_improvement: bool
confidence: float
metadata: Dict[str, Any] = {}
timestamp: datetime = Field(default_factory=datetime.now)
Fields
critic: Name of the critic that produced this resultfeedback: Qualitative feedback about the textsuggestions: List of specific improvement suggestionsneeds_improvement: Whether the text needs improvementconfidence: Confidence score (0.0 to 1.0)metadata: Additional metadatatimestamp: When the critique was generated
ValidationResult
Result of a validator's check.
from sifaka.core.models import ValidationResult
class ValidationResult(BaseModel):
validator: str
passed: bool
score: Optional[float] = None
details: str = ""
metadata: Dict[str, Any] = {}
timestamp: datetime = Field(default_factory=datetime.now)
Fields
validator: Name of the validator that produced this resultpassed: Whether validation passedscore: Optional quality score (0.0 to 1.0)details: Human-readable explanationmetadata: Additional metadatatimestamp: When the validation was performed
SifakaResult
Complete result object passed to plugins.
from sifaka.core.models import SifakaResult
class SifakaResult(BaseModel):
id: str
original_text: str
final_text: str
iteration: int
processing_time: float
created_at: datetime
updated_at: datetime
generations: List[Generation]
critiques: List[CritiqueResult]
validations: List[ValidationResult]
metadata: Dict[str, Any] = {}
This object contains the complete history of text improvement, including all previous generations, critiques, and validations.
Exceptions
Plugin Exception Hierarchy
from sifaka.core.plugin_interfaces import (
PluginError,
PluginInitializationError,
PluginActivationError,
PluginDeactivationError,
PluginCleanupError,
PluginConfigurationError,
PluginDiscoveryError,
PluginRegistrationError,
PluginDependencyError,
PluginVersionError,
)
class PluginError(Exception):
"""Base exception for plugin errors."""
class PluginInitializationError(PluginError):
"""Raised when plugin initialization fails."""
class PluginActivationError(PluginError):
"""Raised when plugin activation fails."""
class PluginDeactivationError(PluginError):
"""Raised when plugin deactivation fails."""
class PluginCleanupError(PluginError):
"""Raised when plugin cleanup fails."""
class PluginConfigurationError(PluginError):
"""Raised when plugin configuration is invalid."""
class PluginDiscoveryError(PluginError):
"""Raised when plugin discovery fails."""
class PluginRegistrationError(PluginError):
"""Raised when plugin registration fails."""
class PluginDependencyError(PluginError):
"""Raised when plugin dependencies cannot be resolved."""
class PluginVersionError(PluginError):
"""Raised when plugin version is incompatible."""
Utilities
PluginRegistry
Registry for managing plugin instances.
from sifaka.core.plugin_interfaces import PluginRegistry
class PluginRegistry:
def __init__(self) -> None
def register(self, plugin: PluginInterface) -> None
def unregister(self, name: str) -> None
def get_plugin(self, name: str) -> Optional[PluginInterface]
def get_metadata(self, name: str) -> Optional[PluginMetadata]
def list_plugins(self, plugin_type: Optional[PluginType] = None) -> List[str]
def get_status(self, name: str) -> Optional[PluginStatus]
def get_all_status(self) -> Dict[str, Dict[str, Any]]
PluginLoader
Utility for discovering and loading plugins.
from sifaka.core.plugin_loader import PluginLoader
class PluginLoader:
def __init__(self) -> None
def load_from_directory(self, directory: Union[str, Path]) -> List[PluginInterface]
def load_from_entry_points(self, group: str) -> List[PluginInterface]
def load_all_plugins(self) -> List[PluginInterface]
def resolve_dependencies(self, plugins: List[PluginInterface]) -> List[PluginInterface]
def validate_plugin(self, plugin: PluginInterface) -> bool
def get_loaded_plugins(self) -> Dict[str, PluginInterface]
def get_failed_plugins(self) -> Dict[str, Exception]
Global Functions
from sifaka.core.plugin_interfaces import (
get_plugin_registry,
register_plugin,
get_plugin,
list_plugins,
)
def get_plugin_registry() -> PluginRegistry
def register_plugin(plugin: PluginInterface) -> None
def get_plugin(name: str) -> Optional[PluginInterface]
def list_plugins(plugin_type: Optional[PluginType] = None) -> List[str]
from sifaka.core.plugin_loader import (
get_plugin_loader,
load_plugins_from_directory,
load_plugins_from_entry_points,
load_all_plugins,
discover_and_load_plugins,
)
def get_plugin_loader() -> PluginLoader
def load_plugins_from_directory(directory: Union[str, Path]) -> List[PluginInterface]
def load_plugins_from_entry_points(group: str) -> List[PluginInterface]
def load_all_plugins() -> List[PluginInterface]
def discover_and_load_plugins() -> Dict[str, List[PluginInterface]]
Usage Examples
Basic Plugin Implementation
from sifaka.core.plugin_interfaces import CriticPlugin, PluginMetadata, PluginType
from sifaka.core.models import CritiqueResult, SifakaResult
class SimpleCritic(CriticPlugin):
@property
def metadata(self) -> PluginMetadata:
return PluginMetadata(
name="simple_critic",
version="1.0.0",
author="Your Name",
description="Simple example critic",
plugin_type=PluginType.CRITIC
)
async def critique(self, text: str, result: SifakaResult) -> CritiqueResult:
word_count = len(text.split())
needs_improvement = word_count < 50
return CritiqueResult(
critic=self.name,
feedback=f"Text has {word_count} words",
suggestions=["Add more content"] if needs_improvement else [],
needs_improvement=needs_improvement,
confidence=0.9
)
Plugin with Configuration
class ConfigurableCritic(CriticPlugin):
def __init__(self):
super().__init__()
self.min_words = 50
@property
def metadata(self) -> PluginMetadata:
return PluginMetadata(
name="configurable_critic",
version="1.0.0",
author="Your Name",
description="Configurable critic",
plugin_type=PluginType.CRITIC,
default_config={"min_words": 50}
)
def _validate_config(self, config: Dict[str, Any]) -> bool:
if "min_words" in config:
if not isinstance(config["min_words"], int) or config["min_words"] < 1:
raise ValueError("min_words must be a positive integer")
return True
def _on_initialize(self):
self.min_words = self.config.get("min_words", 50)
async def critique(self, text: str, result: SifakaResult) -> CritiqueResult:
word_count = len(text.split())
needs_improvement = word_count < self.min_words
return CritiqueResult(
critic=self.name,
feedback=f"Text has {word_count} words (minimum: {self.min_words})",
suggestions=["Add more content"] if needs_improvement else [],
needs_improvement=needs_improvement,
confidence=0.9
)
Plugin Discovery and Loading
from sifaka.core.plugin_loader import discover_and_load_plugins
from sifaka.core.plugin_interfaces import get_plugin_registry
# Discover all plugins
plugins_by_type = discover_and_load_plugins()
# Get registry
registry = get_plugin_registry()
# List all critics
critic_names = registry.list_plugins(PluginType.CRITIC)
print(f"Available critics: {critic_names}")
# Get specific plugin
plugin = registry.get_plugin("simple_critic")
if plugin:
print(f"Plugin status: {plugin.status}")
print(f"Plugin metadata: {plugin.metadata}")
This completes the comprehensive API reference for Sifaka's plugin system.