Workflow 声明式脚本引擎¶
告别繁杂脆弱的 JSON 图配置:用纯 JavaScript 脚本编写大规模 Agent 编排逻辑。
在需要对成百上千个文件进行代码迁移、大规模审计或多角度对抗性验证时,如果由大模型一轮一轮地手动派发子任务,效率低下且容易出错。
DSH 创新地提出了 Workflow 脚本编排引擎:主 Agent 可以直接编写一段运行在安全 Worker 线程中的 JavaScript 脚本,高效指挥多 Agent 集群。
核心文件速查¶
| 路径 | 职责 | 重要度 |
|---|---|---|
packages/workflow/workflow/src/index.ts |
Workflow 服务定义与生命周期事件 | ⭐⭐⭐ |
packages/workflow/workflow-worker-thread/ |
Worker 线程隔离执行引擎 | ⭐⭐⭐ |
packages/workflow/tool-workflow/src/index.ts |
暴露给模型的 workflow 工具 |
⭐⭐⭐ |
核心设计:脚本即编排(Script-as-Orchestration)¶
DSH 摒弃了 LangGraph / Dify 等框架中沉重的可视化图 DSL,赋予 Agent 直接使用标准 JavaScript 表达控制流的能力。
Workflow 提供的顶级 API 钩子:¶
agent(prompt, opts?):- 启动一个子 Agent 运行至结束;
- 支持通过
opts.schema传入标准的 JSON Schema,强制子 Agent 返回经过强校验的结构化 JSON 对象。 pipeline(items, ...stages):- 流水线流转:无屏障并发(No Barrier)。每个条目独立穿透所有阶段,前一个条目进入 Stage 2 时,后一个条目可以同时在 Stage 1 执行。
parallel(thunks):- 屏障等待(Barrier):并发执行一组任务并
Promise.all等待全部完成。 phase(title)与log(message):- 汇报编排进度阶段与结构化日志。
真实案例:全库并发安全审计 Workflow 脚本¶
// 由 DSH 主 Agent 自动生成的编排脚本
phase("发现与分发")
log("开始对 20 个核心文件进行并发安全审计...")
const auditSchema = {
type: "object",
properties: {
hasVulnerability: { type: "boolean" },
severity: { type: "string", enum: ["low", "medium", "high", "critical"] },
summary: { type: "string" }
},
required: ["hasVulnerability", "severity", "summary"],
additionalProperties: false
}
// 使用 pipeline 进行两阶段流水线审计
const results = await pipeline(
args.targetFiles,
// 阶段 1: 单文件漏洞初筛 (并发执行)
async (file) => {
return await agent(`请对文件 ${file} 进行安全审计,查找 SQL 注入或路径穿越`, {
schema: auditSchema,
label: `Audit: ${file}`
})
},
// 阶段 2: 对发现中高危漏洞的文件进行红蓝对抗验证
async (auditResult, file) => {
if (!auditResult || !auditResult.hasVulnerability || auditResult.severity === 'low') {
return null
}
return await agent(`针对 ${file} 发现的漏洞 (${auditResult.summary}),请尝试编写 PoC 验证其真实性`, {
label: `Verify: ${file}`
})
}
)
phase("结果汇总")
return results.filter(Boolean)
沙箱与安全约束¶
为了防止大模型在 Workflow 脚本中执行危险的宿主操作:
- Workflow 脚本运行在隔离的 Node.js Worker 线程 中;
- 完全移除了宿主 API:脚本环境中没有 fs、net、child_process、eval 或任何 Node.js 模块导入;
- 计算隔离:脚本仅负责逻辑协调(Flow Control),所有实际的文件读写和代码执行必须通过 agent() 委派给受沙箱监管的子 Agent。
本章思考与自测¶
- 思考题:在处理 100 个文件的大规模任务时,为什么
pipeline(items, stage1, stage2)比先parallel(stage1)再parallel(stage2)的整体吞吐量和资源利用率更高? - 自测题:在 Workflow 中,如果某个子 Agent 执行失败并抛出异常,整个 Workflow 脚本会崩溃吗?DSH 是如何处理容错的?