@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user