// Package processor 工作流节点的前置/后置处理器注册表。 // // 与模型工具(common/tools)区分:处理器是绑定固定业务场景的处理函数,按名注册与分发, // 供节点配置(preTool/postTool)引用,不由模型 function calling 调用。 package processor import ( "context" "fmt" "sort" ) // Processor 工作流前置/后置处理函数。按名注册与分发,供节点配置引用。 type Processor struct { Name string Description string IsShow bool Func func(ctx context.Context, args map[string]any) (any, error) } // registry 处理器注册表 var registry = make(map[string]*Processor) // Register 注册处理器,同名覆盖 func Register(list ...*Processor) { for _, p := range list { if p == nil || p.Name == "" { continue } registry[p.Name] = p } } // Call 按名调用处理器。未知处理器返回错误。 func Call(ctx context.Context, name string, args map[string]any) (any, error) { if err := ctx.Err(); err != nil { return nil, err } p := registry[name] if p == nil || p.Func == nil { return nil, fmt.Errorf("处理器[%s]不存在或未实现", name) } return p.Func(ctx, args) } func List(ctx context.Context) ([]*Processor, error) { list := make([]*Processor, 0, len(registry)) for _, t := range registry { list = append(list, t) } sort.Slice(list, func(i, j int) bool { return list[i].Name < list[j].Name }) return list, nil } // ProducedKey 前置处理器已完成模型调用、直接产出最终结果时,在返回列表的每个 map 上打的标记键。 // 模型调用节点识别到该标记后跳过模型调用循环,把前置处理器的结果直接交给后置处理器。 // 用于"串行视频生成"这类无法用并发循环表达的前置处理器。 const ProducedKey = "__produced" // IsProduced 判断前置处理器返回列表是否全部带已产出标记(列表中每个 map 的标记值都须为 true) func IsProduced(list []map[string]any) bool { if len(list) == 0 { return false } for _, m := range list { if m == nil { return false } if v, ok := m[ProducedKey].(bool); !ok || !v { return false } } return true }