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:
co-authored by
Claude Opus 4.8
parent
304a083184
commit
9c2a3bc365
@@ -3,7 +3,7 @@ from decimal import Decimal
|
||||
from rest_framework import serializers
|
||||
|
||||
from apps.accounts.models import Team, TeamMember, User
|
||||
from apps.ai.models import AITask, ModelConfig, ModelProvider, QualityWord
|
||||
from apps.ai.models import AITask, ModelConfig, ModelProvider, PromptTemplate, QualityWord
|
||||
from apps.assets.models import Asset
|
||||
from apps.billing.models import CreditLedger, QuotaPolicy
|
||||
from apps.projects.models import Project
|
||||
@@ -25,6 +25,30 @@ class QualityWordSerializer(serializers.ModelSerializer):
|
||||
read_only_fields = ["id", "created_at"]
|
||||
|
||||
|
||||
# 每条提示词可用的 {占位符}(给 admin 提示;运行时由对应 builder 注入,改错会原样保留不致命)
|
||||
PROMPT_PLACEHOLDERS = {
|
||||
"person_portrait": ["描述"],
|
||||
"person_triview": [],
|
||||
"product_triview": ["商品", "补充"],
|
||||
"scene": ["场景描述"],
|
||||
"storyboard_frame": ["设定", "场景上下文", "时长", "脚本", "补充"],
|
||||
"video_segment": ["设定", "分镜", "脚本", "时长"],
|
||||
}
|
||||
|
||||
|
||||
class PromptTemplateSerializer(serializers.ModelSerializer):
|
||||
label = serializers.CharField(source="get_key_display", read_only=True)
|
||||
placeholders = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = PromptTemplate
|
||||
fields = ["id", "key", "label", "template", "ratio", "enabled", "placeholders", "updated_at"]
|
||||
read_only_fields = ["id", "key", "label", "placeholders", "updated_at"] # key 固定,只改正文/比例/启用
|
||||
|
||||
def get_placeholders(self, obj) -> list:
|
||||
return PROMPT_PLACEHOLDERS.get(obj.key, [])
|
||||
|
||||
|
||||
class AdminReviewAssetSerializer(serializers.ModelSerializer):
|
||||
"""跨团队人像审核队列行:复用 AssetFileSerializer 的首图 preview_url。"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user