feat: add unified asset retry endpoint
Some checks failed
Build and Push Docker Images / changes (push) Has been cancelled
Build and Push Docker Images / build-backend (push) Has been cancelled
Build and Push Docker Images / build-frontend (push) Has been cancelled
Build and Push Docker Images / build-admin-frontend (push) Has been cancelled

This commit is contained in:
2026-04-18 11:40:10 +08:00
parent b8d3cb4644
commit 0613238a37
9 changed files with 316 additions and 91 deletions

View File

@@ -5,33 +5,34 @@ import uuid
from typing import AsyncGenerator
from fastapi import APIRouter, Depends, Response
from sse_starlette.sse import EventSourceResponse
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.deps import require_user
from app.core.logging import get_logger
from app.core.rate_limiter import check_rate_limit
from app.db.database import get_db
from app.db.models import User
from sqlalchemy.ext.asyncio import AsyncSession
from sse_starlette.sse import EventSourceResponse
from app.core.deps import require_user
from app.core.logging import get_logger
from app.core.rate_limiter import check_rate_limit
from app.db.database import get_db
from app.db.models import User
from app.schemas.story_schemas import (
AchievementItem,
FullStoryResponse,
GenerateRequest,
StoryAssetRetryRequest,
StorybookRequest,
StorybookResponse,
StoryDetailResponse,
StoryImageResponse,
StoryListItem,
StoryResponse,
StorybookRequest,
StorybookResponse,
)
from app.services import story_service
from app.services.memory_service import build_enhanced_memory_context
from app.services.provider_router import (
generate_story_content,
generate_image,
generate_story_content,
)
from app.services.story_status import StoryAssetStatus, sync_story_status
logger = get_logger(__name__)
router = APIRouter()
@@ -69,12 +70,12 @@ async def generate_story_stream(
):
"""流式生成故事SSE"""
await check_rate_limit(f"story:{user.id}", RATE_LIMIT_REQUESTS, RATE_LIMIT_WINDOW)
# Validation
profile_id, universe_id = await story_service.validate_profile_and_universe(
request.child_profile_id, request.universe_id, user.id, db
)
# Build Context
memory_context = await build_enhanced_memory_context(profile_id, universe_id, db)
@@ -241,10 +242,21 @@ async def generate_story_image(
"audio_status": story.audio_status,
"last_error": story.last_error,
}
@router.get("/audio/{story_id}")
async def get_story_audio(
@router.post("/stories/{story_id}/assets/retry", response_model=StoryDetailResponse)
async def retry_story_assets(
story_id: int,
payload: StoryAssetRetryRequest,
user: User = Depends(require_user),
db: AsyncSession = Depends(get_db),
):
"""Retry selected generated assets for a story."""
return await story_service.retry_story_assets(story_id, user.id, payload.assets, db)
@router.get("/audio/{story_id}")
async def get_story_audio(
story_id: int,
user: User = Depends(require_user),
db: AsyncSession = Depends(get_db),