メインコンテンツへ移動

workflowRoute()

AI SDK 形式を使用し、Workflow の実行をストリーミングするルートハンドラーを作成します。この関数は、入力データを受け取り、Workflow を実行し、レスポンスを AI SDK 互換形式でクライアントへストリーミングする HTTP POST エンドポイントを登録します。カスタム API ルート内で使用する必要があります。

フレームワークに依存しないハンドラーが必要な場合は、handleWorkflowStream() を使用してください。

workflowRoute() では、既存の AI SDK v5 のデフォルト動作が維持されます。アプリが AI SDK v6 に対して型付けされている場合は、version: 'v6' を渡してください。

Workflow での Agent ストリーミング

Workflow のステップで Agent のストリームを Workflow の writer にパイプすると(例: await response.fullStream.pipeTo(writer))、Agent が Workflow のステップ内で実行される場合でも、Agent のテキストチャンクと Tool 呼び出しがリアルタイムで UI ストリームへ転送されます。

詳しくは、Workflow のストリーミングを参照してください。

使用例
使用例への直接リンク

次の例では、ID が weatherWorkflow の Workflow を使用する Workflow ルートを、/workflow エンドポイントに設定する方法を示します。

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { workflowRoute } from '@mastra/ai-sdk'

export const mastra = new Mastra({
server: {
apiRoutes: [
workflowRoute({
path: '/workflow',
workflow: 'weatherWorkflow',
}),
],
},
})

workflowId に基づく、実行時に定義される Workflow ルーティングも使用できます。URL /workflow/weatherWorkflow は、ID が weatherWorkflow の Workflow に解決されます。

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { workflowRoute } from '@mastra/ai-sdk'

export const mastra = new Mastra({
server: {
apiRoutes: [
workflowRoute({
path: '/workflow/:workflowId',
}),
],
},
})

パラメーター
パラメーターへの直接リンク

version?:

'v5' | 'v6'
= 'v5'
出力する AI SDK ストリームのコントラクトを選択します。既存のデフォルト動作を使用するには、省略するか 'v5' を渡します。アプリが AI SDK v6 のレスポンスヘルパーに対して型付けされている場合は、'v6' を渡します。

path?:

string
= '/api/workflows/:workflowId/stream'
ルートのパス(例: /workflow または /workflow/:workflowId)。Workflow を動的にルーティングするには :workflowId を含めます。

workflow?:

string
= undefined
動的ルーティングを使用しない場合の固定 Workflow ID。

includeTextStreamParts?:

boolean
= true
出力にテキストストリームのパーツを含めるかどうか。

追加設定
追加設定への直接リンク

prepareSendMessagesRequest を使用すると、Workflow ルートへ送信するリクエストをカスタマイズできます。たとえば、Workflow に追加の設定を渡せます。

const { error, status, sendMessage, messages, regenerate, stop } = useChat({
transport: new DefaultChatTransport({
api: 'http://localhost:4111/workflow',
prepareSendMessagesRequest({ messages }) {
return {
body: {
inputData: {
city: messages[messages.length - 1].parts[0].text,
},
// Or resumeData for resuming a suspended workflow
resumeData: {
confirmation: messages[messages.length - 1].parts[0].text,
},
},
}
},
}),
})