news 2026/9/14 4:46:11

Mastra 工作流实战:构建 AI 增强的内容处理流水线(aiContentWorkflow)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mastra 工作流实战:构建 AI 增强的内容处理流水线(aiContentWorkflow)

Mastra 工作流实战:构建 AI 增强的内容处理流水线(aiContentWorkflow)

【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra

本文基于 Mastra 官方课程「Workflows」章节的实操文档 13-creating-ai-enhanced-workflow.md,讲解如何在前序课程搭建的三步内容处理工作流基础上,接入 AI Agent 分析步骤,构建一条完整的 AI 增强型工作流aiContentWorkflow。读完本文,你将掌握:如何用createWorkflow声明带 Schema 的增强工作流、如何在 Mastra 实例中同时注册多个 Workflow 与 Agent、如何利用mastra.getAgent()在步骤内调用 Agent,以及commit()与执行图构建的底层机制。

从三步流程到四步 AI 流水线

在课程的 第 12 课 中,我们已经创建了aiAnalysisStep——一个通过 Agent 对内容进行质量评分和反馈的步骤;在更早的 第 9 课 中创建了generateSummaryStep。本课的核心任务是:把原有工作流的三个步骤(验证 → 增强 → 摘要)与 AI 分析步骤串成一条新流水线,得到一条"AI 增强的完整内容处理系统":

  1. Validates——validateContentStep:验证内容并统计字数;
  2. Enhances——enhanceContentStep:补充元数据(阅读时长、难度等级);
  3. Summarizes——generateSummaryStep:基于首句与字数生成摘要;
  4. Analyzes——aiAnalysisStep:调用 AI Agent 输出 1–10 的质量评分与改进反馈。

这条流水线的关键设计是数据只增不减:每一步的outputSchema都包含上一步输出的全部字段,再叠加本步新增的字段。到第四步结束,输出对象同时持有contentmetadatasummaryaiAnalysis四个维度的数据。

创建增强工作流:完整代码与 Schema 解析

src/mastra/workflows/content-workflow.ts(课程示例项目结构)中新增如下工作流定义:

export const aiContentWorkflow = createWorkflow({ id: 'ai-content-workflow', description: 'AI-enhanced content processing with analysis', inputSchema: z.object({ content: z.string(), type: z.enum(['article', 'blog', 'social']).default('article'), }), outputSchema: z.object({ content: z.string(), type: z.string(), wordCount: z.number(), metadata: z.object({ readingTime: z.number(), difficulty: z.enum(['easy', 'medium', 'hard']), processedAt: z.string(), }), summary: z.string(), aiAnalysis: z.object({ score: z.number(), feedback: z.string(), }), }), }) .then(validateContentStep) .then(enhanceContentStep) .then(generateSummaryStep) .then(aiAnalysisStep) .commit()

输入 Schema 与输出 Schema 的对应关系

  • 输入 Schema只有两个字段:content(待处理内容)和type(内容类型,取值为article/blog/social,未提供时默认article)。
  • 输出 Schema是整条流水线终态的"契约":wordCount由第一步产出,metadata.readingTime/difficulty/processedAt由第二步产出,summary由第三步产出,aiAnalysis.score/aiAnalysis.feedback由第四步产出。

这个写法体现了一个重要约定:工作流的outputSchema描述的是最后一个步骤的输出,而不是任意中间态。由于每一步都透传了上游字段,末步输出天然满足整条工作流的输出 Schema。

.then()链与.commit()的底层机制

从源码结构看,createWorkflow是 packages/core/src/workflows/create.ts 中定义的工厂函数:普通场景下它构造Workflow类实例(若声明了schedule参数则自动切换到 evented 引擎)。Workflow类本身并不在构造时构建执行图,而是在commit()时才固化:

// packages/core/src/workflows/workflow.ts commit() { this.executionGraph = this.buildExecutionGraph(); this.committed = true; return this as unknown as Workflow<...>; }

见 workflow.ts#L2657-L2670。buildExecutionGraph()返回{ id: this.id, steps: this.stepFlow },即把.then()链式声明的步骤数组固化为执行图。如果跳过.commit()就直接创建运行实例,createRun()会抛出明确错误:

Uncommitted step flow changes detected. Call .commit() to register the steps.

见 workflow.ts#L2703-L2710。因此.commit()不是可选的样式代码,而是让步骤流"生效注册"的必要动作——这也是课程示例中链尾必须调用它的原因。

注册工作流与 Agent:Mastra 实例配置

src/mastra/index.ts中更新 Mastra 配置,同时注册两个工作流(原版contentWorkflow与 AI 增强版aiContentWorkflow)和contentAgent(第 11 课 中创建的 Agent):

// In src/mastra/index.ts import { contentWorkflow, aiContentWorkflow } from './workflows/content-workflow' import { contentAgent } from './agents/content-agent' export const mastra = new Mastra({ workflows: { contentWorkflow, aiContentWorkflow, // Add the AI-enhanced version }, agents: { contentAgent }, // ... rest of configuration })

这里有两个容易踩坑的点,均可在核心源码中得到印证:

1. 注册键名必须与getAgent()的查询名一致。步骤内部通过mastra.getAgent('contentAgent')按注册键名取回 Agent 实例。getAgent的实现位于 packages/core/src/mastra/index.ts:它在内部#agents映射中查找,若找不到会抛出MASTRA_GET_AGENT_BY_NAME_NOT_FOUND类型的MastraError,错误详情中还会附带当前所有可用 Agent 的键名列表,便于排查拼写错误:

const agent = this.#agents?.[name]; if (!agent) { const error = new MastraError({ id: 'MASTRA_GET_AGENT_BY_NAME_NOT_FOUND', domain: ErrorDomain.MASTRA, category: ErrorCategory.USER, text: `Agent with name ${String(name)} not found`, details: { status: 404, agentName: String(name), agents: Object.keys(this.#agents ?? {}).join(', ') }, }); throw error; }

其测试用例 config-spread.test.ts 验证了两类行为:mastra.getAgent('testAgent')返回与注册对象同一引用(toBe(agent)),而查询未注册名会抛错。所以本例中agents: { contentAgent }的键名、以及步骤内getAgent('contentAgent')的字符串必须完全一致。

2. 同一个工作流文件导出两个工作流是安全的。从源码结构看,每个createWorkflow(...).commit()返回的是独立的Workflow实例,持有各自的stepFlow与执行图;aiContentWorkflow复用了contentWorkflow的前三个步骤对象,但步骤流是各自独立声明的,两者互不影响。Mastra 支持在workflows字段中并列注册多个工作流,Playground 会按注册键名分别展示。

回顾 AI 分析步骤:步骤内如何调用 Agent

为了理解第四条边(aiAnalysisStep)的工作方式,回顾第 12 课中的步骤定义(见 12-using-agent-in-workflow.md)。其核心在于execute的上下文参数解构出的mastra实例:

execute: async ({ inputData, mastra }) => { const { content, type, wordCount, metadata, summary } = inputData // 组装提示词:把类型、内容、字数、阅读时长、难度一并交给 Agent const prompt = `Analyze this ${type} content: ...` // 通过 mastra 实例获取 Agent,调用 generate() const contentAgent = mastra.getAgent('contentAgent') const { text } = await contentAgent.generate([{ role: 'user', content: prompt }]) // 解析 AI 响应(带兜底) let aiAnalysis try { aiAnalysis = JSON.parse(text) } catch { aiAnalysis = { score: 7, feedback: 'AI analysis completed. ' + text } } return { content, type, wordCount, metadata, summary, aiAnalysis } }

这段实现有两点工程价值值得注意:

  • mastra实例是步骤访问全局资源的统一入口。在每步的execute函数中,Mastra 会把宿主实例注入上下文,使步骤能够访问 Agents、Tools,甚至其他 Workflows。这避免了在步骤模块中硬编码导入 Agent 对象,保持了步骤与配置解耦。
  • 对 LLM 输出的 JSON 解析做了兜底。aiAnalysisStep要求模型按{"score": number, "feedback": "..."}格式返回;try/catch保证即使模型返回非 JSON 文本,步骤也不会失败,而是回退为默认评分 7 并保留原始文本。这是"把不可控的 LLM 输出接入强 Schema 流水线"的稳健姿势——工作流的outputSchema承诺了aiAnalysis一定是{score: number, feedback: string}结构。

在 Playground 中验证 AI 增强工作流

注册完成后,启动mastra dev进入 Mastra Playground:

  1. 打开Workflows标签页;
  2. 在下拉列表中选中ai-content-workflow(即aiContentWorkflowid);
  3. 按输入 Schema 填写测试数据,例如:
{ "content": "Mastra lets you build AI agents and workflows in TypeScript.", "type": "blog" }
  1. 运行测试,逐步骤查看每步的输入/输出:验证步产出wordCount,增强步产出metadata,摘要步产出summary,AI 分析步产出aiAnalysis.scoreaiAnalysis.feedback

Playground 的价值在于把执行图的每一步展开为可检查的中间态——你可以直接看到aiAnalysisStep收到的inputData正是上一步的完整输出,从而直观验证"输出即输入"的链式契约。

小结:AI 增强流水线的完整形态

至此,aiContentWorkflow构成了一条完整的 AI 驱动内容处理系统:

步骤步骤 ID职责新增输出字段
1validateContentStep验证内容、统计字数wordCount
2enhanceContentStep生成阅读时长与难度元数据metadata
3generateSummaryStep生成内容摘要summary
4aiAnalysisStep调用 Agent 做质量评分与反馈aiAnalysis

本节的几个关键结论可归纳为:

  • createWorkflow({ id, inputSchema, outputSchema })声明工作流契约,.then()串联步骤,.commit()固化执行图(见 create.ts 与 workflow.ts#L2657-L2670);
  • 步骤内通过mastra.getAgent(name)访问全局 Agent,注册键名与查询名必须一致,否则会抛出MASTRA_GET_AGENT_BY_NAME_NOT_FOUND错误(见 mastra/index.ts#L2269-L2300);
  • 每一步透传上游全部字段并叠加新字段,使末步输出满足整条工作流的outputSchema
  • 对 LLM 结构化输出必须做解析兜底,才能安全接入强类型流水线。

课程的后续章节(14-understanding-parallel-execution.md 起)将在这条串行流水线的基础上,讲解如何用branch等机制实现步骤的并行执行,进一步压缩多步骤工作流的总耗时。

【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 4:46:09

MiGPT:3步把小爱音箱接入ChatGPT,改造成你的专属AI语音助手

MiGPT&#xff1a;3步把小爱音箱接入ChatGPT&#xff0c;改造成你的专属AI语音助手 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 深夜你问&quo…

作者头像 李华
网站建设 2026/9/14 4:46:05

粒子群优化算法在无人机三维路径规划中的MATLAB实现与调参指南

简介&#xff1a;资源为基于粒子群算法&#xff08;PSO&#xff09;的无人机三维路径规划MATLAB实现&#xff0c;面向计算机、电子信息工程、数学等专业的课程设计、期末大作业及毕业设计。代码采用参数化编程&#xff0c;结构清晰、注释齐全&#xff0c;涉及三维环境地图构建、…

作者头像 李华
网站建设 2026/9/14 4:46:04

MATLAB滑动窗口技术:高效处理时间序列数据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 4:44:49

翻页采集实战:page 参数、去重与成本控制

翻页听起来就是把 page 从 1 往上加,真跑起来决定成败的是三个细节:什么时候停、怎么去重、翻到第几页还值得。这篇把这三件事讲清楚,附可直接跑的脚本和成本对照表。 先明确参数事实 文档写得清楚:搜索端点的 page 参数是 1 起算的页码,默认值 1;每次成功请求 1 credit。没有…

作者头像 李华
网站建设 2026/9/14 4:43:41

用LLM构建本地Wiki知识库:从语义检索到RAG实践

在本地用 LLM 给自己造一个 Wiki 知识库&#xff0c;这事我琢磨了挺久&#xff0c;最近终于把 llm_wiki 这个项目跑通了&#xff0c;整体效果超出预期。说白了&#xff0c;llm_wiki 就是把大语言模型和 Wiki 这套知识管理方式结合起来&#xff0c;让你能把散落在各处的工作笔记…

作者头像 李华