74 lines
2.1 KiB
Go
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
|
|
}
|