Add tenant-aware provider config resolver across LLM facades

This commit is contained in:
ي
2026-03-12 15:04:42 +05:30
parent b410ece4ca
commit feacbc6d59
5 changed files with 241 additions and 84 deletions

View File

@@ -25,10 +25,10 @@ except ImportError:
HF_HUB_AVAILABLE = False
InferenceClient = None
from ..onboarding.api_key_manager import APIKeyManager
from services.subscription import PricingService
from services.subscription.provider_detection import detect_actual_provider
from utils.logger_utils import get_service_logger
from .tenant_provider_config import tenant_provider_config_resolver
logger = get_service_logger("video_generation_service")
@@ -202,16 +202,10 @@ def _track_video_operation_usage(
return {}
def _get_api_key(provider: str) -> Optional[str]:
def _get_api_key(provider: str, user_id: Optional[str] = None) -> Optional[str]:
try:
manager = APIKeyManager()
mapping = {
"huggingface": "hf_token",
"wavespeed": "wavespeed", # WaveSpeed API key
"gemini": "gemini", # placeholder for Veo 3
"openai": "openai_api_key", # placeholder for Sora
}
return manager.get_api_key(mapping.get(provider, provider))
key, _source = tenant_provider_config_resolver.resolve_provider_key(provider, user_id=user_id)
return key
except Exception as e:
logger.error(f"[video_gen] Failed to read API key for {provider}: {e}")
return None
@@ -297,6 +291,7 @@ def _coerce_video_bytes(output: Any) -> bytes:
def _generate_with_huggingface(
user_id: Optional[str],
prompt: str,
num_frames: int = 24 * 4,
guidance_scale: float = 7.5,
@@ -311,7 +306,7 @@ def _generate_with_huggingface(
if not HF_HUB_AVAILABLE:
raise RuntimeError("huggingface_hub is not installed. Install with: pip install huggingface_hub")
token = _get_api_key("huggingface")
token = _get_api_key("huggingface", user_id=user_id)
if not token:
raise RuntimeError("HF token not configured. Set an hf_token in APIKeyManager.")
@@ -618,7 +613,13 @@ async def ai_video_generate(
- height: Video height in pixels (for image-to-video)
- metadata: Additional metadata dict
"""
logger.info(f"[video_gen] operation={operation_type}, provider={provider}")
cfg = tenant_provider_config_resolver.resolve(
modality="video",
user_id=user_id,
explicit_provider=provider,
)
provider = (cfg.selected_providers or [provider])[0]
logger.info(f"[video_gen] operation={operation_type}, provider={provider}, credential_source={cfg.credential_source.get(provider)}")
# Enforce authentication usage like text gen does
if not user_id:
@@ -679,7 +680,7 @@ async def ai_video_generate(
try:
if operation_type == "text-to-video":
if provider == "huggingface":
video_bytes = _generate_with_huggingface(prompt=prompt, **kwargs)
video_bytes = _generate_with_huggingface(user_id=user_id, prompt=prompt, **kwargs)
result = {
"video_bytes": video_bytes,
"model_name": kwargs.get("model", "tencent/HunyuanVideo"),