| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- """APIYI FLUX 本地封装 — 同步生图。
- 环境变量:
- APIYI_KEY 必填,请求 api.apiyi.com/v1
- APIYI_BASE_URL 可选,默认 https://api.apiyi.com/v1
- 接口:
- GET /health
- POST /generate 提交生成并一次性返回结果
- """
- from __future__ import annotations
- import argparse
- from typing import Any, List, Optional
- import uvicorn
- from fastapi import FastAPI, HTTPException
- from pydantic import BaseModel, Field
- from generate_flux import generate_flux_image
- app = FastAPI(title="Flux Image Generation APIyi Proxy")
- class GenerateRequest(BaseModel):
- prompt: str = Field(..., description="正向提示词")
- aspect_ratio: str = Field(default="16:9", description="宽高比 (如: 1:1, 16:9, 9:16, 2:3, 3:2, 3:7, 7:3)")
- 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 等")
- seed: Optional[int] = Field(default=None, description="随机种子,用于结果重现")
- safety_tolerance: int = Field(default=2, description="内容安全级别 (0-6)")
- output_format: str = Field(default="png", description="输出格式 jpeg 或 png")
- prompt_upsampling: bool = Field(default=False, description="是否增强提示词")
- image_url: Optional[str] = Field(default=None, description="上传的参考图 URL(开启编辑图生图)")
- mask_url: Optional[str] = Field(default=None, description="蒙版图 URL")
- class GenerateResponse(BaseModel):
- images: List[str]
- status: str
- @app.get("/health")
- def health() -> dict[str, str]:
- return {"status": "ok"}
- @app.post("/generate", response_model=GenerateResponse)
- def generate(req: GenerateRequest) -> dict[str, Any]:
- try:
- url = generate_flux_image(
- prompt=req.prompt,
- aspect_ratio=req.aspect_ratio,
- model=req.model,
- seed=req.seed,
- safety_tolerance=req.safety_tolerance,
- output_format=req.output_format,
- prompt_upsampling=req.prompt_upsampling,
- image_url=req.image_url,
- mask_url=req.mask_url
- )
- if url is None:
- raise HTTPException(status_code=500, detail="生成失败,未返回图像链接")
-
- return {"images": [url], "status": "success"}
- except Exception as e:
- raise HTTPException(status_code=500, detail=str(e))
- if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument("--port", type=int, default=8002)
- args = parser.parse_args()
- uvicorn.run(app, host="0.0.0.0", port=args.port)
|