优化脚本

This commit is contained in:
Azmat@qq.com
2026-08-21 10:28:35 +08:00
parent 6c588a7fee
commit c2d3a786a3
23 changed files with 1461 additions and 287 deletions
+8 -5
View File
@@ -518,14 +518,13 @@ class ProjectViewSet(TeamScopedViewSetMixin, ModelViewSet):
@action(detail=True, methods=["post"], url_path="script-agent-stream", renderer_classes=[ServerSentEventRenderer])
def script_agent_stream(self, request, pk=None):
"""对话式脚本 agent · 流式(SSE)。出稿 + 改稿一体,多模型可选。
请求体:mode(auto|theme|revise)、prompt、model_config_id、selling_point_ids、
base_version_id(改稿)、aspect_ratio、total_duration(5-60,5 秒步进)、
请求体:mode(auto|theme|revise)、prompt、model_config_id、selling_point_ids、persona、
base_version_id(改稿)、aspect_ratio、total_duration(15/30/45/60)、
presentation_format(oral|drama|vlog)、video_structure(pain|contrast|review|scene)。
响应:text/event-stream,逐帧吐 tool/delta/draft/saved/done/error。"""
project = self.get_object()
mode = str(request.data.get("mode") or "auto")
prompt = str(request.data.get("prompt") or "")
selling_point_ids = request.data.get("selling_point_ids") or []
base_version_id = request.data.get("base_version_id") or None
aspect_ratio = str(request.data.get("aspect_ratio") or "9:16")
# 非法值一律由 agent 侧 coerce 兜底(夹区间/回落默认),这里不做 400,避免生成被参数噪声打断
@@ -534,6 +533,9 @@ class ProjectViewSet(TeamScopedViewSetMixin, ModelViewSet):
request.data.get("presentation_format"),
request.data.get("video_structure"),
)
wizard = ((project.metadata or {}).get("wizard") if isinstance(project.metadata, dict) else None) or {}
selling_point_ids = request.data.get("selling_point_ids") or wizard.get("selling_point_ids") or []
persona = str(request.data.get("persona") or wizard.get("persona") or "")
target_index = request.data.get("target_index")
try:
target_index = int(target_index) if target_index is not None else None
@@ -568,6 +570,7 @@ class ProjectViewSet(TeamScopedViewSetMixin, ModelViewSet):
video_structure=video_structure,
target_index=target_index,
entry_source=str(request.data.get("source") or ""),
persona=persona,
)
response = StreamingHttpResponse(stream, content_type="text/event-stream")
response["Cache-Control"] = "no-cache"
@@ -894,8 +897,8 @@ class ProjectViewSet(TeamScopedViewSetMixin, ModelViewSet):
"""采用版分镜数变化时,同步 VideoSegment 的**数量和时长**:不足则尾部补 NOT_STARTED,
多出且尾部是「从未生成过」的段则裁掉(已生成的段绝不动)。
时长同步是二期补的:脚本镜可以不等长了,而出片、计价、时间线读的都是
VideoSegment.target_duration_seconds。不同步的话脚本写了 8 秒、出片仍按 15 秒跑。
时长同步:脚本镜主流程固定 15 秒,而出片、计价、时间线读的都是
VideoSegment.target_duration_seconds。不同步的话脚本写了 15 秒、出片仍按旧默认跑。
已出片的段不改时长——改了会跟已渲染的成片对不上。"""
if not script.is_adopted:
return