エラーハンドリング
Mastra には、一時的なエラーで失敗したワークフローやステップを再試行するための組み込みリトライ機能があります。これは、一時的に利用できなくなる可能性のある外部サービスやリソースとやり取りするステップに特に有用です。
ワークフロー全体での retryConfig
の使用
ワークフロー内のすべてのステップに適用されるよう、ワークフロー単位でリトライ設定を行えます:
src/mastra/workflows/test-workflow.ts
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({...});
export const testWorkflow = createWorkflow({
// ...
retryConfig: {
attempts: 5,
delay: 2000
}
})
.then(step1)
.commit();
retries
を用いたステップ単位の設定
各ステップごとに retries
プロパティでリトライ回数を設定できます。これにより、そのステップについてはワークフローレベルのリトライ設定が上書きされます。
src/mastra/workflows/test-workflow.ts
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
// ...
execute: async () => {
const response = await // ...
if (!response.ok) {
throw new Error('Error');
}
return {
value: ""
};
},
retries: 3
});
条件分岐
条件ロジックを用いて、前のステップの成否に応じて代替のワークフロー経路を作成できます:
src/mastra/workflows/test-workflow.ts
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
// ...
execute: async () => {
try {
const response = await // ...
if (!response.ok) {
throw new Error('error');
}
return {
status: "ok"
};
} catch (error) {
return {
status: "error"
};
}
}
});
const step2 = createStep({...});
const fallback = createStep({...});
export const testWorkflow = createWorkflow({
// ...
})
.then(step1)
.branch([
[async ({ inputData: { status } }) => status === "ok", step2],
[async ({ inputData: { status } }) => status === "error", fallback]
])
.commit();
直前のステップ結果を確認する
getStepResult()
を使って、以前のステップの結果を参照します。
src/mastra/workflows/test-workflow.ts
import { createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({...});
const step2 = createStep({
// ...
execute: async ({ getStepResult }) => {
const step1Result = getStepResult(step1);
return {
value: ""
};
}
});
bail()
で早期終了する
ステップ内で bail()
を使うと、成功として早期に終了できます。指定したペイロードがステップの出力として返され、ワークフローの実行が終了します。
src/mastra/workflows/test-workflow.ts
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
id: 'step1',
execute: async ({ bail }) => {
return bail({ result: 'bailed' });
},
inputSchema: z.object({ value: z.string() }),
outputSchema: z.object({ result: z.string() }),
});
export const testWorkflow = createWorkflow({...})
.then(step1)
.commit();
Error()
で早期終了する
エラーで処理を終了するには、ステップ内で throw new Error()
を使用します。
src/mastra/workflows/test-workflow.ts
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
id: 'step1',
execute: async () => {
throw new Error('error');
},
inputSchema: z.object({ value: z.string() }),
outputSchema: z.object({ result: z.string() }),
});
export const testWorkflow = createWorkflow({...})
.then(step1)
.commit();
watch()
でエラーを監視する
watch
メソッドを使って、ワークフローのエラーを監視できます:
src/test-workflow.ts
import { mastra } from "../src/mastra";
const workflow = mastra.getWorkflow("testWorkflow");
const run = await workflow.createRunAsync();
run.watch((event) => {
const {
payload: { currentStep }
} = event;
console.log(currentStep?.payload?.status);
});
## stream()
でエラーを監視する
stream
を使って、ワークフローのエラーを監視できます:
src/test-workflow.ts
import { mastra } from "../src/mastra";
const workflow = mastra.getWorkflow("testWorkflow");
const run = await workflow.createRunAsync();
const stream = await run.stream({
inputData: {
value: "initial data"
}
});
for await (const chunk of stream.stream) {
console.log(chunk.payload.output.stats);
}