解决已发现问题

This commit is contained in:
Azmat@qq.com
2026-09-17 15:00:15 +08:00
parent f3c49b36be
commit 5df038c635
24 changed files with 1913 additions and 94 deletions
+93 -3
View File
@@ -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"])