Run.timeTravel()
.timeTravel() 方法會從任一特定步驟開始重新執行 Workflow,並使用已儲存的快照資料或你提供的自訂情境。可用它偵錯失敗的 Workflow,或使用不同輸入測試個別步驟。它也能在不重新執行整個 Workflow 的情況下從錯誤中復原。
使用範例「使用範例」的直接連結
const run = await workflow.createRun()
const result = await run.timeTravel({
step: 'step2',
inputData: { value: 10 },
})
參數「參數」的直接連結
step:
Step<string, any, TInputSchema, any, any, any, TEngineType> | [...Step<string, any, any, any, any, any, TEngineType>[], Step<string, any, TInputSchema, any, any, any, TEngineType>] | string | string[]
要從中開始執行的目標步驟。可為 Step 執行個體、Step 陣列(用於巢狀 Workflow)、步驟 ID 字串或步驟 ID 字串陣列。巢狀 Workflow 步驟請使用點號標記法或陣列(例如 'nestedWorkflow.step3' 或 ['nestedWorkflow', 'step3'])
inputData?:
z.infer<TInputSchema>
目標步驟的輸入資料,必須符合該步驟的輸入 schema。若未提供,則使用 Workflow 快照中的資料
resumeData?:
any
若 Workflow 先前已暫停,要提供的繼續執行資料
initialState?:
z.infer<TState>
要為 Workflow run 設定的初始狀態。用於在執行前設定 Workflow 層級狀態
context?:
TimeTravelContext<any, any, any, any>
包含目標步驟之前各步驟結果的執行情境。每個 key 都是步驟 ID,其 StepResult 物件包含 status、payload、output、startedAt、endedAt、suspendPayload 與 resumePayload
nestedStepsContext?:
Record<string, TimeTravelContext<any, any, any, any>>
巢狀 Workflow 步驟的情境。以巢狀 Workflow ID 作為 key,每個值都包含該巢狀 Workflow 的步驟結果
requestContext?:
RequestContext
time travel 執行期間要使用的 Request Context 資料
outputWriter?:
(chunk: TOutput) => Promise<void>
在產生輸出區塊時處理這些區塊的選用非同步函式
tracingContext?:
TracingContext
用來建立子 span 及新增中繼資料的 Tracing context。使用 Mastra 的 tracing 系統時會自動注入。
currentSpan?:
Span
用來建立子 span 及新增中繼資料的目前 span。執行期間可用它建立自訂子 span 或更新 span 屬性。
tracingOptions?:
TracingOptions
Tracing 設定選項。
metadata?:
Record<string, any>
要新增至根 Trace span 的中繼資料。適合新增使用者 ID、工作階段 ID 或功能旗標等自訂屬性。
requestContextKeys?:
string[]
要擷取為此 Trace 中繼資料的其他 RequestContext key。支援以點號標記法表示巢狀值(例如 'user.id')。
traceId?:
string
此執行要使用的 Trace ID(1 至 32 個十六進位字元)。若有提供,此 Trace 會成為指定 Trace 的一部分。
parentSpanId?:
string
此執行要使用的父 span ID(1 至 16 個十六進位字元)。若有提供,根 span 會建立為此 span 的子 span。
tags?:
string[]
要套用至此 Trace 的標籤。這些字串標籤可用來分類及篩選 Trace。
outputOptions?:
OutputOptions
輸出設定選項。
includeState?:
boolean
是否在結果中包含 Workflow run 狀態。
includeResumeLabels?:
boolean
是否在結果中包含 resume label。
回傳值「回傳值」的直接連結
result:
Promise<WorkflowResult<TState, TInput, TOutput, TSteps>>
會解析為 Workflow 執行結果的 promise;結果包含步驟輸出與狀態
traceId?:
string
啟用 Tracing 時,與此執行相關聯的 Trace ID。可用來關聯記錄及偵錯執行流程。
spanId?:
string
啟用 Tracing 時,與此執行相關聯的根 span ID。可用於 span 層級的查找與關聯。
延伸使用範例「延伸使用範例」的直接連結
使用自訂情境進行 time travel「使用自訂情境進行 time travel」的直接連結
const result = await run.timeTravel({
step: 'step2',
context: {
step1: {
status: 'success',
payload: { value: 0 },
output: { step1Result: 2 },
startedAt: Date.now(),
endedAt: Date.now(),
},
},
})
Time travel 至巢狀 Workflow 步驟「Time travel 至巢狀 Workflow 步驟」的直接連結
// Using dot notation
const result = await run.timeTravel({
step: 'nestedWorkflow.step3',
inputData: { value: 10 },
})
// Using array of step IDs
const result = await run.timeTravel({
step: ['nestedWorkflow', 'step3'],
inputData: { value: 10 },
})
使用初始狀態進行 time travel「使用初始狀態進行 time travel」的直接連結
const result = await run.timeTravel({
step: 'step2',
inputData: { value: 10 },
initialState: {
counter: 5,
metadata: { source: 'time-travel' },
},
})
使用巢狀 Workflow 情境進行 time travel「使用巢狀 Workflow 情境進行 time travel」的直接連結
const result = await run.timeTravel({
step: 'nestedWorkflow.step3',
context: {
step1: {
status: 'success',
payload: { value: 0 },
output: { step1Result: 2 },
startedAt: Date.now(),
endedAt: Date.now(),
},
nestedWorkflow: {
status: 'running',
payload: { step1Result: 2 },
startedAt: Date.now(),
},
},
nestedStepsContext: {
nestedWorkflow: {
step2: {
status: 'success',
payload: { step1Result: 2 },
output: { step2Result: 3 },
startedAt: Date.now(),
endedAt: Date.now(),
},
},
},
})
注意事項「注意事項」的直接連結
- Time travel 仰賴已保存的 Workflow 快照,因此需要設定儲存空間
- 重新執行 Workflow 時,Workflow 會從儲存空間載入現有快照(若有)
- 系統會根據快照或提供的情境,重建目標步驟之前的步驟結果
- 系統會使用提供或重建的輸入資料,從指定步驟開始執行
- Workflow 會從該處繼續執行至完成
- 即使 Workflow 尚未執行過,也可以透過提供自訂情境或起始步驟的輸入資料來使用 time travel。