Files
igny8/backend/igny8_core/ai/registry.py
alorig f7115190dc Add Linker and Optimizer modules with API integration and frontend components
- Added Linker and Optimizer apps to `INSTALLED_APPS` in `settings.py`.
- Configured API endpoints for Linker and Optimizer in `urls.py`.
- Implemented `OptimizeContentFunction` for content optimization in the AI module.
- Created prompts for content optimization and site structure generation.
- Updated `OptimizerService` to utilize the new AI function for content optimization.
- Developed frontend components including dashboards and content lists for Linker and Optimizer.
- Integrated new routes and sidebar navigation for Linker and Optimizer in the frontend.
- Enhanced content management with source and sync status filters in the Writer module.
- Comprehensive test coverage added for new features and components.
2025-11-18 00:41:00 +05:00

115 lines
4.1 KiB
Python

"""
Function registry for dynamic AI function discovery
Lazy loading - functions are only imported when actually needed
"""
import logging
from typing import Dict, Type, Optional
from igny8_core.ai.base import BaseAIFunction
logger = logging.getLogger(__name__)
_FUNCTION_REGISTRY: Dict[str, Type[BaseAIFunction]] = {}
_FUNCTION_LOADERS: Dict[str, callable] = {}
def register_function(name: str, function_class: Type[BaseAIFunction]):
"""Register an AI function"""
if not issubclass(function_class, BaseAIFunction):
raise ValueError(f"{function_class} must inherit from BaseAIFunction")
_FUNCTION_REGISTRY[name] = function_class
logger.info(f"Registered AI function: {name}")
def register_lazy_function(name: str, loader_func: callable):
"""Register a lazy loader for a function - will only import when needed"""
_FUNCTION_LOADERS[name] = loader_func
def get_function(name: str) -> Optional[Type[BaseAIFunction]]:
"""Get function class by name - lazy loads if not already registered"""
# Check if already loaded
if name in _FUNCTION_REGISTRY:
return _FUNCTION_REGISTRY[name]
# Try lazy loading
if name in _FUNCTION_LOADERS:
try:
loader = _FUNCTION_LOADERS[name]
fn_class = loader()
_FUNCTION_REGISTRY[name] = fn_class
logger.info(f"Lazy loaded AI function: {name}")
return fn_class
except Exception as e:
logger.error(f"Failed to lazy load function {name}: {e}", exc_info=True)
return None
return None
def list_functions() -> list:
"""List all registered functions"""
return list(_FUNCTION_REGISTRY.keys())
def get_function_instance(name: str) -> Optional[BaseAIFunction]:
"""Get function instance by name - lazy loads if needed"""
# Resolve alias first to support legacy function names
try:
from igny8_core.ai.settings import FUNCTION_ALIASES
except ImportError:
FUNCTION_ALIASES = {}
actual_name = FUNCTION_ALIASES.get(name, name)
fn_class = get_function(actual_name)
if fn_class:
return fn_class()
return None
# Register lazy loaders - functions are only imported when actually called
def _load_auto_cluster():
"""Lazy loader for auto_cluster function"""
from igny8_core.ai.functions.auto_cluster import AutoClusterFunction
return AutoClusterFunction
def _load_generate_ideas():
"""Lazy loader for generate_ideas function"""
from igny8_core.ai.functions.generate_ideas import GenerateIdeasFunction
return GenerateIdeasFunction
def _load_generate_content():
"""Lazy loader for generate_content function"""
from igny8_core.ai.functions.generate_content import GenerateContentFunction
return GenerateContentFunction
def _load_generate_images():
"""Lazy loader for generate_images function"""
from igny8_core.ai.functions.generate_images import GenerateImagesFunction
return GenerateImagesFunction
def _load_generate_image_prompts():
"""Lazy loader for generate_image_prompts function"""
from igny8_core.ai.functions.generate_image_prompts import GenerateImagePromptsFunction
return GenerateImagePromptsFunction
def _load_generate_site_structure():
"""Lazy loader for generate_site_structure function"""
from igny8_core.ai.functions.generate_site_structure import GenerateSiteStructureFunction
return GenerateSiteStructureFunction
def _load_optimize_content():
"""Lazy loader for optimize_content function"""
from igny8_core.ai.functions.optimize_content import OptimizeContentFunction
return OptimizeContentFunction
register_lazy_function('auto_cluster', _load_auto_cluster)
register_lazy_function('generate_ideas', _load_generate_ideas)
register_lazy_function('generate_content', _load_generate_content)
register_lazy_function('generate_images', _load_generate_images)
register_lazy_function('generate_image_prompts', _load_generate_image_prompts)
register_lazy_function('generate_site_structure', _load_generate_site_structure)
register_lazy_function('optimize_content', _load_optimize_content)