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 hook「Tool 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 時,請使用此方法。執行階段定義的檔案系統會按請求解析;除非將 instructions.dynamicSandbox 設為 'resolve',否則執行階段定義的 Sandbox 會提供穩定的預留位置文字。
const instructions = await workspace.getInstructionsAsync({ requestContext })
參數:
opts.requestContext?:
instructions.dynamicSandbox 為 'resolve' 時,也會傳給動態 Sandbox 解析器。傳回: Promise<string>
若要覆寫預設輸出,請將 instructions 選項傳給 LocalFilesystem 或 LocalSandbox。
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 Tool「Agent 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/*'])、自訂判斷函式,或使用 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 Tool「Sandbox 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 時,會以 capability 檢查(executeCommand、processes)決定公開哪些 Tool 變體。使用 執行階段定義的 Sandbox時,會註冊所有 Sandbox Tool;若解析出的 Sandbox 未實作要求的 capability,執行階段會擲回明確錯誤。
execute_command Tool 接受 backgroundProcesses 選項,用於背景處理程序的生命週期回呼:
backgroundProcesses?:
onStdout?:
onStderr?:
onExit?:
abortSignal?:
使用範例請參閱 背景處理程序回呼。
搜尋 Tool「搜尋 Tool」的直接連結
設定 BM25 或向量搜尋時新增:
| Tool | 說明 |
|---|---|
mastra_workspace_search | 使用關鍵字(BM25)、語意(向量)或混合搜尋來搜尋已建立索引的內容。傳回含分數的排序結果。 |
mastra_workspace_index | 為內容建立搜尋索引,並將內容與路徑關聯以供後續擷取。 |
檔案系統處於唯讀模式時,不會包含 index Tool。
Skill Tool「Skill Tool」的直接連結
設定 Skill 時新增:
| Tool | 說明 |
|---|---|
skill | 依名稱或路徑啟用 Skill。傳回 Skill 的完整指示、參考資料、指令碼與資產。 |
skill_search | 跨 Skill 內容搜尋。接受用於篩選的選用 Skill 名稱清單與 topK 參數。 |
skill_read | 從 Skill 目錄讀取特定檔案(參考資料、指令碼或資產)。 |
多個 Skill 使用相同名稱時,list() 會傳回全部結果。以名稱呼叫 get() 時,會套用優先順序(local > managed > external)。如果兩個 Skill 的名稱與來源類型都相同,get() 會擲回錯誤。將 Skill 完整路徑傳給 get() 可略過優先順序判定。詳情請參閱 同名 Skill。