跳至主要內容

動態 Workflow 定義

beta

動態 Workflow 目前處於 beta 階段。在 API 穩定前,即使未提高主要版本,也可能包含破壞性變更。

動態 Workflow 定義是與 JSON 相容的 DynamicWorkflowGraph,可由 Mastra.addDynamicWorkflow()、已儲存 Workflow 的伺服器路由,以及 Client SDK workflows API 接受。

完整設定與使用範例請參閱動態 Workflow

定義欄位
「定義欄位」的直接連結

欄位型別必填說明
idstring唯一的 Workflow ID。這也是用來擷取與執行 Workflow 的 ID。
descriptionstring人類可讀的說明
inputSchemaJsonSchemaWorkflow 輸入的 JSON Schema
outputSchemaJsonSchemaWorkflow 輸出的 JSON Schema
stateSchemaJsonSchema共用 Workflow 狀態的 JSON Schema
requestContextSchemaJsonSchema從 request context 讀取之值的 JSON Schema
metadataRecord<string, unknown>儲存時會保留的任意 JSON 中繼資料
graphSerializedStepFlowEntry[]組成 Workflow 的步驟項目

Schema 使用 JSON Schema 而非 Zod,讓定義能完整寫入 JSON 後再還原。Mastra 註冊 Workflow 時,會將每個 schema 轉換為 Zod。

{
"id": "greeting-workflow",
"description": "Returns a greeting for the supplied name",
"inputSchema": {
"type": "object",
"properties": { "name": { "type": "string" } },
"required": ["name"]
},
"outputSchema": {
"type": "object",
"properties": { "message": { "type": "string" } },
"required": ["message"]
},
"graph": [
{
"type": "mapping",
"id": "create-greeting",
"mapConfig": "{\"message\":{\"template\":\"Hello, ${initData.name}!\"}}"
}
]
}

圖項目
「圖項目」的直接連結

graph 中的項目會依序執行。每個項目都會接收前一個項目的輸出,第一個項目則會接收 Workflow 輸入。

項目型別說明
agent叫用已註冊的 Agent
tool叫用已註冊的 Tool
mapping在步驟之間重新組織資料
workflow以巢狀步驟的形式叫用已註冊的 Workflow
parallel同時執行多個步驟並合併其輸出
conditional同時執行 predicate 為 true 的每個分支
foreach針對陣列輸入的每個項目執行一個步驟
loop在 predicate 成立期間,或直到成立為止,重複執行步驟
sleep暫停固定時間
sleepUntil暫停至固定日期

使用 .agent().tool() 的程式碼定義 Workflow,在序列化時會產生相同的宣告式項目。

Agent 步驟
「Agent 步驟」的直接連結

agent 項目會依 ID 叫用已註冊的 Agent。Agent 步驟接受 { prompt: string } 作為輸入,預設回傳 { text: string }

{
"type": "agent",
"id": "summarize",
"agentId": "support-agent"
}

id 用來識別 Workflow 中的這個呼叫位置。無論 Agent 本身的 ID 為何,後續步驟都會以 stepResults.summarize 存取結果。

新增 outputSchema,即可向 Agent 要求結構化輸出:

{
"type": "agent",
"id": "extract-subtopics",
"agentId": "support-agent",
"outputSchema": {
"type": "array",
"items": {
"type": "object",
"properties": { "title": { "type": "string" } },
"required": ["title"]
}
}
}

在 Agent 之前使用 mapping 項目,即可根據 Workflow 資料建立其 { prompt } 輸入。

Agent 項目接受選用的 descriptionoptions 物件:

{
"type": "agent",
"id": "summarize",
"agentId": "support-agent",
"description": "Summarize the incoming request",
"options": { "retries": 2, "metadata": { "team": "support" } }
}

只有 retriesmetadata 會保存。儲存程式碼定義的 Workflow 時,值為函式的 onFinishtoolChoice 等選項會遭拒絕。其他 Agent 呼叫選項不會保存。

Tool 步驟
「Tool 步驟」的直接連結

tool 項目會透過 Mastra tools 物件中的註冊 key 叫用 Tool。Mastra 註冊 Workflow 時,會從登錄檔解析 Tool 的輸入與輸出 schema。

{
"type": "tool",
"id": "lookup",
"toolId": "lookup-customer"
}

Tool 項目接受與 Agent 項目相同的選用 descriptionoptions 欄位。只有 retriesmetadata 會保存。

Mapping 步驟
「Mapping 步驟」的直接連結

mapping 項目會重新組織資料。其 mapConfig 是編碼物件的 JSON 字串。每個 key 都會成為步驟輸出中的 key,每個 descriptor 則定義一個來源。

Descriptor說明
{ "value": ... }固定 JSON 值
{ "template": "..." }${...} 預留位置建立的字串
{ "initData": true, "path": "a.b" }來自 Workflow 輸入的值
{ "step": "step-id", "path": "a.b" }來自前一步驟輸出的值
{ "requestContextPath": "a.b" }來自 request context 的值

step 來源也接受步驟 ID 陣列:

{ "step": ["escalate", "auto-reply"], "path": "text" }

第一個具有非空結果的列出步驟會提供該值。這可用來選取 conditional 項目後實際執行的分支。

Template 會針對 initDatainputDatastaterequestContextstepResults.<step-id> 解析預留位置:

{
"type": "mapping",
"id": "build-prompt",
"mapConfig": "{\"prompt\":{\"template\":\"Summarize this request: ${initData.request}\"}}"
}

Template 解析出的物件與陣列會字串化為 JSON。存在結果中的 null 值會轉譯為空字串。若 template 參照的步驟沒有成功輸出,run 就會失敗。

Mapping 項目必須是頂層圖項目,不能放在 parallelconditionalforeachloop 容器內。

巢狀 Workflow 步驟
「巢狀 Workflow 步驟」的直接連結

workflow 項目會叫用另一個已註冊的 Workflow。目標可以由程式碼定義,也可以是已儲存的 Workflow。

{
"type": "workflow",
"id": "lookup-first",
"workflowId": "lookup-customer-workflow"
}

id 用來識別呼叫位置。同一個巢狀 Workflow 可在不同呼叫位置 ID 下出現多次,後續步驟則以 stepResults.<id> 存取各自的結果。workflow 項目也接受選用的 description

Parallel 項目
「Parallel 項目」的直接連結

parallel 項目會同時執行多個單一步驟,並將其輸出合併為以步驟 ID 作為 key 的物件。

{
"type": "parallel",
"steps": [
{ "type": "tool", "id": "first", "toolId": "lookup-customer" },
{ "type": "tool", "id": "second", "toolId": "lookup-customer" }
]
}

每個子項目都必須是 agenttoolworkflow 項目。所有子項目都會直接接收 parallel 項目的輸入。

Conditional 項目
「Conditional 項目」的直接連結

conditional 項目會將每個步驟與宣告式 predicate 配對,並執行 predicate 為 true 的每個分支。

{
"type": "conditional",
"steps": [
{ "type": "agent", "id": "escalate", "agentId": "support-agent" },
{ "type": "agent", "id": "auto-reply", "agentId": "support-agent" }
],
"predicates": [
{ "op": "eq", "left": { "path": "inputData.priority" }, "right": { "literal": "urgent" } },
{ "op": "ne", "left": { "path": "inputData.priority" }, "right": { "literal": "urgent" } }
]
}

每個子項目都必須是 agenttoolworkflow 項目,且每個子項目都需要 predicate。所有子項目都會直接接收 conditional 項目的輸入。

Predicate
「Predicate」的直接連結

Conditional 項目與迴圈使用 JSON predicate DSL。運算元是 { "path": "..." } 參照或 { "literal": ... } 值。路徑會針對 initDatainputDatastepResultsstate 解析。

運算子結構
eq, ne, lt, lte, gt, gte{ "op": "eq", "left": ..., "right": ... }
in, notIn{ "op": "in", "value": ..., "set": [...] }
exists, notExists{ "op": "exists", "path": "..." }
truthy, falsy{ "op": "truthy", "value": ... }
and, or{ "op": "and", "args": [...] }
not{ "op": "not", "arg": ... }

缺少路徑不會擲回錯誤。無法解析路徑時,以路徑為基礎的運算子會回傳 false。使用 existsnotExists,可分辨缺少值與 falsy 值。

Foreach 項目
「Foreach 項目」的直接連結

foreach 項目會針對陣列輸入中的每個項目執行一次本體。前一個項目必須產生原始陣列。結果會保留輸入順序,並行數量預設為 1

{
"type": "foreach",
"step": { "type": "workflow", "id": "write-blurb", "workflowId": "blurb-workflow" },
"opts": { "concurrency": 3 }
}

本體可以是 agenttoolworkflow 項目,但不能是 mapping 項目。

Loop 項目
「Loop 項目」的直接連結

loop 會在 predicate 成立期間(dowhile),或直到 predicate 成立為止(dountil),重複執行一個步驟。

{
"type": "loop",
"loopType": "dountil",
"step": { "type": "tool", "id": "poll", "toolId": "check-status" },
"predicate": {
"op": "eq",
"left": { "path": "inputData.status" },
"right": { "literal": "done" }
}
}

迴圈本體必須是單一步驟,已儲存的迴圈則需要宣告式 predicate。

Sleep 項目
「Sleep 項目」的直接連結

sleep 項目會暫停固定毫秒數。sleepUntil 項目會暫停至以 ISO 日期字串表示的固定日期。已儲存定義需要常值。

{ "type": "sleep", "id": "wait", "duration": 5000 }
{ "type": "sleepUntil", "id": "wait-for-launch", "date": "2027-01-01T00:00:00.000Z" }

若持續時間或日期必須在執行階段計算,請使用程式碼定義的 Workflow。

驗證
「驗證」的直接連結

Mastra 會先驗證定義,再加以保存或註冊:

  • 結構:項目結構與必填欄位,包括 mapping 只能位於頂層等放置規則。
  • 參照:每個 agentIdworkflowId 都必須能從即時登錄檔或同一個 bundle 解析。toolId 必須符合 Tool 註冊 key。
  • Schema 流程:每個項目的輸入都必須與前一個輸出相容,包括推斷的 mapping 輸出。

驗證錯誤會包含點號路徑,例如 graph.2.steps.0,用來指出無效項目。