Security hardening release addressing CodeQL and Dependabot alerts: - Fix stack trace exposure in error responses - Add SSRF protection with DNS resolution checking - Implement proper URL hostname validation (replaces substring matching) - Add centralized path sanitization to prevent path traversal - Fix ReDoS vulnerability in email validation regex - Improve HTML sanitization in validation utilities - Fix capability wildcard matching in auth utilities - Update glob dependency to address CVE - Add CodeQL suppression comments for verified false positives 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
76 lines
2.2 KiB
Python
76 lines
2.2 KiB
Python
"""
|
|
GT 2.0 Resource Cluster Providers
|
|
|
|
External AI model providers for the resource cluster.
|
|
"""
|
|
|
|
from typing import Dict, Any, Optional
|
|
import logging
|
|
|
|
from .external_provider import ExternalProvider
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ProviderFactory:
|
|
"""Factory for creating provider instances dynamically"""
|
|
|
|
def __init__(self):
|
|
self.providers = {}
|
|
self.initialized = False
|
|
|
|
async def initialize(self):
|
|
"""Initialize all providers"""
|
|
if self.initialized:
|
|
return
|
|
|
|
try:
|
|
# Initialize external provider (BGE-M3)
|
|
external_provider = ExternalProvider()
|
|
await external_provider.initialize()
|
|
self.providers["external"] = external_provider
|
|
|
|
logger.info("Provider factory initialized successfully")
|
|
self.initialized = True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to initialize provider factory: {e}")
|
|
raise
|
|
|
|
def get_provider(self, provider_name: str) -> Optional[Any]:
|
|
"""Get provider instance by name"""
|
|
return self.providers.get(provider_name)
|
|
|
|
def list_providers(self) -> Dict[str, Any]:
|
|
"""List all available providers"""
|
|
return {
|
|
name: {
|
|
"name": provider.name if hasattr(provider, "name") else name,
|
|
"status": "initialized" if provider else "error"
|
|
}
|
|
for name, provider in self.providers.items()
|
|
}
|
|
|
|
|
|
# Global provider factory instance
|
|
_provider_factory = None
|
|
|
|
|
|
async def get_provider_factory() -> ProviderFactory:
|
|
"""Get initialized provider factory"""
|
|
global _provider_factory
|
|
if _provider_factory is None:
|
|
_provider_factory = ProviderFactory()
|
|
await _provider_factory.initialize()
|
|
return _provider_factory
|
|
|
|
|
|
def get_external_provider():
|
|
"""Get external provider instance (synchronous)"""
|
|
global _provider_factory
|
|
if _provider_factory and "external" in _provider_factory.providers:
|
|
return _provider_factory.providers["external"]
|
|
return None
|
|
|
|
|
|
__all__ = ["ExternalProvider", "ProviderFactory", "get_provider_factory", "get_external_provider"] |