feat: 支持模板子流程递归拷贝与段级续跑优化
* 模板拷贝用户流程时递归复制子流程,并重写 sub_flow 节点引用 * 段级续跑改用列表位置作为段身份,移除对 segment_index 的依赖 * 段结果保存移到每段生成完成时立即落库,降低崩溃丢失风险 * 移除视频分段续跑设计与对应测试
This commit is contained in:
@@ -4,42 +4,24 @@ import (
|
||||
"sort"
|
||||
|
||||
"ai-agent/workflow/model/entity"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// segmentGenerateMaxAttempts 视频段生成最大尝试次数(失败自动重试 1 次,共 2 次尝试),参数化可调
|
||||
const segmentGenerateMaxAttempts = 2
|
||||
|
||||
// hasDistinctSegmentIndex 判断各段参数是否都带 segment_index 且互不重复。
|
||||
// 段级续跑依赖 segment_index 作为段的稳定身份;缺失或重复(如视频节点误用批量拆分)时
|
||||
// 不得启用复用/落库,否则续跑会拿同一段结果拼出 N 段重复视频(静默损坏)。
|
||||
func hasDistinctSegmentIndex(paramsList []map[string]any) bool {
|
||||
seen := make(map[int]bool, len(paramsList))
|
||||
for _, params := range paramsList {
|
||||
v, ok := params["segment_index"]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
idx := gconv.Int(v)
|
||||
if seen[idx] {
|
||||
return false
|
||||
}
|
||||
seen[idx] = true
|
||||
}
|
||||
return len(paramsList) > 0
|
||||
}
|
||||
|
||||
// planSegmentResume 段级续跑决策:把 paramsList 各段映射到"是否需重新生成"。
|
||||
// savedMap 为该节点已成功段(段序号 → {key,url});段在表中缺失或地址为空则需重新生成。
|
||||
// 返回值与 paramsList 对齐。全新执行(savedMap 为 nil/空)时全部需生成。
|
||||
// planSegmentResume 段级续跑决策:段身份取列表位置(0-based,paramsList 顺序即段序),
|
||||
// 把各段映射到"是否需重新生成"。savedMap 为该节点已成功段(段序号 → {key,url});
|
||||
// 段在表中缺失或地址为空则需重新生成。返回值与 paramsList 对齐。
|
||||
// 全新执行(savedMap 为 nil/空)时全部需生成。
|
||||
// 不用 params["segment_index"] 作为段身份:真实链路(上游 split_shots_pipeline 转写 →
|
||||
// 下游 split_segment 按 __segment_fields 拆分,invokePreTool 剥离 __ 内部键)下
|
||||
// paramsList 只有模型参数;列表位置互不重复、顺序即段序、参数一致时跨 reExecute 稳定。
|
||||
func planSegmentResume(paramsList []map[string]any, savedMap map[int]entity.SegmentRef) (idxList []int, needGen []bool) {
|
||||
idxList = make([]int, len(paramsList))
|
||||
needGen = make([]bool, len(paramsList))
|
||||
for i, params := range paramsList {
|
||||
idx := gconv.Int(params["segment_index"])
|
||||
idxList[i] = idx
|
||||
ref, ok := savedMap[idx]
|
||||
for i := range paramsList {
|
||||
idxList[i] = i
|
||||
ref, ok := savedMap[i]
|
||||
needGen[i] = !ok || ref.URL == ""
|
||||
}
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user