main.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """APIYI FLUX 本地封装 — 同步生图。
  2. 环境变量:
  3. APIYI_KEY 必填,请求 api.apiyi.com/v1
  4. APIYI_BASE_URL 可选,默认 https://api.apiyi.com/v1
  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_flux import generate_flux_image
  16. app = FastAPI(title="Flux Image Generation APIyi Proxy")
  17. class GenerateRequest(BaseModel):
  18. prompt: str = Field(..., description="正向提示词")
  19. aspect_ratio: str = Field(default="16:9", description="宽高比 (如: 1:1, 16:9, 9:16, 2:3, 3:2, 3:7, 7:3)")
  20. model: str = Field(default="flux-kontext-pro", description="模型选择: 支持 flux-2-flex, flux-2-klein-4b, flux-2-klein-9b, flux-2-max, flux-2-pro, flux-dev, flux-kontext-max, flux-kontext-pro 等")
  21. seed: Optional[int] = Field(default=None, description="随机种子,用于结果重现")
  22. safety_tolerance: int = Field(default=2, description="内容安全级别 (0-6)")
  23. output_format: str = Field(default="png", description="输出格式 jpeg 或 png")
  24. prompt_upsampling: bool = Field(default=False, description="是否增强提示词")
  25. image_url: Optional[str] = Field(default=None, description="上传的参考图 URL(开启编辑图生图)")
  26. mask_url: Optional[str] = Field(default=None, description="蒙版图 URL")
  27. class GenerateResponse(BaseModel):
  28. images: List[str]
  29. status: str
  30. @app.get("/health")
  31. def health() -> dict[str, str]:
  32. return {"status": "ok"}
  33. @app.post("/generate", response_model=GenerateResponse)
  34. def generate(req: GenerateRequest) -> dict[str, Any]:
  35. try:
  36. url = generate_flux_image(
  37. prompt=req.prompt,
  38. aspect_ratio=req.aspect_ratio,
  39. model=req.model,
  40. seed=req.seed,
  41. safety_tolerance=req.safety_tolerance,
  42. output_format=req.output_format,
  43. prompt_upsampling=req.prompt_upsampling,
  44. image_url=req.image_url,
  45. mask_url=req.mask_url
  46. )
  47. if url is None:
  48. raise HTTPException(status_code=500, detail="生成失败,未返回图像链接")
  49. return {"images": [url], "status": "success"}
  50. except Exception as e:
  51. raise HTTPException(status_code=500, detail=str(e))
  52. if __name__ == "__main__":
  53. parser = argparse.ArgumentParser()
  54. parser.add_argument("--port", type=int, default=8002)
  55. args = parser.parse_args()
  56. uvicorn.run(app, host="0.0.0.0", port=args.port)