main.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. """APIYI SEEDREAM 本地封装 — 同步生图。
  2. 环境变量:
  3. SEEDREAM_API_KEY / APIYI_KEY
  4. APIYI_BASE_URL (可选)
  5. 接口:
  6. GET /health
  7. POST /generate
  8. """
  9. from __future__ import annotations
  10. import argparse
  11. from typing import Any, List, Optional
  12. import uvicorn
  13. from fastapi import FastAPI, HTTPException
  14. from pydantic import BaseModel, Field
  15. from generate_seedream import generate_seedream_image
  16. app = FastAPI(title="SeeDream Image Generation APIyi Proxy")
  17. class GenerateRequest(BaseModel):
  18. prompt: str = Field(..., description="正向提示词")
  19. model: str = Field(default="seedream-5-0-260128", description="使用的模型名称 (如 seedream-5-0-260128)")
  20. size: str = Field(default="2048x2048", description="图片尺寸, 如 '1K', '2K', '4K', '2048x2048'")
  21. quality: str = Field(default="hd", description="图片质量: standard 或 hd")
  22. n: int = Field(default=1, description="生成数量")
  23. image_url: Optional[str] = Field(default=None, description="参考图网络外链(开启图生图)")
  24. class GenerateResponse(BaseModel):
  25. images: List[str]
  26. status: str
  27. @app.get("/health")
  28. def health() -> dict[str, str]:
  29. return {"status": "ok"}
  30. @app.post("/generate", response_model=GenerateResponse)
  31. def generate(req: GenerateRequest) -> dict[str, Any]:
  32. try:
  33. result = generate_seedream_image(
  34. prompt=req.prompt,
  35. model=req.model,
  36. size=req.size,
  37. quality=req.quality,
  38. n=req.n,
  39. response_format="url",
  40. image_url=req.image_url
  41. )
  42. if "error" in result:
  43. raise HTTPException(status_code=500, detail=result["error"])
  44. if "data" not in result or not result["data"]:
  45. raise HTTPException(status_code=500, detail="生图失败,返回数据中无图像资料")
  46. urls = [item["url"] for item in result["data"] if "url" in item]
  47. return {"images": urls, "status": "success"}
  48. except Exception as e:
  49. raise HTTPException(status_code=500, detail=str(e))
  50. if __name__ == "__main__":
  51. parser = argparse.ArgumentParser()
  52. parser.add_argument("--port", type=int, default=8003)
  53. args = parser.parse_args()
  54. uvicorn.run(app, host="0.0.0.0", port=args.port)