feat(ai): 升级AI生图模型及多视角一致性支持
- 将默认AI生图模型升级为flux-dev及seedream-5.0版本 - SiliconFlow模型由FLUX.1-dev切换为Kolors,优化调用参数和返回值 - 火山引擎Seedream升级至5.0 lite版本,支持多视角参考图传入 - 设计图片字段由字符串改为Text扩展URL长度限制 - 设计图下载支持远程URL重定向和本地文件兼容 - 生成AI图片时多视角保持风格一致,SiliconFlow复用seed,Seedream传参考图 - 后台配置界面更改模型名称及价格显示,新增API Key状态检测 - 前端照片下载从链接改为按钮,远程文件新窗口打开 - 设计相关接口支持较长请求超时,下载走API路径无/api前缀 - 前端页面兼容驼峰与下划线格式URL参数识别 - 用户中心设计图下载支持本地文件Token授权下载 - 初始化数据库新增完整表结构与约束,适配新版设计业务逻辑
This commit is contained in:
@@ -19,11 +19,13 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _has_ai_key() -> bool:
|
||||
"""检查是否配置了 AI API Key"""
|
||||
model = settings.AI_IMAGE_MODEL
|
||||
if model == "seedream-4.5":
|
||||
return bool(settings.VOLCENGINE_API_KEY)
|
||||
return bool(settings.SILICONFLOW_API_KEY)
|
||||
"""检查是否配置了 AI API Key(从数据库配置优先读取)"""
|
||||
from .config_service import get_ai_config
|
||||
ai_config = get_ai_config()
|
||||
model = ai_config.get("AI_IMAGE_MODEL", "flux-dev")
|
||||
if model in ("seedream-5.0", "seedream-4.5"):
|
||||
return bool(ai_config.get("VOLCENGINE_API_KEY"))
|
||||
return bool(ai_config.get("SILICONFLOW_API_KEY"))
|
||||
|
||||
|
||||
async def create_design_async(db: Session, user_id: int, design_data: DesignCreate) -> Design:
|
||||
@@ -115,9 +117,19 @@ async def _generate_ai_images(
|
||||
color,
|
||||
design_data: DesignCreate,
|
||||
) -> None:
|
||||
"""使用 AI 模型为每个视角生成图片"""
|
||||
"""使用 AI 模型为每个视角生成图片
|
||||
|
||||
多视角一致性策略:
|
||||
- SiliconFlow Kolors: 通过复用 seed 保持一致
|
||||
- Seedream 5.0 lite: 通过参考图(image参数)保持一致
|
||||
"""
|
||||
views = get_views_for_category(category.name)
|
||||
model = settings.AI_IMAGE_MODEL
|
||||
from .config_service import get_ai_config
|
||||
ai_config = get_ai_config()
|
||||
model = ai_config.get("AI_IMAGE_MODEL", "flux-dev")
|
||||
|
||||
shared_seed = None # Kolors 用: 第一张图的 seed
|
||||
first_remote_url = None # Seedream 用: 第一张图的远程 URL 作为参考图
|
||||
|
||||
for idx, view_name in enumerate(views):
|
||||
# 构建 prompt
|
||||
@@ -136,19 +148,27 @@ async def _generate_ai_images(
|
||||
)
|
||||
|
||||
# 调用 AI 生图
|
||||
remote_url = await ai_generator.generate_image(prompt_text, model)
|
||||
|
||||
# 下载保存到本地
|
||||
save_path = os.path.join(
|
||||
settings.UPLOAD_DIR, "designs", f"{design.id}_{view_name}.png"
|
||||
# 后续视角传入 seed(Kolors)或参考图 URL(Seedream)保持一致性
|
||||
ref_url = first_remote_url if idx > 0 else None
|
||||
remote_url, returned_seed = await ai_generator.generate_image(
|
||||
prompt_text, model, seed=shared_seed, ref_image_url=ref_url
|
||||
)
|
||||
local_url = await ai_generator.download_and_save(remote_url, save_path)
|
||||
|
||||
# 第一张图保存信息供后续视角复用
|
||||
if idx == 0:
|
||||
first_remote_url = remote_url
|
||||
if returned_seed is not None:
|
||||
shared_seed = returned_seed
|
||||
logger.info(f"多视角生图: seed={shared_seed}, ref_url={remote_url[:60]}...")
|
||||
|
||||
# 直接使用远程 URL,不下载到本地(节省服务器存储空间)
|
||||
image_url = remote_url
|
||||
|
||||
# 创建 DesignImage 记录
|
||||
design_image = DesignImage(
|
||||
design_id=design.id,
|
||||
view_name=view_name,
|
||||
image_url=local_url,
|
||||
image_url=image_url,
|
||||
model_used=model,
|
||||
prompt_used=prompt_text,
|
||||
sort_order=idx,
|
||||
@@ -157,7 +177,7 @@ async def _generate_ai_images(
|
||||
|
||||
# 第一张图(效果图)存入 design.image_url 兼容旧逻辑
|
||||
if idx == 0:
|
||||
design.image_url = local_url
|
||||
design.image_url = image_url
|
||||
|
||||
design.status = "completed"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user