Documentation
¶
Overview ¶
Package workflow 承载 workflow 定义的数据模型、落盘校验与展开算法。
已实现:
- definition.go:workflow 定义 schema(节点、评测官、engineConfig 判别联合)与严格解析 / 规范化;
- validate.go:落盘校验(结构、id、engineConfig 能力表、循环互斥、redoTarget 回跳、模板引用);
- expand.go:把节点图展开成确定性的线性执行步骤序列(in-place 内循环 + jump-back 段循环)。
待移植(run 批):
- render:模板变量({{sys.x}} / {{nodeId}})替换;
- 主循环:串联各步产物与反馈,逐步驱动 engine 包中的引擎执行。
Index ¶
Constants ¶
const ( StepTypeAgent = "agent" // 节点主体 StepTypeEvaluator = "evaluator" // 评测官 )
执行步骤的两种类型(ExecutionStep.Type / trace 的 type 字段取值)。集中定义避免魔法串拼错。
const DefaultEvaluatorPrompt = "" /* 132-byte string literal not displayed */
DefaultEvaluatorPrompt 是首次挂载 evaluator 时自动补的默认评测提示词(自包含、不写 {{<节点id>}} 自引用)。
Variables ¶
This section is empty.
Functions ¶
func Render ¶
func Render(template string, sysVars, artifacts map[string]string, validNodeID func(string) bool) string
Render 把 promptTemplate 里的变量引用替换为运行时值,语义与 Validate 的 templateVariablePattern 同源(移植自 Python 原型 render_template):
- \{{key}} → 字面量 {{key}}(转义,不替换)
- {{sys.x}} → sysVars["x"];未注入则保留字面量 {{sys.x}}(fail-loud,不静默成空)
- {{nodeId}} → artifacts[nodeId];合法节点但未跑 → 空串
- 其余 → 保留字面量(非法引用不静默吞)
sysVars 以裸名为键("userPrompt" / "cwd",不含 "sys." 前缀)。validNodeID 判定某 id 是否为定义内的合法节点(与 Validate 用同一判定,避免把非法引用当节点渲染成空串)。
func Validate ¶
func Validate(def *Definition) error
Validate 是 ValidateStructured 的字符串化包装:把每条 Problem 拼成 "<path>: <message>"、换行连接返回, 输出与历史逐字一致(各调用方仍按整串比对 / 子串断言)。无错误返回 nil。
func ValidateName ¶
ValidateName 校验工作流名是否合法。正则已禁掉路径分隔符(`/` `\`),额外拒绝 `.` / `..` 这两个目录特殊名,杜绝按名寻址时越出 store 目录。
Types ¶
type Definition ¶
type Definition struct {
Name string `json:"name"`
CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"`
Nodes []Node `json:"nodes"`
}
Definition 是一份完整的工作流记录:系统管理的元数据 + 用户编写的节点定义。 name / createdAt / updatedAt 由 store 写入,nodes 是定义主体。
func ParseDefinition ¶
func ParseDefinition(data []byte) (*Definition, error)
ParseDefinition 严格解析一份导入定义:拒绝未知字段(fail-loud,尽早暴露拼写错误)。 只做 JSON 结构解析,语义校验见 Validate。
func Scaffold ¶
func Scaffold() *Definition
Scaffold 返回一份最小可用的骨架定义(单节点、claude-code、透传用户需求)。 name 与时间戳由 store 写入。
func (*Definition) CopyAs ¶ added in v0.0.2
func (d *Definition) CopyAs(name string) *Definition
CopyAs 从本定义深拷出一份名为 name 的新定义(造变体):只带 name 与深拷来的 nodes, 不携带时间戳(CreatedAt / UpdatedAt 留空,交给 store.Create 重戳当前时刻)。 nodes 必须深拷——Node 内含指针字段(EngineConfig / Evaluator / LoopCount),逐个 new 一份, 避免新旧定义共享底层指针后互相串改。CLI `workflow copy` 与 UI 复制端点共用此方法。
func (*Definition) Normalize ¶
func (d *Definition) Normalize()
Normalize 补齐规范化默认值:带 evaluator / redoTarget 的节点若未写 loopCount,则补为 1。
type EngineConfig ¶
type EngineConfig struct {
Model string `json:"model,omitempty"`
Effort string `json:"effort,omitempty"` // 仅 claude-code
ReasoningEffort string `json:"reasoningEffort,omitempty"` // qoder / codex
}
EngineConfig 是引擎专属的调优载荷,其合法字段由所属 Node/Evaluator 的 engine 决定 (判别联合,见 engine 包的能力表与 Validate)。所有字段选填。
type Evaluator ¶
type Evaluator struct {
Engine string `json:"engine"`
EngineConfig *EngineConfig `json:"engineConfig,omitempty"`
PromptTemplate string `json:"promptTemplate"`
}
Evaluator 是节点内联的评测官,触发 in-place 内循环;engine + engineConfig 同构于 Node。
type ExecutionStep ¶
type ExecutionStep struct {
Type string // StepTypeAgent | StepTypeEvaluator
NodeID string
Iteration int
}
ExecutionStep 是展开后的单个执行步骤。
func Expand ¶
func Expand(nodes []Node) []ExecutionStep
Expand 把节点图展开成确定性的线性执行序列,含两种循环模式:
- evaluator(in-place 内循环):同一节点「写 → 评 → 改」重复 loopCount 轮,末轮不再评;
- redoTarget(jump-back 段循环):本节点跑完跳回 redoTarget,把二者之间的整段重跑 loopCount 轮。
从 Python 原型 paw_workflow.py:expand_workflow 移植,保持相同语义(含对前向 / 非法 redoTarget 退化为单次的兜底)。假定节点结构已通过 Validate;对非法输入仍尽量优雅降级。
type Node ¶
type Node struct {
ID string `json:"id"`
DisplayName string `json:"displayName"`
Engine string `json:"engine"`
EngineConfig *EngineConfig `json:"engineConfig,omitempty"`
PromptTemplate string `json:"promptTemplate"`
Evaluator *Evaluator `json:"evaluator,omitempty"`
RedoTarget string `json:"redoTarget,omitempty"`
LoopCount *int `json:"loopCount,omitempty"`
}
Node 是工作流的单个节点。evaluator 与 redoTarget 互斥(见 Validate)。
type Problem ¶
Problem 是一条字段级校验错误:Path 为出错字段的点路径(如 "nodes[0].id" / "nodes[0]" / "nodes"), Message 为不含路径前缀的纯消息。供编辑器把「点校验错误 → 定位到对应字段」建立在结构而非文案格式上。
func ValidateStructured ¶
func ValidateStructured(def *Definition) []Problem
ValidateStructured 对一份定义执行落盘校验,逐条收集字段级错误后一并返回(承 spec〈落盘校验规则〉, 比 Python 原型更严:额外强制 id 唯一、redoTarget 存在且前向、模板引用存在)。不修改 def。 返回空切片表示校验通过。Validate 是它的字符串化 thin wrapper。