Files
ai-agent/workflow/service/flow/lambda_segment_resume.go
T
19904408334 d699f7ce14 feat(workflow): 增加工作流计费与执行生命周期管理
- 新增计费模块:执行开始建单、终态结算/取消/失败处理,支持按条/按秒/按token计费
- 新增执行生命周期跟踪:优雅关停时取消运行中执行并等待落库
- 新增异步任务等待/通知机制(Wait/Notify)
- 重构执行记录落库与进度上报,统一失败分类与重试语义
- 重命名文件:async_task.go→async.go、flow_checkpoint_store.go→exec_checkpoint.go、flow_graph_util.go→exec_record.go
- 更新 .gitignore 与数据库密码配置
2026-09-03 13:22:22 +08:00

54 lines
2.2 KiB
Go

package flow
import (
"sort"
"ai-agent/workflow/model/entity"
)
// 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 := range paramsList {
idxList[i] = i
ref, ok := savedMap[i]
needGen[i] = !ok || ref.URL == ""
}
return
}
// mergeSegmentOutputs 把复用段与新生段按段序号升序合并为 concat 输入列表(列表顺序即拼接顺序)。
// 复用段重建 {key:url} 记录(key 保持模型原输出字段,避免下游引用失配);新生段沿用模型原输出。
// 任一段既无复用又无生成结果(生成空)则跳过——与现有"空段贡献空"行为一致,最终由 concat 校验兜底。
func mergeSegmentOutputs(idxList []int, needGen []bool, newRes [][]map[string]any, savedMap map[int]entity.SegmentRef) []map[string]any {
type segOutput struct {
idx int
recs []map[string]any
}
out := make([]segOutput, 0, len(idxList))
for i, idx := range idxList {
if needGen[i] {
if len(newRes[i]) > 0 {
out = append(out, segOutput{idx: idx, recs: newRes[i]})
}
continue
}
if ref, ok := savedMap[idx]; ok && ref.URL != "" {
out = append(out, segOutput{idx: idx, recs: []map[string]any{{ref.Key: ref.URL}}})
}
}
sort.SliceStable(out, func(a, b int) bool { return out[a].idx < out[b].idx })
var merged []map[string]any
for _, o := range out {
merged = append(merged, o.recs...)
}
return merged
}