Open4

AI SDK v5 移行 ( Mastra バックエンド )

daisaru11daisaru11

フロントエンド側の対応

  • @ai-sdk/react パッケージを 2.0 以上にあげる
  • マイグレーションガイドに codemod の使い方が書いてあったが、実行しても特にコードの変更がされなかった
    • 使い方が悪かったかも
  • 型エラーを見ながら直していく

useChat のオプションの修正

useChat の api, header オプションを指定していたので、これを transport へ移す。

import { DefaultChatTransport } from "ai";

  const chat = useChat({
    transport: new DefaultChatTransport({
      api: ...
      headers: ...
    }),

append -> sendMessage に変更

-      await append({           
-        role: "user",
-        content,
+      await sendMessage({
+        text: content,
       });

type Message を type UIMessage に変更

-import type { Message } from "@ai-sdk/react";
+import type { UIMessage } from "@ai-sdk/react";

Message.content を使っている箇所を UIMessage.parts を使うように書き換え。

experimental_prepareRequestBody -> prepareSendMessagesRequest に変更

transport に移す。

transport: new DefaultChatTransport({
   ...
   prepareSendMessagesRequest: (request) => {
daisaru11daisaru11

Mastra 側の対応

https://mastra.ai/ja/examples/agents/ai-sdk-v5-integration

https://mastra.ai/en/docs/frameworks/agentic-uis/ai-sdk#vercel-ai-sdk-v5

パッケージ更新

  • mastra を最新にアップデート
  • Claude を使っていたので、 @ai-sdk/anthropic を 2.0 以上にする

streamVNext を使うようにする


  const stream = await agent.streamVNext(
    messages,
    {
      format: "aisdk",
      ...
    },
  );

  return stream.toUIMessageStreamResponse({
    sendReasoning: true,
    headers: {
      "Transfer-Encoding": "chunked",
    },
  });

Memory から過去のメッセージを取得している箇所を v5 形式に変換

  const { uiMessages } = await memory.query({
    resourceId: chatResourceId,
    threadId,
    selectBy: {
      pagination: {
        page,
        perPage,
      },
    },
  });

  const aiv5Messages = convertMessages(uiMessages).to("AIV5.UI");
  const successResponse = {
    messages: aiv5Messages,
  };

  return c.json(successResponse);