优化全能创作
Deploy dev / deploy (push) Successful in 44s

This commit is contained in:
Azmat@qq.com
2026-09-29 18:11:24 +08:00
parent c687ec4bbd
commit fa94051381
14 changed files with 669 additions and 183 deletions
+21 -7
View File
@@ -83,7 +83,7 @@ def _meta_from_task(task, message: CreationMessage) -> dict:
model = task.model_config.display_name or task.model_config.name
return {
"model": model or payload.get("model") or req.get("model") or "",
"ratio": req.get("ratio") or payload.get("ratio") or "",
"ratio": req.get("aspect_ratio") or req.get("ratio") or payload.get("ratio") or "",
"prompt": payload.get("prompt") or req.get("prompt") or "",
}
@@ -103,11 +103,15 @@ def _message_task(message: CreationMessage):
@transaction.atomic
def fail_generating_message(message: CreationMessage, error: str) -> CreationMessage:
"""生成失败:GENERATING 原地改成 ERROR,不另开一条,避免中间态刷屏。"""
# worker 与会话轮询可能同时回填同一条消息;先锁会话再锁消息,和 append_message 的锁顺序一致。
conversation = CreationConversation.objects.select_for_update().get(pk=message.conversation_id)
message = CreationMessage.objects.select_for_update().get(pk=message.pk)
if message.kind != CreationMessage.Kind.GENERATING:
return message
is_person_reference = (message.payload or {}).get("kind") == "person_reference"
message.kind = CreationMessage.Kind.ERROR
message.text = (error or "生成失败")[:500]
message.save(update_fields=["kind", "text", "updated_at"])
conversation = message.conversation
if is_person_reference:
memory = dict(conversation.memory or {})
memory["person_source_pending"] = False
@@ -443,6 +447,7 @@ def start_segmented_video_merge(*, conversation: CreationConversation, message:
"source_message_id": str(message.id),
"source_task_ids": task_ids,
"prompt": payload.get("prompt") or "",
"aspect_ratio": payload.get("ratio") or (source_tasks[0].request_payload or {}).get("aspect_ratio") or "",
},
)
payload["merge_state"] = "queued"
@@ -453,7 +458,11 @@ def start_segmented_video_merge(*, conversation: CreationConversation, message:
conversation,
role="assistant",
kind=CreationMessage.Kind.GENERATING,
payload={"task_id": str(merge_task.id), "kind": "video_merge", "prompt": payload.get("prompt") or ""},
payload={
"task_id": str(merge_task.id), "kind": "video_merge",
"prompt": payload.get("prompt") or "",
"ratio": payload.get("ratio") or (source_tasks[0].request_payload or {}).get("aspect_ratio") or "",
},
task=merge_task,
)
return merge_task, generating
@@ -573,12 +582,13 @@ def finish_generating_message(message: CreationMessage, *, assets: list[dict], m
重生成是**新开一条** GENERATING → RESULT,所以对话流仍然是往下叠加;
这里改的只是同一次生成自己的中间态。
"""
# select_for_update 后重读状态:第二个回填者不能凭旧 GENERATING 对象再发一次确认。
conversation = CreationConversation.objects.select_for_update().get(pk=message.conversation_id)
message = CreationMessage.objects.select_for_update().get(pk=message.pk)
if message.kind != CreationMessage.Kind.GENERATING:
return message
original_payload = dict(message.payload or {})
is_person_reference = original_payload.get("kind") == "person_reference"
message.kind = CreationMessage.Kind.RESULT
message.payload = {**original_payload, **meta, "assets": assets}
message.save(update_fields=["kind", "payload", "updated_at"])
conversation = message.conversation
if is_person_reference:
from apps.assets.models import Asset, Model
@@ -591,6 +601,10 @@ def finish_generating_message(message: CreationMessage, *, assets: list[dict], m
).first()
if asset is None:
return fail_generating_message(message, "人物参考已生成,但未找到可锁定的图片资产")
message.kind = CreationMessage.Kind.RESULT
message.payload = {**original_payload, **meta, "assets": assets}
message.save(update_fields=["kind", "payload", "updated_at"])
if is_person_reference:
cast_index = int(original_payload.get("cast_index") or 1)
cast_total = int(original_payload.get("cast_total") or 1)
cast_model_name = str(original_payload.get("cast_model_name") or "").strip()