main.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import os
  2. from dotenv import load_dotenv
  3. from fastapi import FastAPI, HTTPException
  4. from pydantic import BaseModel, Field
  5. from veo_client import VEOClient
  6. # 加载 .env 文件
  7. load_dotenv()
  8. app = FastAPI(title="VEO Video Generation API")
  9. class VideoRequest(BaseModel):
  10. prompt: str = Field(..., description="视频生成的文本描述")
  11. model: str = Field(default="veo-3.1-fast", description="模型名称,如 veo-3.1-fast / veo-3.1 / veo-3.1-landscape-fast")
  12. timeout: int = Field(default=600, description="等待超时时间(秒)")
  13. class VideoResponse(BaseModel):
  14. video_id: str
  15. url: str
  16. resolution: str
  17. model: str
  18. status: str
  19. @app.post("/generate", response_model=VideoResponse)
  20. async def generate_video(request: VideoRequest):
  21. api_key = os.getenv("APIYI_KEY")
  22. if not api_key:
  23. raise HTTPException(status_code=500, detail="APIYI_KEY 环境变量未设置")
  24. try:
  25. client = VEOClient(api_key)
  26. video_id = client.create_video(request.prompt, request.model)
  27. result = client.wait_for_completion(video_id, timeout=request.timeout)
  28. return VideoResponse(
  29. video_id=result["id"],
  30. url=result["video_url"],
  31. resolution=result.get("size", "unknown"),
  32. model=result.get("model", request.model),
  33. status="completed"
  34. )
  35. except TimeoutError:
  36. raise HTTPException(status_code=408, detail="视频生成超时")
  37. except Exception as e:
  38. raise HTTPException(status_code=500, detail=str(e))
  39. @app.get("/health")
  40. async def health():
  41. return {"status": "ok"}
  42. if __name__ == "__main__":
  43. import uvicorn
  44. import sys
  45. # 从命令行参数获取端口,默认 5000
  46. port = 5000
  47. if "--port" in sys.argv:
  48. try:
  49. port_idx = sys.argv.index("--port")
  50. port = int(sys.argv[port_idx + 1])
  51. except (IndexError, ValueError):
  52. pass
  53. uvicorn.run(app, host="0.0.0.0", port=port)