Open4
AI SDK v5 移行 ( Mastra バックエンド )
- AI SDK v5 がリリースされていた: https://vercel.com/blog/ai-sdk-5
- Mastra も AI SDK v5 対応がリリースされていた: https://github.com/mastra-ai/mastra/releases/tag/%40mastra%2Fcore%400.14.0
前提
- Mastra を組み込んだバックエンドサーバがある
- フロントとは、 ai-sdk の useChat を使って統合している (React)
- この方式: https://mastra.ai/ja/examples/memory/use-chat
フロントエンド側の対応
-
@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) => {
Mastra 側の対応
パッケージ更新
- 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);