feat(prompts): admin「提示词」页 —— 视频线 6 条生图/视频提示词正文+比例可在后台改,不再写死

诉求:生图/视频提示词全写死在代码里,产品方看不到也改不了(之前那版只做成「质量后缀」不是正文)。
现新增可编辑「提示词模板」体系,覆盖视频项目生产线 6 条:人物立绘 / 人物三视图 / 商品三视图 /
场景图 / 分镜图 / 视频。

后端:
- 新模型 PromptTemplate(key 固定 6 条 + template 正文 + ratio 比例 + enabled);迁移 0012/0013
  种入默认正文(= 各 builder 现写死文本,零回归)。
- render_prompt(key, default, **字段):读 DB 模板,留空/停用回落默认;安全替换 {占位符}(中文名),
  未知占位符原样保留(改错不致命)。prompt_ratio_size:比例→gpt-image 尺寸。
- 6 个 builder/调用点改走模板;5 条图比例可改(gpt-image 仅 1:1/竖/横),视频固定 Seedance 9:16。
  场景图新增可编辑「场景风格」包装(默认仅 {场景描述},零回归)。人物/分镜/视频原质量后缀并入模板。
- adminpanel CRUD:GET /prompt-templates、PATCH /<id>(改正文/比例/启用,key 不可改、不增删,带审计)。

前端:admin 新增「提示词」侧栏页(/admin/prompts):6 卡,每卡=占位符提示+正文文本框+比例按钮+
启用开关+保存。复用 .btn/.card-hard 共享类,仅 token 配色,单橙锚点。

验证:Django 套件 102 全绿(含新模型/API/生成侧立即生效 + 人物提示词改读模板);tsc+vite build 绿;
无头(独立 sqlite 栈)真开 /admin/prompts:6 卡齐、文本框/比例/占位符齐、0 控制台错误。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209
2026-06-23 03:19:07 +08:00
co-authored by Claude Opus 4.8
parent 304a083184
commit 9c2a3bc365
13 changed files with 485 additions and 64 deletions
@@ -0,0 +1,29 @@
# Generated by Django 5.1.15 on 2026-06-22 18:53
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ai', '0011_aitask_entity_extraction_type'),
]
operations = [
migrations.CreateModel(
name='PromptTemplate',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('key', models.CharField(choices=[('person_portrait', '人物立绘'), ('person_triview', '人物三视图'), ('product_triview', '商品三视图'), ('scene', '场景图'), ('storyboard_frame', '分镜图'), ('video_segment', '视频')], max_length=32, unique=True)),
('template', models.TextField(blank=True, default='')),
('ratio', models.CharField(blank=True, default='', max_length=12)),
('enabled', models.BooleanField(default=True)),
],
options={
'ordering': ['key'],
},
),
]
@@ -0,0 +1,60 @@
# 种入视频线 6 条提示词模板的默认值(= 各 builder 现在的写死文本,零回归)。
# 后台超管在 admin「提示词」页改正文/比例;留空或停用 → builder 回落写死默认。
from django.db import migrations
# key, 默认正文(含 {占位符}), 默认比例("portrait" 竖 / "landscape" 横)
SEED = [
(
"person_portrait",
"电商真人模特,氛围正面全身照,{描述},自然妆容,柔和影棚光,真实质感,单人,纯色背景",
"portrait",
),
(
"person_triview",
"参考图1角色,生成角色三视图,从左往右依次为:胸像特写,全身正面,全身侧面,全身背面,白色背景",
"landscape",
),
(
"product_triview",
"参考图1是「{商品}」的真实商品主图。请严格参照该图的包装外形、品牌文字、配色、Logo 与材质,"
"生成同一件商品的三视图:从左到右依次为正面、侧面、背面,统一光照,纯白背景,16:9 构图。"
"三个视图必须是同一件商品,品牌字样/配色/外形高度一致,不要改动或重新设计包装。{补充}",
"landscape",
),
(
"scene",
"{场景描述}",
"landscape",
),
(
"storyboard_frame",
"{设定}根据以下脚本生成一个导演故事板,用于指导 seedance 的视频生成。\n{场景上下文}\n"
"【分镜脚本】(本段时长约 {时长} 秒)\n{脚本}\n"
"请严格保持各参考图中角色的同一张脸、同一商品的外观与配色;"
"电商竖屏 9:16 导演故事板,一镜一图,画面清晰,可直接指导视频生成。{补充}",
"portrait",
),
(
"video_segment",
"{设定}{分镜}【脚本】{脚本}\n{时长}s · 9:16 竖屏电商带货短视频,镜头稳定,商品露出清晰,节奏有转化感。",
"portrait",
),
]
def seed(apps, schema_editor):
PromptTemplate = apps.get_model("ai", "PromptTemplate")
for key, template, ratio in SEED:
PromptTemplate.objects.update_or_create(
key=key, defaults={"template": template, "ratio": ratio, "enabled": True}
)
def unseed(apps, schema_editor):
PromptTemplate = apps.get_model("ai", "PromptTemplate")
PromptTemplate.objects.filter(key__in=[k for k, _, _ in SEED]).delete()
class Migration(migrations.Migration):
dependencies = [("ai", "0012_prompttemplate")]
operations = [migrations.RunPython(seed, unseed)]