生图模型可选(火山/gpt-image)+ 模特上身图提示词强化 + 多会话等改动
本轮(生图模型选择 + 火山接入): - 工作室新增「生图模型」选择器(模特上身图/平台套图头部 chip + 图片创作底部 Pill), 默认火山 Seedream,可切 gpt-image-2;选择写入 localStorage,下次进页面读回 - 后端 resolve_image_model 解析所选模型;enqueue_standalone_images 接 image_model - worker 按模型能力分流:有 image_edit(gpt-image)走多图编辑;无(火山)走 image_generation(image=参考图);新增 _ratio_to_volcano_size 让火山按比例出图 → 内衣等敏感品类用火山可绕开 gpt-image 的 sexual 内容审核 模特上身图提示词: - 穿戴/非穿戴分流、按 index 变化动作场景镜头、负面词尾接、多图参考序号自适应 - _product_reference_urls:商品参考真实上传图优先、排除 AI 生成图、可多张 其他(并入此前各会话未提交改动): - 图片创作多会话(ImageConversation + migration 0019)、任务中心按类型过滤 - accounts/projects/assets/team/auth 等零散调整、相关测试 - 测试脚本(tryon_*.py)、测试清单(core/bug/*.xlsx)
This commit is contained in:
@@ -53,6 +53,38 @@ class ModelConfig(TimeStampedModel):
|
||||
return f"{self.provider.name}:{self.name}:{self.capability}"
|
||||
|
||||
|
||||
class ImageConversation(TeamOwnedModel):
|
||||
"""图片创作工作室的「对话」实体:一条对话 = 一个生图会话线程,把多次生成(AITask)串起来。
|
||||
左栏会话列表、切换、重命名、历史都基于本表。删除走软删(is_deleted),不连带删图——
|
||||
成图仍在资产库里。mode 区分图片创作 / 模特上身图 / 平台套图三种工作台。"""
|
||||
|
||||
class Mode(models.TextChoices):
|
||||
IMAGE = "image", "图片创作"
|
||||
MODEL = "model", "模特上身图"
|
||||
COVER = "cover", "平台套图"
|
||||
|
||||
title = models.CharField(max_length=120, default="默认创作")
|
||||
mode = models.CharField(max_length=16, choices=Mode.choices, default=Mode.IMAGE)
|
||||
product = models.ForeignKey(
|
||||
"products.Product",
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="image_conversations",
|
||||
)
|
||||
is_deleted = models.BooleanField(default=False)
|
||||
# 每次在该对话里发起生成都刷新,左栏「最近」按它倒序
|
||||
last_active_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
indexes = [
|
||||
models.Index(fields=["team", "mode", "-last_active_at"]),
|
||||
]
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"conv:{self.mode}:{self.title}"
|
||||
|
||||
|
||||
class AITask(TeamOwnedModel):
|
||||
class Type(models.TextChoices):
|
||||
SCRIPT_GENERATION = "script_generation", "Script Generation"
|
||||
@@ -84,6 +116,14 @@ class AITask(TeamOwnedModel):
|
||||
blank=True,
|
||||
related_name="ai_tasks",
|
||||
)
|
||||
# 图片创作工作室的对话归属(独立生图任务才挂;流水线内部任务为空)。删对话不删任务。
|
||||
conversation = models.ForeignKey(
|
||||
ImageConversation,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="tasks",
|
||||
)
|
||||
task_type = models.CharField(max_length=48, choices=Type.choices)
|
||||
status = models.CharField(max_length=32, choices=Status.choices, default=Status.CREATED)
|
||||
model_config = models.ForeignKey(ModelConfig, on_delete=models.PROTECT, related_name="tasks")
|
||||
@@ -105,6 +145,8 @@ class AITask(TeamOwnedModel):
|
||||
models.Index(fields=["provider_task_id"]),
|
||||
# 任务历史默认按团队 + 创建时间倒序(AI 工具页 / asset-factory)
|
||||
models.Index(fields=["team", "-created_at"]),
|
||||
# 按对话拉历史(图片创作工作室切换会话时回填批次)
|
||||
models.Index(fields=["conversation", "created_at"]),
|
||||
]
|
||||
|
||||
def __str__(self) -> str:
|
||||
|
||||
Reference in New Issue
Block a user