from fastapi import APIRouter, UploadFile, File, HTTPException, Request from fastapi.responses import StreamingResponse from service import JvectorService from utils import jingrow_api_verify_and_billing from settings import settings import json import asyncio router = APIRouter(prefix=settings.router_prefix) service = JvectorService() @router.post(settings.file_route) @jingrow_api_verify_and_billing(api_name=settings.api_name) async def vectorize_image_file(file: UploadFile = File(...), request: Request = None): """ 将上传的文件转换为矢量图 Args: file: 上传的图片文件 request: FastAPI 请求对象 Returns: 处理后的矢量图内容 """ content = await file.read() result = await service.vectorize_from_file(content) return result @router.post(settings.batch_route) @jingrow_api_verify_and_billing(api_name=settings.api_name) async def vectorize_image_batch(data: dict, request: Request): """ 批量处理多个URL图片转换为矢量图 Args: data: 包含图片URL列表的字典 request: FastAPI 请求对象 Returns: 流式响应,包含每个图片的处理结果 """ if "urls" not in data: raise HTTPException(status_code=400, detail="缺少urls参数") async def process_and_stream(): async for result in service.process_batch(data["urls"]): yield json.dumps(result) + "\n" return StreamingResponse( process_and_stream(), media_type="application/x-ndjson" )