Files
ai-agent/workflow/service/flow/processor/processor.go
T

74 lines
2.1 KiB
Go

// Package processor 工作流节点的前置/后置处理器注册表。
//
// 与模型工具(common/tools)区分:处理器是绑定固定业务场景的处理函数,按名注册与分发,
// 供节点配置(preTool/postTool)引用,不由模型 function calling 调用。
package processor
import (
"context"
"fmt"
"sort"
)
// Processor 工作流前置/后置处理函数。按名注册与分发,供节点配置引用。
type Processor struct {
Name string
Description string
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
}