生图模型可选(火山/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:
@@ -1,6 +1,6 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from .models import AITask, ModelConfig, ModelProvider
|
||||
from .models import AITask, ImageConversation, ModelConfig, ModelProvider
|
||||
|
||||
|
||||
class ModelProviderSerializer(serializers.ModelSerializer):
|
||||
@@ -19,8 +19,34 @@ class ModelConfigSerializer(serializers.ModelSerializer):
|
||||
read_only_fields = fields
|
||||
|
||||
|
||||
class ImageConversationSerializer(serializers.ModelSerializer):
|
||||
"""图片创作对话:左栏列表用。title 可写(重命名),mode/product 创建时可指定。"""
|
||||
|
||||
task_count = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = ImageConversation
|
||||
fields = ["id", "title", "mode", "product", "task_count", "last_active_at", "created_at", "updated_at"]
|
||||
read_only_fields = ["id", "task_count", "last_active_at", "created_at", "updated_at"]
|
||||
|
||||
def get_task_count(self, obj) -> int:
|
||||
# list 接口已 annotate;无 annotate 时回落实时 count(详情/创建场景)
|
||||
cached = getattr(obj, "_task_count", None)
|
||||
return cached if cached is not None else obj.tasks.count()
|
||||
|
||||
|
||||
class AITaskSerializer(serializers.ModelSerializer):
|
||||
model_config = ModelConfigSerializer(read_only=True)
|
||||
# 从 request_payload 抽出的分组/标签信息(由 AITaskViewSet annotate 提供;其它调用处无此注解则为 None)。
|
||||
# 不直接读 obj.request_payload —— 那列已 defer,读了会触发懒加载把几 MB payload 整列拉回。
|
||||
batch_id = serializers.SerializerMethodField()
|
||||
mode = serializers.SerializerMethodField()
|
||||
|
||||
def get_batch_id(self, obj):
|
||||
return getattr(obj, "rp_batch_id", None)
|
||||
|
||||
def get_mode(self, obj):
|
||||
return getattr(obj, "rp_mode", None)
|
||||
|
||||
class Meta:
|
||||
model = AITask
|
||||
@@ -28,6 +54,8 @@ class AITaskSerializer(serializers.ModelSerializer):
|
||||
"id",
|
||||
"project",
|
||||
"task_type",
|
||||
"batch_id",
|
||||
"mode",
|
||||
"status",
|
||||
"model_config",
|
||||
"provider_task_id",
|
||||
@@ -40,5 +68,6 @@ class AITaskSerializer(serializers.ModelSerializer):
|
||||
"created_at",
|
||||
"updated_at",
|
||||
]
|
||||
read_only_fields = fields
|
||||
# batch_id / mode 是显式声明的 SerializerMethodField(本就只读),不能再列进 read_only_fields(DRF 会报错)
|
||||
read_only_fields = [f for f in fields if f not in ("batch_id", "mode")]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user