解决已发现问题
This commit is contained in:
@@ -103,10 +103,32 @@ def _message_task(message: CreationMessage):
|
||||
@transaction.atomic
|
||||
def fail_generating_message(message: CreationMessage, error: str) -> CreationMessage:
|
||||
"""生成失败:GENERATING 原地改成 ERROR,不另开一条,避免中间态刷屏。"""
|
||||
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
|
||||
memory.pop("person_source_ready", None)
|
||||
conversation.memory = memory
|
||||
conversation.status = CreationConversation.Status.RUNNING
|
||||
conversation.agent_status = CreationConversation.AgentStatus.AWAITING_USER
|
||||
conversation.last_active_at = timezone.now()
|
||||
conversation.save(update_fields=[
|
||||
"memory", "status", "agent_status", "last_active_at", "updated_at",
|
||||
])
|
||||
append_message(
|
||||
conversation,
|
||||
role="assistant",
|
||||
text="这次人物参考没生成成功。可以重新选择人物来源。",
|
||||
payload={
|
||||
"reply_hint": "选择一种方式继续…",
|
||||
"reply_options": [{"label": "重新选择人物", "text": "重新选择人物来源"}],
|
||||
},
|
||||
)
|
||||
return message
|
||||
conversation.status = CreationConversation.Status.FAILED
|
||||
conversation.last_active_at = timezone.now()
|
||||
conversation.save(update_fields=["status", "last_active_at", "updated_at"])
|
||||
@@ -141,7 +163,13 @@ def sync_generating_message(message: CreationMessage) -> bool:
|
||||
finish_generating_message(message, assets=assets, meta=_meta_from_task(task, message))
|
||||
return True
|
||||
if task.status in (AITask.Status.FAILED, AITask.Status.CANCELLED):
|
||||
fail_generating_message(message, task.error_message or "生成失败")
|
||||
from .generation_errors import public_error_for_task
|
||||
|
||||
public_error = public_error_for_task(task)
|
||||
fail_generating_message(
|
||||
message,
|
||||
public_error.fallback_message if public_error else (task.error_message or "生成失败"),
|
||||
)
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -187,8 +215,12 @@ def _sync_segmented_video_message(message: CreationMessage) -> bool:
|
||||
None,
|
||||
)
|
||||
if failed is not None:
|
||||
from .generation_errors import public_error_for_task
|
||||
|
||||
number = next((index + 1 for index, task in enumerate(refreshed) if task.id == failed.id), 1)
|
||||
fail_generating_message(message, f"第 {number} 段生成失败:{failed.error_message or '请重试'}")
|
||||
public_error = public_error_for_task(failed, operation="video_generate")
|
||||
detail = public_error.fallback_message if public_error else (failed.error_message or "请重试")
|
||||
fail_generating_message(message, f"第 {number} 段生成失败:{detail}")
|
||||
return True
|
||||
assets: list[dict] = []
|
||||
completed_segments = 0
|
||||
@@ -397,10 +429,68 @@ def finish_generating_message(message: CreationMessage, *, assets: list[dict], m
|
||||
重生成是**新开一条** GENERATING → RESULT,所以对话流仍然是往下叠加;
|
||||
这里改的只是同一次生成自己的中间态。
|
||||
"""
|
||||
original_payload = dict(message.payload or {})
|
||||
is_person_reference = original_payload.get("kind") == "person_reference"
|
||||
message.kind = CreationMessage.Kind.RESULT
|
||||
message.payload = {**(message.payload or {}), **meta, "assets": assets}
|
||||
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
|
||||
|
||||
asset_id = str((assets[0] if assets else {}).get("id") or "")
|
||||
asset = Asset.objects.filter(
|
||||
id=asset_id,
|
||||
team=conversation.team,
|
||||
is_deleted=False,
|
||||
purged_at__isnull=True,
|
||||
).first()
|
||||
if asset is None:
|
||||
return fail_generating_message(message, "人物参考已生成,但未找到可锁定的图片资产")
|
||||
model = Model.objects.filter(
|
||||
team=conversation.team,
|
||||
portrait_asset=asset,
|
||||
is_deleted=False,
|
||||
purged_at__isnull=True,
|
||||
).first()
|
||||
if model is None:
|
||||
model = Model.objects.create(
|
||||
team=conversation.team,
|
||||
created_by=conversation.created_by,
|
||||
name="平台生成出镜人物",
|
||||
source=Model.Source.AI,
|
||||
portrait_asset=asset,
|
||||
description="由全能创作生成并锁定的视频出镜人物。",
|
||||
metadata={"feature": "omni_create", "conversation_id": str(conversation.id)},
|
||||
)
|
||||
pin_refs(conversation, [{
|
||||
"type": "model",
|
||||
"id": str(model.id),
|
||||
"name": model.name,
|
||||
"cover": (assets[0] if assets else {}).get("cover") or (assets[0] if assets else {}).get("url") or "",
|
||||
}])
|
||||
memory = dict(conversation.memory or {})
|
||||
memory["person_source"] = "platform_generate"
|
||||
memory["person_source_pending"] = False
|
||||
memory["person_source_ready"] = True
|
||||
memory["person_model_id"] = str(model.id)
|
||||
conversation.memory = memory
|
||||
conversation.status = CreationConversation.Status.RUNNING
|
||||
conversation.agent_status = CreationConversation.AgentStatus.AWAITING_USER
|
||||
conversation.last_active_at = timezone.now()
|
||||
conversation.save(update_fields=[
|
||||
"memory", "status", "agent_status", "last_active_at", "updated_at",
|
||||
])
|
||||
append_message(
|
||||
conversation,
|
||||
role="assistant",
|
||||
text="人物参考已生成并锁定。后续所有镜头和长视频分段都会使用这位人物。",
|
||||
payload={
|
||||
"reply_hint": "继续创作…",
|
||||
"reply_options": [{"label": "继续创作", "text": "继续创作"}],
|
||||
},
|
||||
)
|
||||
return message
|
||||
conversation.status = CreationConversation.Status.COMPLETED
|
||||
conversation.last_active_at = timezone.now()
|
||||
conversation.save(update_fields=["status", "last_active_at", "updated_at"])
|
||||
|
||||
Reference in New Issue
Block a user