fix(viral-video): 修复新一轮任务开始时上一轮错误残留显示+错误阶段关键词兜底归因
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m53s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 41s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m6s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m49s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 15s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m36s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 44s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 7m59s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 16m3s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 20m12s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 1h8m6s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 2s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m53s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 41s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m6s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m49s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 15s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m36s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 44s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 7m59s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 16m3s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 20m12s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 1h8m6s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 2s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
- handleAnalyzeImages开始新分析时清空analysisError/copyError/videoError/imageAnalysis/storyboard - handleGenerateCopy/handleGenerateVideo进入对应阶段时清空其他阶段错误 - handleRetry重试时清空旧imageAnalysis/storyboard产物 - onPollUpdate failed分支+activeError派生加关键词兜底(Wan/Seedance/VLM/OCR等),防止current_stage丢失时错误归到文案 - 解决BUG:用户只上传图片没点生成文案时,STEP3区域显示上一次的「视频生成失败:Wan 3.0…」
This commit is contained in:
@@ -712,16 +712,23 @@ const ViralVideoPage: React.FC = () => {
|
||||
}
|
||||
nextStep = "failed"
|
||||
// 根据 current_stage 正确归因错误(图片/文案/视频错误独立显示)
|
||||
if (isVideoStage(stage)) {
|
||||
// 兜底:若 stage 丢失但错误消息含视频生成相关关键词,归为视频错误
|
||||
const looksLikeVideoErr =
|
||||
/wan 3\.0|seedance|视频生成|视频下载|视频渲染|tts|配音|render/i.test(err || "")
|
||||
const looksLikeImageErr =
|
||||
/vlm|图片分析|vision|商品识别|ocr|image analysis|图片识别/i.test(err || "")
|
||||
if (isVideoStage(stage) || (!isImageAnalysisStage(stage) && !isCopyStage(stage) && looksLikeVideoErr)) {
|
||||
videoError = err || videoError || "视频生成失败"
|
||||
copyError = undefined
|
||||
} else if (isImageAnalysisStage(stage)) {
|
||||
analysisError = undefined
|
||||
} else if (isImageAnalysisStage(stage) || looksLikeImageErr) {
|
||||
analysisError = err || analysisError || "图片分析失败"
|
||||
copyError = undefined
|
||||
videoError = undefined
|
||||
} else {
|
||||
copyError = err || copyError || "文案生成失败"
|
||||
videoError = undefined
|
||||
analysisError = undefined
|
||||
}
|
||||
break
|
||||
}
|
||||
@@ -1129,7 +1136,17 @@ const ViralVideoPage: React.FC = () => {
|
||||
message.warning("参考视频上传中,请稍候")
|
||||
return
|
||||
}
|
||||
setTask({ uiStep: "step1_analyzing", jobId: null, job: null })
|
||||
// 开始新一轮图片分析:清空所有错误状态+旧产物,避免上一轮失败的错误残留显示
|
||||
setTask({
|
||||
uiStep: "step1_analyzing",
|
||||
jobId: null,
|
||||
job: null,
|
||||
analysisError: undefined,
|
||||
copyError: undefined,
|
||||
videoError: undefined,
|
||||
imageAnalysis: undefined,
|
||||
storyboard: undefined,
|
||||
})
|
||||
try {
|
||||
const job = await analyzeViralImages({
|
||||
images: readyImgs.map((i) => i.ossUrl as string),
|
||||
@@ -1157,7 +1174,7 @@ const ViralVideoPage: React.FC = () => {
|
||||
message.warning("请先完成图片分析")
|
||||
return
|
||||
}
|
||||
setTask({ uiStep: "step2_generating", copyError: undefined })
|
||||
setTask({ uiStep: "step2_generating", copyError: undefined, videoError: undefined, analysisError: undefined })
|
||||
try {
|
||||
const job = await generateViralCopy(task.jobId, {
|
||||
industry: task.industry || undefined,
|
||||
@@ -1201,7 +1218,7 @@ const ViralVideoPage: React.FC = () => {
|
||||
* - 若 job 已在 copy_generated/image_analyzed 且文案已确认:重新调 confirm-copy
|
||||
* - 其他情况:回退到旧的 /generate 全量提交(兼容旧任务/降级) */
|
||||
const handleGenerateVideo = async () => {
|
||||
setTask({ uiStep: "step3_generating", videoError: undefined })
|
||||
setTask({ uiStep: "step3_generating", videoError: undefined, copyError: undefined, analysisError: undefined })
|
||||
try {
|
||||
let job
|
||||
if (task.jobId && task.storyboard && task.storyboard.voiceover_script.trim()) {
|
||||
@@ -1271,6 +1288,9 @@ const ViralVideoPage: React.FC = () => {
|
||||
videoError: undefined,
|
||||
copyError: undefined,
|
||||
analysisError: undefined,
|
||||
// retry 从阶段1重新跑,清空旧产物避免残留
|
||||
imageAnalysis: undefined,
|
||||
storyboard: undefined,
|
||||
})
|
||||
message.success("已重试")
|
||||
} catch (err: unknown) {
|
||||
@@ -1283,6 +1303,8 @@ const ViralVideoPage: React.FC = () => {
|
||||
videoError: undefined,
|
||||
copyError: undefined,
|
||||
analysisError: undefined,
|
||||
imageAnalysis: undefined,
|
||||
storyboard: undefined,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1319,8 +1341,12 @@ const ViralVideoPage: React.FC = () => {
|
||||
"",
|
||||
)
|
||||
const st = getJobStage(task.job)
|
||||
if (isVideoStage(st)) return { stage: "video" as const, msg: cleaned }
|
||||
if (isImageAnalysisStage(st)) return { stage: "image" as const, msg: cleaned }
|
||||
// 兜底:基于错误消息关键词判定(防止 stage 字段为空时错误归到文案)
|
||||
const looksLikeVideoErr =
|
||||
/wan 3\.0|seedance|视频生成|视频下载|视频渲染|tts|配音|render/i.test(cleaned)
|
||||
const looksLikeImageErr = /vlm|图片分析|vision|商品识别|ocr|image analysis|图片识别/i.test(cleaned)
|
||||
if (isVideoStage(st) || looksLikeVideoErr) return { stage: "video" as const, msg: cleaned }
|
||||
if (isImageAnalysisStage(st) || looksLikeImageErr) return { stage: "image" as const, msg: cleaned }
|
||||
return { stage: "copy" as const, msg: cleaned }
|
||||
}
|
||||
return null
|
||||
|
||||
Reference in New Issue
Block a user