ai-sdk-6 について
既存の AI SDK 6 プロジェクトの開発・保守向けスキルです。導入済みバージョンに合ったドキュメントを参照し、バージョン固有の API 動作に沿って作業します。
主な機能
- 01SDK とプロバイダーの導入版を特定
- 02対応バージョンの文書と型を確認
- 03v6 のエージェントとツールのパターンを適用
- 04ストリーム、承認、エラーを検証
活用シーン
- 01AI SDK 6 を固定したアプリの保守
- 02ツールや構造化出力の実装
- 03チャット転送とストリーム動作の調査
MCP 対応
MCP 統合を行う際に、AI SDK 6 の MCP トランスポートとクリーンアップに関する文書を参照するよう案内します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ laguagu/ claude-code-nextjs-skills --skill ai-sdk-6インストール後、Claude Code で/ai-sdk-6を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/agents.mdcore-functions.mdexamples.mdmcp.mdmiddleware.mdtools.mdui-hooks.mdworkflows.md詳細
AI SDK 6 のメンテナンス
このスキルは ai@6 プロジェクトにのみ適用してください。既存のマニフェスト/ロックファイルから互換性のあるプロバイダーパッケージと UI パッケージを特定してください。メジャーバージョンが不明な場合は ai-sdk を、アップグレードが承認されている場合は ai-sdk-7 を使用してください。
解決された ai/docs/、プロバイダーのドキュメント、および正確なマイナーリリースのソース/型定義を参照してください。モノレポでは、その依存関係を使用するアプリから解決してください。デフォルトのウェブドキュメントとリポジトリの main ブランチには v7 の情報が記載されている場合があります。ai には 6.0.32 以降の docs/ が含まれており、ディレクトリ構造はウェブサイトのパスを反映しています(対応関係は ai-sdk に記載)。インストール済みのドキュメントを利用できない場合は、vercel/ai で ai@<resolved-version> タグを選択し、content/docs/ を参照してください。
ここにある機能リンクは、代替として確認済みの v6 ドキュメントスナップショットを使用します。利用可能な場合は、プロジェクトのリリースに合わせてください。このタグはドキュメントを指定するものであり、アプリケーションの依存関係バージョンを指定するものではありません。
旧コードと新コードで異なる境界
- テキスト関数では
systemを使用し、ToolLoopAgentではinstructionsを使用します。 - ループ制限には
stopWhen: stepCountIs(...)を使用します。テキスト関数のデフォルトは 1 ステップ(ツール実行後に回答を返さない)で、ToolLoopAgentのデフォルトは 20 です。 convertToModelMessagesは非同期関数です。awaitを付けてください。- 新しいスキーマ出力には
Outputを指定したテキスト関数を使用します。従来のオブジェクト関数は非推奨です。 - ツールでは
inputSchemaを使用します。SDK が実行する承認には、ツールレベルのneedsApprovalを使用します。V6 は v7 のtoolApprovalを認識しません。型チェックで拒否されない限り無視され、ツールは承認なしで実行されます。 - React の
useChatが管理するのはメッセージとストリームの状態であり、フォーム入力ではありません。適切なトランスポートと UI メッセージのレスポンスプロトコルを使用してください。 - Core の完了コールバックには
onFinishを使用します。結果のusageは最終ステップの使用量で、totalUsageはすべてのステップを対象とします。
実際のプロバイダーで検証済みの設定済みモデルを使用してください。統合を変更した後は、関連するツール/承認/エラー状態を含む複数ターンのストリームを型チェックし、テストしてください。
基本構成
[email protected]、@ai-sdk/[email protected]、[email protected]、React 19、TypeScript 5.9 で検証済みです。検証では tsc --noEmit と、モックモデルを使った 1 つのツールステップおよびその後の回答の実行を確認しました。文字列のモデルは AI Gateway 経由で解決されます。v7 では、system、stepCountIs、result.toUIMessageStreamResponse() はそれぞれ instructions、isStepCount、createUIMessageStreamResponse({ stream: toUIMessageStream({ stream: result.stream }) }) に変わります。
// app/api/chat/route.ts
import { convertToModelMessages, stepCountIs, streamText, tool, validateUIMessages,
type InferUITools, type UIDataTypes, type UIMessage } from 'ai';
import { z } from 'zod';
const tools = {
weather: tool({
inputSchema: z.object({ city: z.string() }),
execute: async ({ city }) => ({ city, celsius: 21 }),
}),
};
export type ChatMessage = UIMessage<never, UIDataTypes, InferUITools<typeof tools>>;
export async function POST(req: Request) {
const { messages } = await req.json();
const uiMessages = await validateUIMessages<ChatMessage>({ messages, tools });
const result = streamText({
model: 'provider/model-id', // configured gateway ID, or a provider instance
system: 'Answer briefly.',
messages: await convertToModelMessages(uiMessages),
tools,
stopWhen: stepCountIs(5),
});
return result.toUIMessageStreamResponse();
}
// app/page.tsx
'use client';
import { useChat } from '@ai-sdk/react';
import { DefaultChatTransport } from 'ai';
import type { ChatMessage } from './api/chat/route';
const transport = new DefaultChatTransport<ChatMessage>({ api: '/api/chat' });
export default function Chat() {
const { messages, sendMessage, status } = useChat<ChatMessage>({ transport });
return (
<form action={(form) => void sendMessage({ text: String(form.get('text')) })}>
{messages.map((m) => <div key={m.id}>{m.parts.map((part, i) =>
part.type === 'text' ? <p key={i}>{part.text}</p>
: part.type === 'tool-weather' && part.state === 'output-available'
? <p key={i}>{part.output.city}: {part.output.celsius} °C</p> : null)}</div>)}
<input name="text" disabled={status === 'submitted' || status === 'streaming'} />
</form>
);
}