GT AI OS Community Edition v2.0.33
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>
This commit is contained in:
76
apps/resource-cluster/app/providers/__init__.py
Normal file
76
apps/resource-cluster/app/providers/__init__.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
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"]
|
||||
Reference in New Issue
Block a user