| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import os
- import sys
- import re
- from typing import Optional
- from fastapi import FastAPI, HTTPException
- from pydantic import BaseModel, Field
- from dotenv import load_dotenv
- from openai import OpenAI
- # 加载环境变量
- load_dotenv()
- app = FastAPI(title="GPT Image 2 API", version="1.0.0")
- # 初始化 OpenAI 客户端,使用 apiyi 平台
- api_key = os.getenv("APIYI_KEY")
- if not api_key:
- raise ValueError("APIYI_KEY environment variable is required")
- client = OpenAI(
- api_key=api_key,
- base_url="https://api.apiyi.com/v1"
- )
- def extract_url_from_content(text: str) -> Optional[str]:
- """从 API 返回内容中提取图片 URL(可能是 markdown 格式)"""
- # 匹配  或  格式
- match = re.search(r'!\[.*?\]\((https?://[^\)]+)\)', text)
- if match:
- return match.group(1)
- # 如果不是 markdown 格式,尝试直接作为 URL
- stripped = text.strip()
- if stripped.startswith("http"):
- return stripped
- return None
- class ImageRequest(BaseModel):
- prompt: str = Field(..., description="图像生成提示词,可包含尺寸描述如'1024x1024 方图'")
- class ImageResponse(BaseModel):
- status: str
- image_url: Optional[str] = None
- error: Optional[str] = None
- @app.post("/generate", response_model=ImageResponse)
- async def generate_image(request: ImageRequest):
- """生成图像 - 使用 gpt-image-2-all 模型"""
- try:
- # 使用 chat/completions 接口调用 gpt-image-2-all
- response = client.chat.completions.create(
- model="gpt-image-2-all",
- messages=[
- {"role": "user", "content": request.prompt}
- ],
- extra_body={"response_format": {"type": "url"}}
- )
- if response.choices and len(response.choices) > 0:
- content = response.choices[0].message.content
- image_url = extract_url_from_content(content)
- if image_url:
- return ImageResponse(status="success", image_url=image_url)
- else:
- return ImageResponse(
- status="error",
- error=f"Could not extract URL from response: {content}"
- )
- else:
- return ImageResponse(status="error", error="No content returned from API")
- except Exception as e:
- return ImageResponse(status="error", error=str(e))
- @app.get("/health")
- async def health_check():
- return {"status": "ok", "service": "gpt-image-2"}
- if __name__ == "__main__":
- import uvicorn
- port = 5000
- if "--port" in sys.argv:
- try:
- port_idx = sys.argv.index("--port")
- port = int(sys.argv[port_idx + 1])
- except (IndexError, ValueError):
- pass
- uvicorn.run(app, host="0.0.0.0", port=port)
|