Skip to content

服务化与 API 集成:从 Studio 走向真实应用 ​

问题场景 ​

本教程的离线 Demo 直接运行 TypeScript 文件,最终项目也可以通过 Mastra Studio 调试。但真实应用通常还需要前端、鉴权、请求级配置、审计日志和部署环境。

这时需要把 Mastra 看成一个服务运行时:它负责暴露 Agent、Workflow、Tool 等能力,业务应用通过 HTTP、SDK 或自定义路由调用这些能力。

Mastra Server 做什么 ​

官方部署文档说明,mastra build 会把应用编译成可独立运行的 Node.js server;Server 文档说明,注册的 Agents、Workflows 等能力会通过 API 暴露,并可通过 middleware、custom routes 和 client SDK 接入应用。

mermaid
flowchart LR
  UI["Web UI"] --> Server["Mastra Server"]
  Server --> Agents["Registered Agents"]
  Server --> Workflows["Registered Workflows"]
  Server --> Routes["Custom API Routes"]
  Server --> Middleware["Middleware"]
  Agents --> Storage["Storage / Memory"]
  Workflows --> Storage

服务化以后,src/mastra/index.ts 不再只是 Studio 的入口,它也是生产服务的注册表:

  • agents:可被聊天 UI、Studio、SDK 调用。
  • workflows:可被后台任务或业务 API 触发。
  • server.middleware:处理鉴权、日志、请求上下文。
  • server.apiRoutes:补充框架默认 endpoint 之外的业务接口。
  • storage:保存 memory、workflow state、approval snapshot 等状态。

Studio、Swagger UI 和正式 UI ​

官方 Studio 文档说明,运行 mastra dev 后可以打开 Studio 交互调试,也可以访问 Swagger UI 查看底层 REST API。

入口适合用途不适合用途
Studio开发调试、查看工具调用、试验模型参数直接作为公开用户界面
Swagger UI检查 endpoint、手工调用 API长期产品交互
正式 Web UI面向用户的聊天、进度、引用、审批调试内部 trace 细节

教学项目先使用 Studio,是为了把 Agent 行为看清楚。等工具、记忆和工作流稳定后,再接前端。

Middleware:请求进入系统前先处理 ​

Mastra server middleware 可以在 route handler 前后运行,适合处理:

  • 鉴权。
  • 请求日志。
  • CORS。
  • 从请求头、JWT 或业务数据库里提取用户信息。
  • 写入 RequestContext。
ts
import { Mastra } from '@mastra/core'
import { RequestContext } from '@mastra/core/request-context'

export const mastra = new Mastra({
  agents: { studyAgent },
  server: {
    middleware: [
      async (context, next) => {
        const requestContext = context.get('requestContext')
        const language = context.req.header('accept-language')?.startsWith('en')
          ? 'en-US'
          : 'zh-CN'

        requestContext.set('language', language)
        await next()
      },
    ],
  },
})

安全边界

RequestContext 可以携带权限、租户和功能开关,但不应该把原始 token、密钥或完整请求头交给模型。先在服务端提取「可用于决策的派生值」,再传给 Agent。

用户隔离:resource 不应该由前端随便传 ​

官方 middleware 文档强调,鉴权证明「谁在访问」,授权决定「能访问什么」。Memory 的 resourceId 需要绑定到已认证用户或租户,否则用户可能通过猜测参数访问其他人的 thread。

官方 Auth 文档还说明,如果不配置 auth,Studio UI 和 API routes 都会公开访问。教学项目可以保持本地无鉴权,但任何共享环境都必须先决定认证方式。

ts
export const mastra = new Mastra({
  server: {
    auth: {
      authenticateToken: async token => {
        return verifyToken(token)
      },
      mapUserToResourceId: user => user.id,
    },
  },
})

Study Agent 的生产化设计应遵循:

数据来源是否信任
resourceId服务端鉴权结果可信
threadId前端当前会话,但需校验归属部分可信
user-tier服务端订阅系统可信
debug内部管理员或开发环境部分可信
apiKey环境变量或密钥管理系统不进入模型上下文

Storage:哪些能力依赖持久化 ​

官方 Storage 文档说明,MastraStorage 统一管理 suspended workflows、memory、traces 和 eval datasets。没有配置 storage 时,数据不会跨应用重启或部署持久保存。

能力是否需要 storage原因
单次无状态回答不强制请求结束即可丢弃
Memory thread需要保存多轮消息和用户偏好
Workflow suspend/resume需要snapshot 要可恢复
Agent approval需要审批状态要等待人工操作
Observability traces需要运行记录要可查询
Scorers / eval datasets需要评估结果要可比较

教学项目使用 LibSQL 是为了让本地学习成本低。生产环境应按部署方式选择 PostgreSQL、托管数据库或其他官方支持的 storage provider。

Custom API Routes:只补业务接口 ​

Mastra 会自动暴露已注册 Agent 和 Workflow。自定义路由适合处理额外业务行为,例如健康检查、课程资料列表、导出报告。

ts
import { registerApiRoute } from '@mastra/core/server'

export const mastra = new Mastra({
  server: {
    apiRoutes: [
      registerApiRoute('/healthz', {
        method: 'GET',
        requiresAuth: false,
        handler: async c => c.json({ ok: true }),
      }),
    ],
  },
})

不要用 custom route 绕开 Agent、Tool、Workflow 的边界。能写成 Tool 的业务动作仍然写成 Tool;能写成 Workflow 的确定步骤仍然写成 Workflow。

Client SDK 与前端接入 ​

官方 Mastra Client SDK 提供从浏览器或客户端环境调用 Mastra Server 的接口。教学项目没有安装 @mastra/client-js,但正式接前端时可以按这个方向扩展:

ts
import { MastraClient } from '@mastra/client-js'

export const mastraClient = new MastraClient({
  baseUrl: process.env.MASTRA_API_URL ?? 'http://localhost:4111',
})

const agent = mastraClient.getAgent('studyAgent')
const response = await agent.generate('解释 Agent Loop')

前端集成建议:

前端需求调用方式备注
普通问答Agent .generate()简单但没有实时进度
聊天流式输出Agent .stream()UI 同时处理文本和工具状态
学习计划生成Workflow run步骤明确,便于显示进度
后台导出Custom route 或 Workflow需要鉴权和任务状态

部署取舍 ​

官方 Deployment 文档给出多种部署方式:独立 Mastra server、Monorepo、Mastra platform、云服务商、Web framework 集成、Workflow runner。

阶段推荐方式原因
本地学习mastra dev + Studio看清 Agent、Tool、Workflow 行为
小型内部工具独立 Mastra server结构简单,便于隔离密钥
已有 Web 应用集成到 Next.js / Astro 等框架复用现有鉴权和部署
长任务和定时任务Workflow runner需要重试、状态和监控
团队持续调试Mastra platform 或自建可观测系统需要 trace、log、scorer 数据

给 AI 编程工具的提示词 ​

text
请为这个 Mastra Study Agent 设计服务化接入方案。
要求:
- 不新增前端框架,只先说明 API 和安全边界。
- 说明哪些能力使用自动暴露的 Agent / Workflow endpoint。
- 说明哪些能力需要 custom API route。
- 设计 middleware:鉴权、RequestContext、resourceId 隔离、请求日志。
- 不要把 token、API Key 或 tenant secret 放进 prompt。
- 给出最小验证清单。

验证清单 ​

验证项方法
Studio 能看到注册对象npm run final:dev 后检查 Agents / Workflows
Swagger UI 能看到 API打开 /swagger-ui
未授权请求被拒绝访问受保护接口应返回 401 或 403
resource 隔离生效用户 A 不能读取用户 B 的 thread
storage 持久化生效重启后 memory thread 或 workflow snapshot 仍可恢复
RequestContext 生效不同语言或套餐触发不同工具策略
自定义路由不泄露内部信息错误响应不包含密钥、路径或堆栈

常见错误 ​

错误后果修复
把 Studio 当成用户界面内部调试信息暴露Studio 用于开发或受控团队环境
前端直接决定 resourceId用户可能越权读取历史服务端根据鉴权结果映射
custom route 里重写 Agent 逻辑行为分散,难以测试业务能力仍放 Tool / Workflow
中间件把原始 token 写进 prompt敏感信息泄露只传非敏感派生值

小练习 ​

为 Study Agent 设计一个 /api/study/summary 自定义路由。要求只返回当前认证用户的学习摘要,不允许前端传入任意 resourceId。先写出数据边界、鉴权规则和 3 条验收样例,再让 AI 生成代码。

Power by Sinan