Workspace 类
添加于: @mastra/core@1.1.0
Workspace 类将文件系统与 Sandbox 结合起来,为 Agent 提供文件存储和命令执行能力。它还支持对已索引内容进行 BM25 和向量搜索。
用法示例用法示例的直接链接
import { Workspace, LocalFilesystem, LocalSandbox } from '@mastra/core/workspace'
const workspace = new Workspace({
id: 'my-workspace',
name: 'My Workspace',
filesystem: new LocalFilesystem({
basePath: './workspace',
}),
sandbox: new LocalSandbox({
workingDirectory: './workspace',
}),
bm25: true,
autoIndexPaths: ['docs'],
})
构造函数参数构造函数参数的直接链接
id?:
name?:
filesystem?:
requestContext 并为每个请求返回文件系统的解析器函数。请参阅动态文件系统。sandbox?:
requestContext 并为每个请求返回 Sandbox 的解析器函数。请参阅动态 Sandbox。instructions.dynamicSandbox?:
sandbox 如何为 Workspace 指令提供内容。'placeholder'(默认)会输出稳定文本而不调用解析器。'resolve' 会调用解析器并使用 Sandbox 自身的指令。函数可以在不进行解析的情况下返回自定义文本。对静态 Sandbox 无影响。sandboxCacheKey?:
sandbox 所使用的稳定缓存键。设置后,解析得到的 Sandbox 会按键记忆,而不是按 RequestContext 实例记忆,因此后台进程 Tool 可以在后续请求间访问同一个 Sandbox。对静态 Sandbox 无影响。bm25?:
vectorStore?:
embedder?:
vectorStore 时必需。接受单文本函数 (text: string) => Promise<number[]>,或带有 batch: true 属性和可选 maxBatchSize 的批处理函数 (texts: string[]) => Promise<number[][]>。请参阅批量嵌入。autoIndexPaths?:
skills?:
skillSource?:
onMount?:
searchIndexName?:
tools?:
enabled?:
requireApproval?:
name?:
mastra_workspace_* 名称。配置键仍必须使用原始的 WORKSPACE_TOOLS 常量。requireReadBeforeWrite?:
maxOutputTokens?:
writeLockTimeoutMs?:
hooks?:
operationTimeout?:
Tool 配置Tool 配置的直接链接
tools 选项接受一个 WorkspaceToolsConfig 对象,用于控制启用哪些 Workspace Tool 及其安全设置。
import { Workspace } from '@mastra/core/workspace'
import { WORKSPACE_TOOLS } from '@mastra/core/workspace'
const workspace = new Workspace({
id: 'my-workspace',
name: 'My Workspace',
tools: {
// Global defaults (apply to all tools)
enabled: true,
requireApproval: false,
// Per-tool overrides using WORKSPACE_TOOLS constants
[WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: {
requireApproval: true,
},
},
})
配置对象包含两部分:
- 全局默认值(
enabled、requireApproval):应用于所有 Tool,除非被覆盖 - 逐 Tool 覆盖——使用
WORKSPACE_TOOLS常量作为键来配置单个 Tool
更多示例请参阅 Workspace 概述。
Tool 名称重映射Tool 名称重映射的直接链接
在单个 Tool 配置中设置 name 属性,即可重命名 Workspace Tool。配置键仍为原始常量:只有向 Agent 公开的名称会发生变化。
import { Workspace } from '@mastra/core/workspace'
import { WORKSPACE_TOOLS } from '@mastra/core/workspace'
const workspace = new Workspace({
id: 'my-workspace',
name: 'My Workspace',
tools: {
[WORKSPACE_TOOLS.FILESYSTEM.READ_FILE]: { name: 'view' },
[WORKSPACE_TOOLS.FILESYSTEM.GREP]: { name: 'search_content' },
},
})
所有 Workspace Tool 的名称必须唯一。如果设置的自定义名称与另一个 Tool 的默认名称或自定义名称冲突,则会抛出错误。
Tool hookTool hook的直接链接
设置 tools.hooks,可在每次启用的 Workspace Tool 调用前后运行逻辑。hook 在名称重映射之后运行,因此上下文同时包含公开的 toolName 和原始的 workspaceToolName。
import { Workspace } from '@mastra/core/workspace'
const workspace = new Workspace({
id: 'my-workspace',
tools: {
hooks: {
beforeToolCall: ({ toolName, workspaceToolName, input }) => {
console.log(`Running ${toolName} (${workspaceToolName})`, input)
},
afterToolCall: ({ toolName, output, error }) => {
console.log(`Finished ${toolName}`, { output, error })
},
},
},
})
beforeToolCall?:
{ toolName, workspaceToolName, input, context }。返回 { proceed: false, output } 可跳过 Tool 调用,并使用 output 作为调用结果。afterToolCall?:
{ toolName, workspaceToolName, input, context, output, error }。Tool 抛出错误时,output 为 undefined,而 error 会被设置。如果所属 Agent 也定义了 Tool hook,Workspace hook 会在 Agent hook 包装器内部运行。顺序为:Agent beforeToolCall → Workspace beforeToolCall → Tool → Workspace afterToolCall → Agent afterToolCall。
属性属性的直接链接
id:
name:
status:
filesystem:
undefined——请使用 hasFilesystemConfig() 检查可用性。sandbox:
undefined——请使用 hasSandboxConfig() 检查可用性。skills:
canBM25:
canVector:
canHybrid:
方法方法的直接链接
生命周期生命周期的直接链接
init()init的直接链接
初始化 Workspace 并准备资源。
await workspace.init()
在大多数情况下,调用 init() 是可选的:
- Sandbox:首次调用
executeCommand()时自动启动。使用init()可避免第一条命令的延迟。 - 文件系统:创建基础目录,并运行任何 Provider 特有的设置。某些 Provider 会在第一次操作时自动创建目录。
- 搜索:仅当使用
autoIndexPaths进行自动索引时才必需。
初始化会执行以下操作:
- 启动文件系统 Provider(如有需要,则创建基础目录)
- 启动 Sandbox Provider(创建工作目录,并在已配置时设置隔离)
- 对
autoIndexPaths中的文件建立搜索索引
destroy()destroy的直接链接
销毁 Workspace 并清理资源。
await workspace.destroy()
destroy() 会按顺序关闭 Workspace 拥有的资源:语言服务器、浏览器、Sandbox Provider 和文件系统 Provider。它还会清除缓存的 Sandbox 引用。
应用程序不再需要某个 Workspace 时,请调用 destroy()。关闭期间,mastra.shutdown() 会对已注册的 Workspace 调用该方法。要从 Mastra 注册表中移除 Workspace,请使用 mastra.removeWorkspace()。
LocalFilesystem.destroy() 不会删除磁盘上的文件。由解析器支持的文件系统和 Sandbox Provider 归应用程序所有,必须由应用程序进行清理。
搜索操作搜索操作的直接链接
index(path, content, options?)indexpath-content-options的直接链接
为内容建立搜索索引。
await workspace.index('/docs/guide.md', 'Guide content...')
search(query, options?)searchquery-options的直接链接
搜索已索引内容。
const results = await workspace.search('password reset', {
topK: 10,
mode: 'hybrid',
})
实用方法实用方法的直接链接
getInfo()getinfo的直接链接
获取 Workspace 信息。
const info = await workspace.getInfo()
// { id, name, status, createdAt, lastAccessedAt, filesystem?, sandbox? }
传入 resolveDynamicProviders: false,可以在不调用解析器的情况下,将由解析器支持的 Provider 报告为运行时定义。
const info = await workspace.getInfo({ resolveDynamicProviders: false })
参数:
options.includeFileCount?:
options.requestContext?:
resolveDynamicProviders 时,传给动态 Provider 解析器。options.resolveDynamicProviders?:
dynamic,请设为 false。getInstructions(opts?)getinstructionsopts的直接链接
返回文件系统和 Sandbox Provider 的组合指令。该内容会注入 Agent 的系统消息,帮助 Agent 理解执行上下文。
const instructions = workspace.getInstructions()
当 Provider 的 instructions 选项是一个函数时,传入 requestContext 可启用针对每个请求的自定义:
const instructions = workspace.getInstructions({ requestContext })
参数:
opts.requestContext?:
instructions 函数,则转发给该函数。返回值: string
getInstructionsAsync(opts?)getinstructionsasyncopts的直接链接
返回组合的 Workspace 指令。当 Workspace 使用由解析器支持的 Provider 时,请使用此方法。运行时定义的文件系统会按请求解析;运行时定义的 Sandbox 会提供稳定的占位文本,除非将 instructions.dynamicSandbox 设为 'resolve'。
const instructions = await workspace.getInstructionsAsync({ requestContext })
参数:
opts.requestContext?:
instructions.dynamicSandbox 为 'resolve' 时,也传给动态 Sandbox 解析器。返回值: Promise<string>
如需覆盖默认输出,请向 LocalFilesystem 或 LocalSandbox 传入 instructions 选项。
getToolsConfig()gettoolsconfig的直接链接
获取当前 Tool 配置。
const config = workspace.getToolsConfig()
返回值: WorkspaceToolsConfig | undefined
setToolsConfig(config?)settoolsconfigconfig的直接链接
在运行时替换逐 Tool 配置。此操作会完全替换,而不会与之前的配置合并。传入 undefined 可重置为默认值。更改会在下一次 Agent 交互时(即下一次调用 createWorkspaceTools() 时)生效。
import { WORKSPACE_TOOLS } from '@mastra/core/workspace'
// Disable write tools for read-only mode
workspace.setToolsConfig({
[WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: { enabled: false },
[WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: { enabled: false },
})
// Reset to defaults
workspace.setToolsConfig(undefined)
参数:
config?:
动态文件系统动态文件系统的直接链接
hasFilesystemConfig()hasfilesystemconfig的直接链接
检查是否配置了文件系统,无论是静态实例还是解析器函数。请使用此方法,而不是直接检查 workspace.filesystem,因为由解析器支持的 Workspace 会从 filesystem 属性返回 undefined。
if (workspace.hasFilesystemConfig()) {
// Filesystem tools are available
}
返回值: boolean
resolveFilesystem({ requestContext })resolvefilesystem-requestcontext-的直接链接
为请求上下文解析文件系统。配置了解析器函数时,使用提供的 requestContext 调用该函数。配置了静态文件系统时,直接返回该文件系统。未配置文件系统时返回 undefined。
import { RequestContext } from '@mastra/core/request-context'
const ctx = new RequestContext([['agent-role', 'admin']])
const fs = await workspace.resolveFilesystem({ requestContext: ctx })
参数:
requestContext:
返回值: Promise<WorkspaceFilesystem | undefined>
动态 Sandbox动态 Sandbox的直接链接
hasSandboxConfig()hassandboxconfig的直接链接
检查是否配置了 Sandbox,无论是静态实例还是解析器函数。请使用此方法,而不是直接检查 workspace.sandbox,因为由解析器支持的 Workspace 会从 sandbox 属性返回 undefined。
if (workspace.hasSandboxConfig()) {
// Sandbox tools are available
}
返回值: boolean
resolveSandbox({ requestContext })resolvesandbox-requestcontext-的直接链接
为请求上下文解析 Sandbox。配置了解析器函数时,使用提供的 requestContext 调用该函数。配置了静态 Sandbox 时,直接返回该 Sandbox。未配置 Sandbox 时返回 undefined。
import { RequestContext } from '@mastra/core/request-context'
const ctx = new RequestContext([['user-id', 'alice']])
const sandbox = await workspace.resolveSandbox({ requestContext: ctx })
参数:
requestContext:
返回值: Promise<WorkspaceSandbox | undefined>
clearSandboxCache(cacheKey?)clearsandboxcachecachekey的直接链接
清除由 sandboxCacheKey 缓存、解析器支持的 Sandbox。传入缓存键可清除一条记录,省略则清除所有按键缓存的 Sandbox 记录。
此方法不会清除按 RequestContext 缓存的弱引用。那些记录由垃圾回收机制管理。
Workspace 不拥有解析器返回的 Sandbox。此方法只会丢弃 Workspace 引用。请在自己的生命周期代码中销毁 Sandbox。
workspace.clearSandboxCache('thread-123')
workspace.clearSandboxCache()
参数:
cacheKey?:
返回值: void
Agent ToolAgent Tool的直接链接
Workspace 会根据配置向 Agent 提供 Tool。
文件系统 Tool文件系统 Tool的直接链接
配置了文件系统时添加:
| Tool | 说明 |
|---|---|
mastra_workspace_read_file | 读取文件内容。文本文件以文本形式返回(可指定行范围)。图像和 PDF 作为模型可直接查看的原生媒体部分返回。其他二进制文件默认只返回元数据,除非显式传入 encoding。 |
mastra_workspace_write_file | 创建文件或使用新内容覆盖文件。自动创建父目录。 |
mastra_workspace_edit_file | 通过查找和替换文本来编辑现有文件。适用于无需重写整个文件的针对性更改。 |
mastra_workspace_list_files | 以树形结构列出目录内容。支持带深度限制的递归列出、glob 模式和 .gitignore 过滤(默认启用)。 |
mastra_workspace_delete | 删除文件或目录。支持递归删除目录。 |
mastra_workspace_file_stat | 获取文件或目录的元数据,包括大小、类型和修改时间。 |
mastra_workspace_mkdir | 创建目录。如果父目录不存在,则自动创建。 |
mastra_workspace_grep | 使用正则表达式模式搜索文件内容。支持 glob 过滤、上下文行和不区分大小写的搜索。 |
对于静态文件系统,当文件系统处于只读模式时,不会包含写入 Tool(write_file、edit_file、delete、mkdir)。对于运行时定义的文件系统,写入 Tool 始终会包含在内,并在运行时强制执行只读限制。
read_file Tool 接受 mediaTypes 和 maxMediaBytes 选项,用于控制哪些 MIME 类型以原生媒体部分的形式向模型公开,以及这些文件的大小上限:
mediaTypes?:
['image/*'])、自定义 predicate 函数或 false(禁用媒体检测)。默认为各 Provider 安全支持的图像格式交集以及 PDF。仅当调用方未显式传入 encoding 时适用。maxMediaBytes?:
const workspace = new Workspace({
filesystem: new LocalFilesystem({ basePath: './workspace' }),
tools: {
[WORKSPACE_TOOLS.FILESYSTEM.READ_FILE]: {
// Broaden to any image (including SVG, BMP, HEIC) — may fail on some providers
mediaTypes: ['image/*'],
// Raise the inline-media cap to 25 MiB
maxMediaBytes: 25 * 1024 * 1024,
},
},
})
Sandbox ToolSandbox Tool的直接链接
配置了 Sandbox 时添加:
| Tool | 说明 |
|---|---|
mastra_workspace_execute_command | 执行 shell 命令。返回 stdout、stderr 和退出代码。当 Sandbox 有进程管理器时,接受 background: true 以生成长期运行的进程并返回 PID。 |
mastra_workspace_get_process_output | 按 PID 获取后台进程的 stdout、stderr 和状态。接受 tail 以限制输出行数,接受 wait: true 以阻塞至退出。仅在 Sandbox 有进程管理器时可用。 |
mastra_workspace_kill_process | 按 PID 终止后台进程。返回最后 50 行输出。仅在 Sandbox 有进程管理器时可用。 |
对于静态 Sandbox,能力检查(executeCommand、processes)决定公开哪些 Tool 变体。对于运行时定义的 Sandbox,会注册所有 Sandbox Tool;如果解析得到的 Sandbox 未实现所请求的能力,运行时会抛出明确错误。
execute_command Tool 接受 backgroundProcesses 选项,用于配置后台进程的生命周期回调:
backgroundProcesses?:
onStdout?:
onStderr?:
onExit?:
abortSignal?:
用法示例请参阅后台进程回调。
搜索 Tool搜索 Tool的直接链接
配置了 BM25 或向量搜索时添加:
| Tool | 说明 |
|---|---|
mastra_workspace_search | 使用关键词(BM25)、语义(向量)或混合搜索来搜索已索引内容。返回带有分数的排序结果。 |
mastra_workspace_index | 为内容建立搜索索引。将内容与路径关联,以供后续检索。 |
当文件系统处于只读模式时,不会包含 index Tool。
Skill ToolSkill Tool的直接链接
配置了 Skill 时添加:
| Tool | 说明 |
|---|---|
skill | 按名称或路径激活 Skill。返回 Skill 的完整指令、参考资料、脚本和资产。 |
skill_search | 搜索 Skill 内容。接受可选的 Skill 名称列表进行筛选,以及 topK 参数。 |
skill_read | 从 Skill 目录中读取特定文件(参考资料、脚本或资产)。 |
当多个 Skill 名称相同时,list() 会将它们全部返回。使用名称调用 get() 时会应用优先级规则(local > managed > external)。如果两个 Skill 的名称和 source type 都相同,get() 会抛出错误。向 get() 传入 Skill 的完整路径可跳过优先级规则。有关详细信息,请参阅同名 Skill。