Update core module structure to match semantic_extract and split patterns

- Add registry.py for method registration system
- Add methods.py with reusable orchestration functions
- Enhance __init__.py with comprehensive exports and build() convenience function
- Update config_manager.py with enhanced documentation
- Follow same structure pattern as semantic_extract and split modules
This commit is contained in:
KaifAhmad1
2025-11-15 16:39:07 +05:30
parent 107c0cb311
commit 985eecd14b
4 changed files with 740 additions and 40 deletions
+130 -9
View File
@@ -1,9 +1,25 @@
"""
Core Orchestration Module
This module provides the main orchestration capabilities for the Semantica framework,
including the primary Semantica class, configuration management, lifecycle management,
and plugin system.
This module provides comprehensive orchestration capabilities for the Semantica framework,
enabling framework initialization, knowledge base construction, pipeline execution, configuration
management, lifecycle management, and plugin system integration.
Key Features:
- Framework initialization and lifecycle management
- Knowledge base construction from various data sources
- Pipeline execution and resource management
- Configuration loading, validation, and management
- Plugin discovery, loading, and lifecycle management
- System health monitoring and status tracking
- Method registry for extensible orchestration methods
Algorithms Used:
- Configuration Management: YAML/JSON parsing, environment variable resolution, validation
- Lifecycle Management: Priority-based hook execution, state machine transitions
- Plugin Management: Dynamic module loading, dependency resolution, version management
- Resource Management: Dynamic allocation, cleanup, graceful shutdown
- Health Monitoring: Component health checks, status aggregation, error tracking
Main Components:
- Semantica: Main framework class for orchestration and knowledge base building
@@ -11,36 +27,141 @@ Main Components:
- ConfigManager: Configuration loading, validation, and management
- LifecycleManager: System lifecycle management with hooks and health monitoring
- PluginRegistry: Dynamic plugin discovery, loading, and management
- MethodRegistry: Registry for custom orchestration methods
- Orchestration Methods: Reusable functions for common orchestration tasks
Example Usage:
>>> from semantica.core import Semantica, ConfigManager
>>> # Initialize framework
>>> from semantica.core import Semantica, build
>>> # Using main class
>>> framework = Semantica()
>>> # Load configuration
>>> config_manager = ConfigManager()
>>> config = config_manager.load_from_file("config.yaml")
>>> framework.initialize()
>>> result = framework.build_knowledge_base(sources=["doc1.pdf"])
>>>
>>> # Using convenience function
>>> from semantica.core import build
>>> result = build(sources=["doc1.pdf", "doc2.docx"], embeddings=True, graph=True)
>>>
>>> # Using methods directly
>>> from semantica.core.methods import build_knowledge_base
>>> result = build_knowledge_base(sources=["doc.pdf"], method="default")
Author: Semantica Contributors
License: MIT
"""
from typing import Any, Dict, List, Optional, Union
from pathlib import Path
from .orchestrator import Semantica
from .config_manager import Config, ConfigManager
from .lifecycle import LifecycleManager, SystemState, HealthStatus
from .plugin_registry import PluginRegistry, PluginInfo, LoadedPlugin
from .registry import MethodRegistry, method_registry
from .methods import (
build_knowledge_base,
run_pipeline,
initialize_framework,
get_status,
get_orchestration_method,
list_available_methods
)
__all__ = [
# Main orchestrator
"Semantica",
# Configuration
"Config",
"ConfigManager",
# Lifecycle
"LifecycleManager",
"SystemState",
"HealthStatus",
# Plugins
"PluginRegistry",
"PluginInfo",
"LoadedPlugin",
]
# Registry
"MethodRegistry",
"method_registry",
# Methods
"build_knowledge_base",
"run_pipeline",
"initialize_framework",
"get_status",
"get_orchestration_method",
"list_available_methods",
# Convenience
"build",
]
def build(
sources: Union[str, List[Union[str, Path]]],
extract_entities: bool = True,
extract_relations: bool = True,
embeddings: bool = True,
graph: bool = True,
**options
) -> Dict[str, Any]:
"""
Build knowledge base from sources (module-level convenience function).
This is a user-friendly wrapper that performs comprehensive knowledge base
construction including entity extraction, relation extraction, embeddings,
and knowledge graph building.
Args:
sources: Input source or list of sources (files, URLs, streams)
extract_entities: Whether to extract named entities (default: True)
extract_relations: Whether to extract relationships (default: True)
embeddings: Whether to generate embeddings (default: True)
graph: Whether to build knowledge graph (default: True)
**options: Additional processing options
Returns:
Dictionary containing:
- knowledge_graph: Knowledge graph data
- embeddings: Embedding vectors
- results: Processing results
- statistics: Processing statistics
- metadata: Processing metadata
Examples:
>>> import semantica
>>> result = semantica.core.build(
... sources=["doc1.pdf", "doc2.docx"],
... extract_entities=True,
... extract_relations=True,
... embeddings=True,
... graph=True
... )
>>> print(f"Processed {result['statistics']['sources_processed']} sources")
"""
# Normalize sources to list
if isinstance(sources, str):
sources = [sources]
# Build pipeline configuration from options
pipeline_config = options.get("pipeline", {})
if extract_entities or extract_relations:
pipeline_config.setdefault("extract", {})
if extract_entities:
pipeline_config["extract"]["entities"] = True
if extract_relations:
pipeline_config["extract"]["relations"] = True
# Build knowledge base
return build_knowledge_base(
sources=sources,
method=options.get("method", "default"),
embeddings=embeddings,
graph=graph,
pipeline=pipeline_config,
**{k: v for k, v in options.items() if k not in ["pipeline", "method"]}
)
+66 -31
View File
@@ -3,6 +3,23 @@ Configuration Management Module
This module provides comprehensive configuration management for the Semantica framework,
including loading from files, environment variables, validation, and dynamic updates.
It supports multiple configuration sources and formats with automatic fallback chains
and validation.
Supported Configuration Sources:
- Configuration files: YAML, JSON formats
- Environment variables: SEMANTICA_ prefix for automatic loading
- Programmatic: Python API for setting configuration values
- Dictionary: Direct dictionary-based configuration
Algorithms Used:
- YAML Parsing: YAML parser for configuration file loading
- JSON Parsing: JSON parser for configuration file loading
- Environment Variable Parsing: OS-level environment variable access with prefix matching
- Fallback Chain: Priority-based configuration resolution (file -> env -> defaults)
- Dictionary Merging: Deep merge algorithms for configuration updates
- Validation: Type checking, range validation, required field checking
- Nested Access: Dot notation parsing for nested configuration access
Key Features:
- YAML/JSON configuration file parsing
@@ -11,12 +28,24 @@ Key Features:
- Dynamic configuration updates at runtime
- Configuration inheritance and merging
- Nested configuration access via dot notation
- Automatic type conversion for environment variables
- Progress tracking for configuration loading operations
Main Classes:
- Config: Configuration data class with validation
- ConfigManager: Configuration loading, validation, and management
Example Usage:
>>> from semantica.core import ConfigManager
>>> manager = ConfigManager()
>>> config = manager.load_from_file("config.yaml")
>>> batch_size = config.get("processing.batch_size", default=32)
>>>
>>> # Merge multiple configurations
>>> merged = manager.merge_configs(config1, config2, config3)
>>>
>>> # Load from dictionary
>>> config = manager.load_from_dict({"processing": {"batch_size": 64}})
Author: Semantica Contributors
License: MIT
@@ -369,41 +398,47 @@ class ConfigManager:
file_path = Path(file_path)
if not file_path.exists():
raise ConfigurationError(
f"Configuration file not found: {file_path}",
config_context={"file_path": str(file_path)}
)
# Detect format from extension
suffix = file_path.suffix.lower()
try:
if suffix in (".yaml", ".yml"):
with open(file_path, "r", encoding="utf-8") as f:
config_dict = yaml.safe_load(f)
elif suffix == ".json":
config_dict = read_json_file(file_path)
else:
raise ConfigurationError(
f"Unsupported configuration file format: {suffix}. "
"Supported formats: .yaml, .yml, .json"
f"Configuration file not found: {file_path}",
config_context={"file_path": str(file_path)}
)
# Create config object from loaded dictionary
config = Config(config_dict=config_dict)
# Detect format from extension
suffix = file_path.suffix.lower()
# Validate configuration if requested
if validate:
config.validate()
# Store config and file path for potential reload
self._config = config
self._last_file_path = file_path
self.progress_tracker.stop_tracking(tracking_id, status="completed",
message="Configuration loaded successfully")
return config
try:
if suffix in (".yaml", ".yml"):
with open(file_path, "r", encoding="utf-8") as f:
config_dict = yaml.safe_load(f)
elif suffix == ".json":
config_dict = read_json_file(file_path)
else:
raise ConfigurationError(
f"Unsupported configuration file format: {suffix}. "
"Supported formats: .yaml, .yml, .json"
)
# Create config object from loaded dictionary
config = Config(config_dict=config_dict)
# Validate configuration if requested
if validate:
config.validate()
# Store config and file path for potential reload
self._config = config
self._last_file_path = file_path
self.progress_tracker.stop_tracking(tracking_id, status="completed",
message="Configuration loaded successfully")
return config
except Exception as e:
# Re-raise as ConfigurationError if inner try fails
raise ConfigurationError(
f"Failed to parse configuration file: {str(e)}",
config_context={"file_path": str(file_path)}
) from e
except Exception as e:
self.progress_tracker.stop_tracking(tracking_id, status="failed", message=str(e))
+415
View File
@@ -0,0 +1,415 @@
"""
Orchestration Methods Module
This module provides all orchestration methods as simple, reusable functions for
framework initialization, knowledge base construction, pipeline execution, and
system status management. It supports multiple orchestration approaches and
integrates with the method registry for extensibility.
Supported Methods:
Knowledge Base Construction:
- "default": Standard knowledge base construction with embeddings and graph
- "minimal": Minimal knowledge base without embeddings or graph
- "full": Full knowledge base with all features enabled
Pipeline Execution:
- "default": Standard pipeline execution
- "async": Asynchronous pipeline execution
- "batch": Batch pipeline execution
Framework Initialization:
- "default": Standard framework initialization
- "minimal": Minimal initialization without plugins
- "full": Full initialization with all components
System Status:
- "default": Standard status retrieval
- "detailed": Detailed status with component health
- "summary": Summary status only
Algorithms Used:
Knowledge Base Construction:
- Source Validation: File system and URL validation
- Pipeline Orchestration: Multi-stage processing pipeline execution
- Graph Construction: Entity-relationship graph building
- Embedding Generation: Vector embedding creation from text
Pipeline Execution:
- Resource Allocation: Dynamic resource management
- Error Handling: Graceful error recovery and reporting
- Progress Tracking: Real-time progress monitoring
- Result Aggregation: Result collection and formatting
Framework Initialization:
- Component Initialization: Ordered component startup
- Configuration Validation: Config validation and loading
- Plugin Loading: Dynamic plugin discovery and loading
- Health Checking: Component health verification
System Status:
- Health Aggregation: Component health status collection
- State Tracking: System state monitoring
- Module Status: Module availability checking
- Plugin Status: Plugin loading status
Key Features:
- Multiple orchestration methods for knowledge base construction
- Multiple pipeline execution methods
- Framework initialization methods
- System status retrieval methods
- Method dispatchers with registry support
- Custom method registration capability
- Consistent interface across all methods
Main Functions:
- build_knowledge_base: Knowledge base construction wrapper
- run_pipeline: Pipeline execution wrapper
- initialize_framework: Framework initialization wrapper
- get_status: System status retrieval wrapper
- get_orchestration_method: Get orchestration method by name
Example Usage:
>>> from semantica.core.methods import build_knowledge_base, get_orchestration_method
>>> result = build_knowledge_base(sources=["doc1.pdf"], method="default")
>>> method = get_orchestration_method("knowledge_base", "custom_method")
Author: Semantica Contributors
License: MIT
"""
from typing import Any, Dict, List, Optional, Union, Callable
from pathlib import Path
from ..utils.logging import get_logger
from ..utils.exceptions import ProcessingError, ConfigurationError
from .orchestrator import Semantica
from .config_manager import Config, ConfigManager
from .registry import method_registry
logger = get_logger("core_methods")
def build_knowledge_base(
sources: Union[str, List[Union[str, Path]]],
method: str = "default",
config: Optional[Union[Config, Dict[str, Any]]] = None,
**kwargs
) -> Dict[str, Any]:
"""
Build knowledge base from data sources (convenience function).
This is a user-friendly wrapper that constructs a knowledge base from
various data sources using the specified method.
Args:
sources: Single source or list of sources (files, URLs, streams)
method: Knowledge base construction method (default: "default")
config: Optional configuration object or dictionary
**kwargs: Additional options:
- embeddings: Whether to generate embeddings (default: True)
- graph: Whether to build knowledge graph (default: True)
- pipeline: Custom pipeline configuration
- fail_fast: Whether to stop on first error (default: False)
Returns:
Dictionary containing:
- knowledge_graph: Knowledge graph data
- embeddings: Embedding vectors
- results: Processing results
- statistics: Processing statistics
- metadata: Processing metadata
Examples:
>>> from semantica.core.methods import build_knowledge_base
>>> result = build_knowledge_base(
... sources=["doc1.pdf", "doc2.docx"],
... method="default",
... embeddings=True,
... graph=True
... )
>>> print(f"Processed {result['statistics']['sources_processed']} sources")
"""
# Normalize sources to list
if isinstance(sources, str):
sources = [sources]
# Check for custom method in registry
custom_method = method_registry.get("knowledge_base", method)
if custom_method:
return custom_method(sources, config=config, **kwargs)
# Use default Semantica framework
framework = Semantica(config=config)
framework.initialize()
try:
# Map method to kwargs
if method == "minimal":
kwargs.setdefault("embeddings", False)
kwargs.setdefault("graph", False)
elif method == "full":
kwargs.setdefault("embeddings", True)
kwargs.setdefault("graph", True)
else: # default
kwargs.setdefault("embeddings", True)
kwargs.setdefault("graph", True)
result = framework.build_knowledge_base(sources, **kwargs)
return result
finally:
framework.shutdown(graceful=True)
def run_pipeline(
pipeline: Union[Dict[str, Any], Any],
data: Any,
method: str = "default",
config: Optional[Union[Config, Dict[str, Any]]] = None,
**kwargs
) -> Dict[str, Any]:
"""
Execute a processing pipeline (convenience function).
This is a user-friendly wrapper that executes a processing pipeline
on input data using the specified method.
Args:
pipeline: Pipeline object or configuration dictionary
data: Input data for pipeline
method: Pipeline execution method (default: "default")
config: Optional configuration object or dictionary
**kwargs: Additional pipeline options
Returns:
Dictionary containing:
- output: Pipeline output data
- metadata: Processing metadata
- metrics: Performance metrics
Examples:
>>> from semantica.core.methods import run_pipeline
>>> result = run_pipeline(
... pipeline={"steps": ["extract", "transform"]},
... data="sample text",
... method="default"
... )
"""
# Check for custom method in registry
custom_method = method_registry.get("pipeline", method)
if custom_method:
return custom_method(pipeline, data, config=config, **kwargs)
# Use default Semantica framework
framework = Semantica(config=config)
framework.initialize()
try:
result = framework.run_pipeline(pipeline, data, **kwargs)
return result
finally:
framework.shutdown(graceful=True)
def initialize_framework(
config: Optional[Union[Config, Dict[str, Any]]] = None,
method: str = "default",
**kwargs
) -> Semantica:
"""
Initialize Semantica framework (convenience function).
This is a user-friendly wrapper that initializes the framework
using the specified method.
Args:
config: Optional configuration object or dictionary
method: Initialization method (default: "default")
**kwargs: Additional initialization options
Returns:
Initialized Semantica framework instance
Examples:
>>> from semantica.core.methods import initialize_framework
>>> framework = initialize_framework(
... config={"llm_provider": {"name": "openai"}},
... method="default"
... )
>>> status = framework.get_status()
"""
# Check for custom method in registry
custom_method = method_registry.get("orchestration", method)
if custom_method:
return custom_method(config=config, **kwargs)
# Use default initialization
framework = Semantica(config=config, **kwargs)
if method == "minimal":
# Minimal initialization - just create instance, don't initialize
pass
elif method == "full":
# Full initialization
framework.initialize()
else: # default
framework.initialize()
return framework
def get_status(
framework: Optional[Semantica] = None,
method: str = "default",
**kwargs
) -> Dict[str, Any]:
"""
Get system status (convenience function).
This is a user-friendly wrapper that retrieves system status
using the specified method.
Args:
framework: Optional Semantica framework instance (creates new if None)
method: Status retrieval method (default: "default")
**kwargs: Additional options
Returns:
Dictionary containing:
- state: System state
- health: Health summary
- modules: Module status
- plugins: Plugin status
- config: Configuration status
Examples:
>>> from semantica.core.methods import get_status
>>> status = get_status(framework=my_framework, method="detailed")
>>> print(f"System state: {status['state']}")
"""
# Check for custom method in registry
custom_method = method_registry.get("orchestration", f"get_status_{method}")
if custom_method:
return custom_method(framework=framework, **kwargs)
# Use default status retrieval
if framework is None:
framework = Semantica()
framework.initialize()
should_shutdown = True
else:
should_shutdown = False
try:
status = framework.get_status()
# Filter based on method
if method == "summary":
return {
"state": status.get("state"),
"health": {
"is_healthy": status.get("health", {}).get("is_healthy"),
"healthy_components": status.get("health", {}).get("healthy_components"),
}
}
elif method == "detailed":
return status
else: # default
return status
finally:
if should_shutdown:
framework.shutdown(graceful=True)
def get_orchestration_method(task: str, name: str) -> Optional[Callable]:
"""
Get orchestration method by task and name.
This function retrieves a registered orchestration method from the registry
or returns a built-in method if available.
Args:
task: Task type ("pipeline", "knowledge_base", "orchestration", "lifecycle")
name: Method name
Returns:
Method function or None if not found
Examples:
>>> from semantica.core.methods import get_orchestration_method
>>> method = get_orchestration_method("knowledge_base", "custom_method")
>>> if method:
... result = method(sources=["doc.pdf"])
"""
# First check registry
method = method_registry.get(task, name)
if method:
return method
# Check built-in methods
builtin_methods = {
"knowledge_base": {
"default": build_knowledge_base,
"minimal": lambda sources, **kwargs: build_knowledge_base(sources, method="minimal", **kwargs),
"full": lambda sources, **kwargs: build_knowledge_base(sources, method="full", **kwargs),
},
"pipeline": {
"default": run_pipeline,
},
"orchestration": {
"default": initialize_framework,
"minimal": lambda config=None, **kwargs: initialize_framework(config=config, method="minimal", **kwargs),
"full": lambda config=None, **kwargs: initialize_framework(config=config, method="full", **kwargs),
},
}
if task in builtin_methods and name in builtin_methods[task]:
return builtin_methods[task][name]
return None
def list_available_methods(task: Optional[str] = None) -> Dict[str, List[str]]:
"""
List all available orchestration methods.
Args:
task: Optional task type to filter by
Returns:
Dictionary mapping task types to method names
Examples:
>>> from semantica.core.methods import list_available_methods
>>> all_methods = list_available_methods()
>>> kb_methods = list_available_methods("knowledge_base")
"""
# Get registered methods
registered = method_registry.list_all(task=task)
# Add built-in methods
builtin_methods = {
"knowledge_base": ["default", "minimal", "full"],
"pipeline": ["default"],
"orchestration": ["default", "minimal", "full"],
"lifecycle": [],
}
if task:
# Merge for specific task
result = {task: list(set(registered.get(task, []) + builtin_methods.get(task, [])))}
else:
# Merge for all tasks
result = {}
for t in set(list(registered.keys()) + list(builtin_methods.keys())):
result[t] = list(set(registered.get(t, []) + builtin_methods.get(t, [])))
return result
# Register default methods with registry
method_registry.register("knowledge_base", "default", build_knowledge_base)
method_registry.register("pipeline", "default", run_pipeline)
method_registry.register("orchestration", "default", initialize_framework)
+129
View File
@@ -0,0 +1,129 @@
"""
Method Registry Module for Core Orchestration
This module provides a method registry system for registering custom orchestration methods,
enabling extensibility and community contributions to the core orchestration toolkit.
Supported Registration Types:
- Method Registry: Register custom orchestration methods for:
* "pipeline": Pipeline execution methods
* "knowledge_base": Knowledge base construction methods
* "orchestration": General orchestration methods
* "lifecycle": Lifecycle management methods
Algorithms Used:
- Registry Pattern: Dictionary-based registration and lookup
- Dynamic Registration: Runtime function registration
- Type Checking: Type validation for registered components
- Lookup Algorithms: Hash-based O(1) lookup for methods
- Task-based Organization: Hierarchical organization by task type
Key Features:
- Method registry for custom orchestration methods
- Task-based method organization (pipeline, knowledge_base, orchestration, lifecycle)
- Dynamic registration and unregistration
- Easy discovery of available methods
- Support for community-contributed extensions
Main Classes:
- MethodRegistry: Registry for custom orchestration methods
Global Instances:
- method_registry: Global method registry instance
Example Usage:
>>> from semantica.core.registry import method_registry
>>> method_registry.register("pipeline", "custom_method", custom_pipeline_function)
>>> available = method_registry.list_all("pipeline")
Author: Semantica Contributors
License: MIT
"""
from typing import Dict, Callable, Any, List, Optional
class MethodRegistry:
"""Registry for custom orchestration methods."""
_methods: Dict[str, Dict[str, Callable]] = {
"pipeline": {},
"knowledge_base": {},
"orchestration": {},
"lifecycle": {},
}
@classmethod
def register(cls, task: str, name: str, method_func: Callable):
"""
Register a custom orchestration method.
Args:
task: Task type ("pipeline", "knowledge_base", "orchestration", "lifecycle")
name: Method name
method_func: Method function
"""
if task not in cls._methods:
cls._methods[task] = {}
cls._methods[task][name] = method_func
@classmethod
def get(cls, task: str, name: str) -> Optional[Callable]:
"""
Get method by task and name.
Args:
task: Task type ("pipeline", "knowledge_base", "orchestration", "lifecycle")
name: Method name
Returns:
Method function or None
"""
return cls._methods.get(task, {}).get(name)
@classmethod
def list_all(cls, task: Optional[str] = None) -> Dict[str, List[str]]:
"""
List all registered methods.
Args:
task: Optional task type to filter by
Returns:
Dictionary mapping task types to method names
"""
if task:
return {task: list(cls._methods.get(task, {}).keys())}
return {t: list(m.keys()) for t, m in cls._methods.items()}
@classmethod
def unregister(cls, task: str, name: str):
"""
Unregister a method.
Args:
task: Task type ("pipeline", "knowledge_base", "orchestration", "lifecycle")
name: Method name
"""
if task in cls._methods and name in cls._methods[task]:
del cls._methods[task][name]
@classmethod
def clear(cls, task: Optional[str] = None):
"""
Clear all registered methods for a task or all tasks.
Args:
task: Optional task type to clear (clears all if None)
"""
if task:
if task in cls._methods:
cls._methods[task].clear()
else:
for task_dict in cls._methods.values():
task_dict.clear()
# Global registry
method_registry = MethodRegistry()