90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
"""
|
|
Prompt optimization endpoints for Video Studio.
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel, Field
|
|
from typing import Optional, Dict, Any
|
|
|
|
from ...utils.auth import get_current_user, require_authenticated_user
|
|
from ...utils.logger_utils import get_service_logger
|
|
from services.wavespeed.client import WaveSpeedClient
|
|
|
|
logger = get_service_logger("video_studio.endpoints.prompt")
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class PromptOptimizeRequest(BaseModel):
|
|
text: str = Field(..., description="The prompt text to optimize")
|
|
mode: Optional[str] = Field(
|
|
default="video",
|
|
pattern="^(image|video)$",
|
|
description="Optimization mode: 'image' or 'video' (default: 'video' for Video Studio)"
|
|
)
|
|
style: Optional[str] = Field(
|
|
default="default",
|
|
pattern="^(default|artistic|photographic|technical|anime|realistic)$",
|
|
description="Style: 'default', 'artistic', 'photographic', 'technical', 'anime', or 'realistic'"
|
|
)
|
|
image: Optional[str] = Field(None, description="Base64-encoded image for context (optional)")
|
|
|
|
|
|
class PromptOptimizeResponse(BaseModel):
|
|
optimized_prompt: str
|
|
success: bool
|
|
|
|
|
|
@router.post("/optimize-prompt")
|
|
async def optimize_prompt(
|
|
request: PromptOptimizeRequest,
|
|
current_user: Dict[str, Any] = Depends(get_current_user),
|
|
) -> PromptOptimizeResponse:
|
|
"""
|
|
Optimize a prompt using WaveSpeed prompt optimizer.
|
|
|
|
The WaveSpeedAI Prompt Optimizer enhances prompts specifically for image and video
|
|
generation workflows. It restructures and enriches your input prompt to improve:
|
|
- Visual clarity and composition
|
|
- Cinematic framing and lighting
|
|
- Camera movement and style consistency
|
|
- Motion dynamics for video generation
|
|
|
|
Produces significantly better outputs across video generation models like FLUX, Wan,
|
|
Kling, Veo, Seedance, and more.
|
|
"""
|
|
try:
|
|
user_id = require_authenticated_user(current_user)
|
|
|
|
if not request.text or not request.text.strip():
|
|
raise HTTPException(status_code=400, detail="Prompt text is required")
|
|
|
|
# Default to "video" mode for Video Studio
|
|
mode = request.mode or "video"
|
|
style = request.style or "default"
|
|
|
|
logger.info(f"[VideoStudio] Optimizing prompt for user {user_id} (mode={mode}, style={style})")
|
|
|
|
client = WaveSpeedClient()
|
|
optimized_prompt = client.optimize_prompt(
|
|
text=request.text.strip(),
|
|
mode=mode,
|
|
style=style,
|
|
image=request.image, # Optional base64 image
|
|
enable_sync_mode=True,
|
|
timeout=30
|
|
)
|
|
|
|
logger.info(f"[VideoStudio] Prompt optimized successfully for user {user_id}")
|
|
|
|
return PromptOptimizeResponse(
|
|
optimized_prompt=optimized_prompt,
|
|
success=True
|
|
)
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as exc:
|
|
logger.error(f"[VideoStudio] Failed to optimize prompt: {exc}", exc_info=True)
|
|
raise HTTPException(status_code=500, detail=f"Failed to optimize prompt: {str(exc)}")
|