第 7 章 · Workflow 基础与 .then()
本章目标:理解 Workflow 与 Agent 的分工边界,掌握 createStep / createWorkflow / .then() 构建串行流水线。
7.1 Agent vs Workflow:何时用哪个
| Agent | Workflow | |
|---|---|---|
| 执行路径 | 模型自主决策,不可预知 | 显式定义,图结构确定 |
| 适用任务 | 开放式问题("帮我写个方案") | 确定性流程("抓取→清洗→入库") |
| 可靠性 | 依赖提示词与模型能力 | 步骤 schema 强约束,结果可预测 |
| 调试 | 看完整 Trace 推理过程 | 图形化查看每步输入输出 |
经验法则:路径可预测的流程用 Workflow,需要模型判断的环节才嵌入 Agent。两者常常组合使用。
7.2 createStep:定义步骤
步骤是 Workflow 的积木。每个步骤用 Zod 声明输入/输出 schema,形成类型安全的管道接口:
typescript
// src/mastra/workflows/article-workflow.ts
import { createStep } from '@mastra/core/workflows';
import { z } from 'zod';
// 步骤一:接收主题,产出提纲
const outlineStep = createStep({
id: 'outline',
inputSchema: z.object({
topic: z.string().describe('文章主题'),
}),
outputSchema: z.object({
outline: z.string(),
topic: z.string(), // 透传给下游
}),
// execute 的入参 inputData 类型由 inputSchema 自动推导
execute: async ({ inputData }) => {
const { topic } = inputData;
// 实际项目中这里可调用 LLM、API 或任意函数
return {
outline: `${topic} 的三段式提纲:背景 → 分析 → 结论`,
topic,
};
},
});7.3 createWorkflow + .then():串联执行
typescript
// 同文件:第二个步骤消费上游输出
const draftStep = createStep({
id: 'draft',
inputSchema: z.object({
outline: z.string(),
topic: z.string(),
}),
outputSchema: z.object({
article: z.string(),
}),
execute: async ({ inputData }) => ({
article: `《${inputData.topic}》\n\n根据提纲撰写正文:${inputData.outline}`,
}),
});
// 组装工作流:声明整体输入输出 → 链接步骤 → commit 收尾
export const articleWorkflow = createWorkflow({
id: 'article-workflow',
inputSchema: z.object({ topic: z.string() }),
outputSchema: z.object({ article: z.string() }),
})
.then(outlineStep) // 先执行 outlineStep
.then(draftStep) // 其输出自动作为下一步输入
.commit(); // 必须调用,锁定流程图关键机制:.then() 会把上一步的 outputSchema 作为下一步的校验入参——如果两个步骤的 schema 不匹配,在组装期就会报错,这正是"schema 即契约"的价值。
7.4 注册与触发
typescript
// src/mastra/index.ts —— 注册 workflow
import { Mastra } from '@mastra/core';
import { articleWorkflow } from './workflows/article-workflow';
export const mastra = new Mastra({
workflows: { articleWorkflow },
});typescript
// 触发方式一:代码中直接创建运行实例
const run = await mastra.getWorkflow('articleWorkflow').createRun();
const result = await run.start({ inputData: { topic: '大语言模型' } });
console.log(result.results); // 各步骤输出也可以在 Studio 的 Workflows 页签中手动填入触发参数、图形化观察每步流转。
本章小结
- 开放式任务交给 Agent,确定性流程交给 Workflow,复杂系统二者组合;
createStep用 Zod 双向声明输入/输出,execute 只写业务逻辑;.then()串行链接并自动做 schema 匹配检查,.commit()锁定流程;- workflow 同样要在 Mastra 实例注册,支持代码 createRun 与 Studio 手动触发。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. 下列哪种任务最适合用 Workflow 而不是 Agent 实现?
2. .then() 链接步骤时,框架如何保证步骤间兼容?
3. createWorkflow 定义完成后,收尾必须调用的方法是?
4. workflow 步骤的 execute 函数中获取上游数据的正确方式是?
🛠️ 动手实践
- 给 articleWorkflow 追加第三个步骤 reviewStep:输入草稿,输出带评分的结构体。
- 故意让 draftStep 的 outputSchema 与 reviewStep 的 inputSchema 字段不匹配,观察组装期报错信息。
- 在 Studio 中打开你的 workflow,截图 Graph 视图并与代码中的 .then() 顺序对照。
下一章:第 8 章 · 分支与并行执行