From 9bc388018bddae84cf03449953553be3f383178c Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Fri, 21 Aug 2026 10:56:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=87=8D=E8=AF=95=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=90=8E=E6=B8=85=E7=A9=BA=E6=89=A7=E8=A1=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=97=A7=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workflow/dao/session/exec_chat_dao.go | 15 +++++++++++++++ workflow/dao/session/exec_workflow_dao.go | 15 +++++++++++++++ workflow/service/flow/flow_ws_exec.go | 7 +++++++ workflow/service/flow/lambda_script_transcribe.go | 14 ++++++++++++++ workflow/service/flow/react_ws_exec.go | 12 +++++++++++- 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/workflow/dao/session/exec_chat_dao.go b/workflow/dao/session/exec_chat_dao.go index 9883b22..5b8f3d8 100644 --- a/workflow/dao/session/exec_chat_dao.go +++ b/workflow/dao/session/exec_chat_dao.go @@ -35,6 +35,21 @@ func (d *execChatDao) Update(ctx context.Context, req *sessionDto.UpdateExecChat return r.RowsAffected() } +// ClearError 清空对话执行记录的报错信息(重新执行成功后调用,OmitEmpty 的 Update 会跳过空串,需显式写空) +func (d *execChatDao) ClearError(ctx context.Context, id int64) (rows int64, err error) { + r, err := gfdb.DB(ctx, public.DbNameBlackDeacon).Model(ctx, public.TableNameExecChat). + Where(entity.ExecChatCol.Id, id). + Data(map[string]any{ + entity.ExecChatCol.ErrorMessage: "", + entity.ExecChatCol.Error: "", + }). + Update() + if err != nil { + return + } + return r.RowsAffected() +} + func (d *execChatDao) Delete(ctx context.Context, req *sessionDto.DeleteExecChatReq) (rows int64, err error) { r, err := gfdb.DB(ctx, public.DbNameBlackDeacon).Model(ctx, public.TableNameExecChat).Where(entity.ExecChatCol.Id, req.Id).Delete() if err != nil { diff --git a/workflow/dao/session/exec_workflow_dao.go b/workflow/dao/session/exec_workflow_dao.go index 702abb7..e2f516a 100644 --- a/workflow/dao/session/exec_workflow_dao.go +++ b/workflow/dao/session/exec_workflow_dao.go @@ -43,6 +43,21 @@ func (d *execWorkflowDao) Update(ctx context.Context, req *sessionDto.UpdateWork return r.RowsAffected() } +// ClearError 清空执行记录的报错信息(重新执行成功后调用,OmitEmpty 的 Update 会跳过空串,需显式写空) +func (d *execWorkflowDao) ClearError(ctx context.Context, id int64) (rows int64, err error) { + r, err := gfdb.DB(ctx, public.DbNameBlackDeacon).Model(ctx, public.TableNameExecWorkflow). + Where(entity.ExecWorkflowCol.Id, id). + Data(map[string]any{ + entity.ExecWorkflowCol.ErrorMessage: "", + entity.ExecWorkflowCol.Error: "", + }). + Update() + if err != nil { + return + } + return r.RowsAffected() +} + func (d *execWorkflowDao) GetById(ctx context.Context, id int64) (res *entity.ExecWorkflow, err error) { r, err := gfdb.DB(ctx, public.DbNameBlackDeacon).Model(ctx, public.TableNameExecWorkflow). Where(entity.ExecWorkflowCol.Id, id). diff --git a/workflow/service/flow/flow_ws_exec.go b/workflow/service/flow/flow_ws_exec.go index 905a999..205ebca 100644 --- a/workflow/service/flow/flow_ws_exec.go +++ b/workflow/service/flow/flow_ws_exec.go @@ -190,6 +190,13 @@ func recordWorkflow(ctx context.Context, id int64, duration time.Duration, runEr glog.Errorf(ctx, "exec_workflow 落库失败: %v", err) return } + // 执行成功:重新执行复用了同一条记录,OmitEmpty 的 Update 会跳过空 error_message/error, + // 需显式清空,避免上一次失败的报错残留 + if runErr == nil { + if _, err := sessionDao.ExecWorkflowDao.ClearError(ctx, id); err != nil { + glog.Errorf(ctx, "exec_workflow 报错信息清空失败: %v", err) + } + } } // workflowResultFileUrls 查询指定工作流执行保存的结果文件路径(带文件前缀,与 session/get 返回一致) diff --git a/workflow/service/flow/lambda_script_transcribe.go b/workflow/service/flow/lambda_script_transcribe.go index d5aee8e..08e0dfb 100644 --- a/workflow/service/flow/lambda_script_transcribe.go +++ b/workflow/service/flow/lambda_script_transcribe.go @@ -51,8 +51,14 @@ func ScriptTranscribeLambda(ctx context.Context, input any) (any, error) { } var totalDuration int var modelId int64 + // 静音模式:清空镜头台词/旁白,生成视频不含口播、旁白、字幕与人物开口动作,默认开启 + noSpeech := true for _, item := range *n { switch item.Field { + case "noSpeech": + if !g.IsEmpty(item.Value) { + noSpeech = gconv.Bool(item.Value) + } case "totalDuration": if !g.IsEmpty(item.Value) { totalDuration = gconv.Int(item.Value) @@ -136,6 +142,14 @@ func ScriptTranscribeLambda(ctx context.Context, input any) (any, error) { if err != nil { return nil, err } + // 静音模式:清空台词与旁白,保证写进视频 prompt 的只有事件/环境音/运镜/景别, + // 视频模型不会产生口播、旁白配音、字幕烧录,也不会把角色标记为开口优先做口型动画 + if noSpeech { + for i := range shots { + shots[i].Dialogue = "" + shots[i].Narration = "" + } + } // 5. 产出固定结构 {"shots": [...]} var arr []any diff --git a/workflow/service/flow/react_ws_exec.go b/workflow/service/flow/react_ws_exec.go index 6abb864..a1ba55d 100644 --- a/workflow/service/flow/react_ws_exec.go +++ b/workflow/service/flow/react_ws_exec.go @@ -165,7 +165,17 @@ func recordChat(ctx context.Context, id int64, answer string, msg string, runErr ErrorMessage: msg, Error: errorDetail, }) - return err + if err != nil { + return err + } + // 执行成功:重新执行复用了同一条记录,OmitEmpty 的 Update 会跳过空 error_message/error, + // 需显式清空,避免上一次失败的报错残留 + if runErr == nil { + if _, err := sessionDao.ExecChatDao.ClearError(ctx, id); err != nil { + glog.Errorf(ctx, "exec_chat 报错信息清空失败: %v", err) + } + } + return nil } // pushAgentEvent 把 ReAct 过程事件转为 WS 推送消息