diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index 14271c6..c3332b6 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -1,9 +1,12 @@ import json import logging +import httpx +import requests from fastapi import APIRouter, BackgroundTasks, HTTPException -from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel +from app.core.config import settings +from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel, Flux2ToProductImgModel, GenerateSloganImageModel, GenerateImageFlux2KleinModel from app.schemas.pose_transform import BatchPoseTransformModel from app.schemas.response_template import ResponseModel from app.service.generate_batch_image.service import start_product_batch_generate, start_relight_batch_generate, start_pose_transform_batch_generate @@ -20,6 +23,57 @@ logger = logging.getLogger() '''generate image''' +# flux2 klein +@router.post("/generate_image_flux2_klein") +async def generate_image_flux2_klein(request_item: GenerateImageFlux2KleinModel): + """ + 创建一个具有以下参数的请求体: + - **bucket_name**: OSS桶名 (必填) + - **object_name**: OSS对象名(文件路径)(必填) + + - **width**: 图片宽度,默认1024像素 (非必填,1024) + - **height**: 图片高度,默认1024像素 (非必填,默认1024) + - **prompt**: 文本提示词,用于模型推理等场景 (非必填,默认"") + - **steps**: 推理步数,控制模型生成过程的迭代次数 (非必填,默认4) + - **guidance**: 引导系数,调节提示词对生成结果的影响程度 (非必填,默认 4.0 ) + + ### 示例参数: + ``` + { + "bucket_name": "aida-users", + "object_name": "89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png", + "prompt": "a single item of sketch of dress, 4k, white background" + } + ``` + ### 输出示例: + ``` + { + "code": 200, + "msg": "OK!", + "data": { + "output_path": "aida-users/89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png" + } + } + ``` + """ + try: + logger.info(f"generate_image_flux2_gen_img request: {json.dumps(request_item.model_dump(), indent=4)}") + async with httpx.AsyncClient(timeout=120) as client: + resp = await client.post( + f"http://{settings.FLUX2_GEN_IMG_MODEL_URL}/predict", + json=request_item.model_dump(), + ) + result = resp.json() + + logger.info(f"generate_image_flux2_gen_img response: {json.dumps(result, indent=4)}") + return ResponseModel(data=result) + + except Exception as e: + logger.warning(f"generate_image_flux2_gen_img Run Exception @@@@@@:{e}") + raise HTTPException(status_code=404, detail=str(e)) + + +# sdxl @router.post("/generate_image") def generate_image(request_item: GenerateImageModel, background_tasks: BackgroundTasks): """ @@ -154,6 +208,62 @@ def generate_single_logo_image(tasks_id: str): return ResponseModel(data=data['data']) +"""slogan """ + + +@router.post("/generate_slogan") +async def generate_slogan(request_data: GenerateSloganImageModel): + """ + ### 请求体示例: + ```json + { + "num_point": 16, + "image_url": "aida-slogan/6886785f-0aac-4052-b6fd-7ae20a841d8d.png", + "prompt": "123", + "tasks_id": "string-89" + } + ``` + """ + try: + logger.info(f"generate_slogan request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") + data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10020/api/slogan", json=request_data.dict()) + logger.info(f"generate_slogan response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") + return ResponseModel(data=json.loads(data.content)) + except Exception as e: + logger.warning(f"generate_slogan Run Exception @@@@@@:{e}") + + +"""product image flux2.0""" + +# @router.post("/img_to_product") +# async def img_to_product(request_data: Flux2ToProductImgModel): +# """ +# 创建一个具有以下参数的请求体: +# - **tasks_id**: 任务id 用于取消生成任务和获取生成结果 +# - **prompt**: 想要生成图片的描述词 +# - **image_path**: 被生成图片的S3或minio url地址 +# - **infer_step**: 推理步数 +# +# ### 请求体示例: +# ```json +# point +# { +# "prompt": "Create realistic studio photo with real people model standing and wearing this garment, in white studio, Keep original model if present, or generate appropriate model, Standing pose, facing camera.", +# "image_path":"aida-results/result_38151e0a-f83b-11f0-89f6-0242ac130002.png", +# "infer_step":4, +# "tasks_id":"123456-123" +# } +# ``` +# """ +# try: +# logger.info(f"img_to_product request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") +# data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10090/api/v1/to_product", json=request_data.dict()) +# logger.info(f"img_to_product response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") +# return ResponseModel(data=json.loads(data.content)) +# except Exception as e: +# logger.warning(f"img_to_product Run Exception @@@@@@:{e}") + + '''product image''' @@ -178,7 +288,7 @@ def generate_product_image(request_item: GenerateProductImageModel, background_t } """ try: - logger.info(f"generate_product_image request item is : @@@@@@:{json.dumps(request_item.dict(),indent=4)}") + logger.info(f"generate_product_image request item is : @@@@@@:{json.dumps(request_item.dict(), indent=4)}") service = GenerateProductImage(request_item) background_tasks.add_task(service.get_result) except Exception as e: diff --git a/app/core/config.py b/app/core/config.py index 08f2b67..1210e4c 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -64,6 +64,9 @@ class Settings(BaseSettings): # --- Design Callback Java 接口 --- JAVA_STREAM_API_URL: str = Field(default='', description="") + # --- flux2 klein model url --- + FLUX2_GEN_IMG_MODEL_URL: str = Field(default='', description="") + # --- 服务器IP --- A6000_SERVICE_HOST: str = Field(default='', description="") B_4_X_4090_SERVICE_HOST: str = Field(default='', description="") diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index 5062d78..e86b160 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -1,6 +1,6 @@ -from typing import List +from typing import List, Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class GenerateMultiViewModel(BaseModel): @@ -8,8 +8,20 @@ class GenerateMultiViewModel(BaseModel): image_url: str +class GenerateImageFlux2KleinModel(BaseModel): + bucket_name: str = Field(..., description="OSS桶名,不传则为None") + object_name: str = Field(..., description="OSS对象名(文件路径),不传则为None") + # input_image_paths: Optional[List[str]] = Field(default=[], description="输入图片路径列表") + width: Optional[int] = Field(default=1024, description="图片宽度,默认512像素") + height: Optional[int] = Field(default=1024, description="图片高度,默认512像素") + prompt: Optional[str] = Field(default="", description="文本提示词,用于模型推理等场景") + steps: Optional[int] = Field(default=4, description="推理步数,控制模型生成过程的迭代次数") + guidance: Optional[float] = Field(default=4.0, description="引导系数,调节提示词对生成结果的影响程度") + + class GenerateImageModel(BaseModel): - tasks_id: str + bucket_name: str + object_name: str prompt: str image_url: str mode: str