支持fastapi服务
This commit is contained in:
125
api/routers/content.py
Normal file
125
api/routers/content.py
Normal file
@@ -0,0 +1,125 @@
|
||||
"""
|
||||
Content generation endpoints
|
||||
|
||||
Endpoints for generating narrations, image prompts, and titles.
|
||||
"""
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from loguru import logger
|
||||
|
||||
from api.dependencies import ReelForgeDep
|
||||
from api.schemas.content import (
|
||||
NarrationGenerateRequest,
|
||||
NarrationGenerateResponse,
|
||||
ImagePromptGenerateRequest,
|
||||
ImagePromptGenerateResponse,
|
||||
TitleGenerateRequest,
|
||||
TitleGenerateResponse,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/content", tags=["Content Generation"])
|
||||
|
||||
|
||||
@router.post("/narration", response_model=NarrationGenerateResponse)
|
||||
async def generate_narration(
|
||||
request: NarrationGenerateRequest,
|
||||
reelforge: ReelForgeDep
|
||||
):
|
||||
"""
|
||||
Generate narrations from text
|
||||
|
||||
Uses LLM to break down text into multiple narration segments.
|
||||
|
||||
- **text**: Source text
|
||||
- **n_scenes**: Number of narrations to generate
|
||||
- **min_words**: Minimum words per narration
|
||||
- **max_words**: Maximum words per narration
|
||||
|
||||
Returns list of narration strings.
|
||||
"""
|
||||
try:
|
||||
logger.info(f"Generating {request.n_scenes} narrations from text")
|
||||
|
||||
# Call narration generator service
|
||||
narrations = await reelforge.narration_generator(
|
||||
text=request.text,
|
||||
n_scenes=request.n_scenes,
|
||||
min_words=request.min_words,
|
||||
max_words=request.max_words
|
||||
)
|
||||
|
||||
return NarrationGenerateResponse(
|
||||
narrations=narrations
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Narration generation error: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@router.post("/image-prompt", response_model=ImagePromptGenerateResponse)
|
||||
async def generate_image_prompt(
|
||||
request: ImagePromptGenerateRequest,
|
||||
reelforge: ReelForgeDep
|
||||
):
|
||||
"""
|
||||
Generate image prompts from narrations
|
||||
|
||||
Uses LLM to create detailed image generation prompts.
|
||||
|
||||
- **narrations**: List of narration texts
|
||||
- **min_words**: Minimum words per prompt
|
||||
- **max_words**: Maximum words per prompt
|
||||
|
||||
Returns list of image prompts.
|
||||
"""
|
||||
try:
|
||||
logger.info(f"Generating image prompts for {len(request.narrations)} narrations")
|
||||
|
||||
# Call image prompt generator service
|
||||
image_prompts = await reelforge.image_prompt_generator(
|
||||
narrations=request.narrations,
|
||||
min_words=request.min_words,
|
||||
max_words=request.max_words
|
||||
)
|
||||
|
||||
return ImagePromptGenerateResponse(
|
||||
image_prompts=image_prompts
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Image prompt generation error: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@router.post("/title", response_model=TitleGenerateResponse)
|
||||
async def generate_title(
|
||||
request: TitleGenerateRequest,
|
||||
reelforge: ReelForgeDep
|
||||
):
|
||||
"""
|
||||
Generate video title from text
|
||||
|
||||
Uses LLM to create an engaging title.
|
||||
|
||||
- **text**: Source text
|
||||
- **style**: Optional title style hint
|
||||
|
||||
Returns generated title.
|
||||
"""
|
||||
try:
|
||||
logger.info("Generating title from text")
|
||||
|
||||
# Call title generator service
|
||||
title = await reelforge.title_generator(
|
||||
text=request.text
|
||||
)
|
||||
|
||||
return TitleGenerateResponse(
|
||||
title=title
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Title generation error: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
Reference in New Issue
Block a user