56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
import logging
|
|
import time
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from fastapi.responses import JSONResponse
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.dependencies import get_db
|
|
from app.schemas.api_v3.image import (
|
|
ApiImageGenerateRequest,
|
|
ApiImageGenerateResponse,
|
|
)
|
|
from app.services.api_v3 import auth_service, generation_service
|
|
|
|
logger = logging.getLogger("videogen")
|
|
|
|
router = APIRouter(prefix="/images", tags=["api-v3-images"])
|
|
|
|
|
|
@router.post(
|
|
"",
|
|
summary="生成图片",
|
|
description="同步生成图片,等待完成后直接返回结果",
|
|
)
|
|
async def generate_image(
|
|
req: ApiImageGenerateRequest,
|
|
key_context: auth_service.ApiKeyContext = Depends(auth_service.get_api_key_dependency),
|
|
db: AsyncSession = Depends(get_db),
|
|
) -> JSONResponse:
|
|
"""同步生成图片。"""
|
|
start_time = time.perf_counter()
|
|
try:
|
|
result = await generation_service.generate_image_sync(
|
|
db=db,
|
|
key=key_context.api_key,
|
|
callable_models=key_context.callable_models,
|
|
req=req,
|
|
start_time=start_time,
|
|
)
|
|
data = result.model_dump()
|
|
# 处理 datetime 序列化
|
|
if data.get("created"):
|
|
data["created"] = data["created"] if isinstance(data["created"], int) else int(data["created"])
|
|
return JSONResponse(
|
|
content={"code": 0, "data": data, "message": "ok"},
|
|
status_code=200,
|
|
)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as exc:
|
|
logger.exception("API image generation failed")
|
|
raise HTTPException(
|
|
status_code=status.HTTP_504_GATEWAY_TIMEOUT,
|
|
detail=f"图片生成失败: {str(exc)[:200]}",
|
|
)
|