「TypeScriptでAIエージェントを作るなら、結局どのフレームワークを選べばいいんだろう?」
先日、社内の開発チームでまさにこの議論が起きました。Vercel AI SDK、Inngest AgentKit、Mastra——それぞれ「TypeScript専用」を謳いながら、設計思想がまったく異なります。実際にすべてで検証Agentを構築してみて、違いが鮮明になりました。
この記事では3フレームワークを設計・Tool calling・Memory・Workflow・デプロイの5軸で徹底比較します。用途別の採用マトリクスと、よくある失敗パターン4選もあわせて解説します。コピペ可能なコード例10個以上付きで、今日から実装に入れます。
この記事でわかること
・3FW(Vercel AI SDK / Inngest AgentKit / Mastra)の設計思想の違い
・Tool calling・Memory・Workflow機能の実装レベル比較
・デプロイ先・ホスティング戦略の差
・用途別おすすめFWと採用判断マトリクス
・失敗パターン4選と回避策
対象読者: TypeScriptでAIエージェントを構築・評価している開発者・テックリード
TypeScript AIエージェントFWが2026年に熱い理由
2025年末から2026年にかけて、AIエージェント開発の主戦場がPythonからTypeScriptに移り始めています。背景は3つあります。
1つ目はフロントエンド〜バックエンドの一気通貫。Next.js・Remix主流のWeb開発チームが、エージェントロジックも同じTypeScriptスタックで書けるようになりました。Pythonのエージェントをサイドカーで動かす構成より、型安全・ビルドパイプライン共有のメリットが大きいです。
2つ目はエコシステムの成熟。Vercel AI SDKはv4.2でMCP(Model Context Protocol)クライアントを実装。Mastraは3,300モデルへのルーティングに対応。Inngest AgentKitは決定論的ルーティングという独自の設計で差別化しています。
3つ目はPythonエコシステムとの対等化。LangChain・LangGraph・CrewAIが先行しましたが、TypeScript版もツール品質・コミュニティ規模で追いついてきました。MastraのGitHub Starsは2026年3月時点で1万超え、Inngest AgentKitも急成長中です。
なお、Python系フレームワーク(LangGraph・Pydantic AI等)との比較は LangGraph v1.0完全ガイド・Pydantic AI完全ガイド を参照してください。本記事はTypeScript専用の比較です。
3FW位置付け概観:Vercel AI SDK / Inngest AgentKit / Mastra
まず3つの「立ち位置」を明確にします。
| フレームワーク | GitHub Stars(2026-05時点) | コアコンセプト | 作成元 |
|---|---|---|---|
| Vercel AI SDK | ~14,000 | プロバイダー統一インターフェース+ストリーミング | Vercel |
| Inngest AgentKit | ~2,500 | 決定論的ルーティング+耐久性実行 | Inngest |
| Mastra | ~11,000 | エージェント・ワークフロー・RAGの統合プラットフォーム | Gatsby creators |
Vercel AI SDKは「モデルに依存しない統一API」が最大の強みです。OpenAI・Anthropic・Gemini等をプロバイダー切り替えだけで使い回せ、Vercelプラットフォームとの親和性が高いです。エージェント機能は後付けで追加されており、単純なLLMアプリやストリーミングUI実装に最適です。
Inngest AgentKitは「Agentネットワークと決定論的ルーティング」を中心に据えた設計です。複数Agentをネットワークとして組み、State(共有状態)に基づいてどのAgentが次のタスクを処理するかをルーターが決めます。Inngestのキュー・リトライ・耐久性実行基盤が背景にあり、長時間バックグラウンドジョブや信頼性重視の用途に向いています。
Mastraはエージェント・ワークフロー・RAG・評価(Evals)をワンパッケージで提供する「フルスタックエージェントプラットフォーム」を目指しています。Gatsby開発チームによる作成で、開発者体験(DX)スコア9/10とNextBuild 2025での評価が高いです。Mastra単体の詳細は Mastra完全ガイド を参照してください。
設計思想・アーキテクチャ比較
3FWの根本的な設計の違いを整理します。
| 観点 | Vercel AI SDK | Inngest AgentKit | Mastra |
|---|---|---|---|
| 抽象レベル | 低〜中(プリミティブAPI) | 中(Agentネットワーク中心) | 高(フルスタック統合) |
| エージェント設計 | generateText + maxStepsによるループ | Agent + Network + Router | Agent + Workflow(グラフベース) |
| 型安全 | Zod + TypeScript | TypeScript完全対応 | TypeScript完全対応 |
| LLMプロバイダー | 20+(統一インターフェース) | OpenAI / Anthropic / Gemini 等 | 3,300+モデル(統合ルーター) |
| バックグラウンド実行 | 別途実装が必要 | Inngestキュー基盤でネイティブ対応 | ワークフローで対応(要インフラ) |
| MCP対応 | v4.2でクライアント対応 | ネイティブ対応 | ネイティブ対応(tool共有) |
重要な視点は「どこから複雑さを足すか」です。Vercel AI SDKはシンプルなAPIを拡張していくボトムアップ型。Mastraは最初からフルスタック構成を提供するトップダウン型。Inngest AgentKitはその中間で、ネットワーク設計に集中させながら実行基盤を既存Inngestに委ねています。
インストール・基本Agent定義(3FW実装比較)
それぞれのインストールと最小限のAgent定義コードを並べて比較します。
動作環境: Node.js 18+, TypeScript 5.0+(全FW共通)
Vercel AI SDK
# インストール
npm install ai @ai-sdk/openai zod
// vercel-agent.ts
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import { tool } from 'ai';
// ツール定義
const getWeatherTool = tool({
description: '指定都市の天気を取得する',
parameters: z.object({
city: z.string().describe('都市名(例: Tokyo)'),
}),
execute: async ({ city }) => {
// 実際の実装ではAPIを呼ぶ
return { temperature: 22, condition: '晴れ', city };
},
});
// エージェント実行(maxStepsでループ制御)
const result = await generateText({
model: openai('gpt-4o'),
tools: { getWeather: getWeatherTool },
maxSteps: 5, // ツール呼び出しを最大5回まで自動反復
prompt: '東京と大阪の天気を比較して教えてください',
});
console.log(result.text);
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
Inngest AgentKit
# インストール
npm install @inngest/agent-kit inngest
// inngest-agent.ts
import { createAgent, createNetwork, openai } from '@inngest/agent-kit';
// Agentの定義(役割と能力を明確に分離)
const weatherAgent = createAgent({
name: 'Weather Specialist',
description: '天気情報の取得と分析を担当',
system: '天気情報の専門家として、ユーザーの質問に正確に答えてください。',
model: openai({ model: 'gpt-4o' }),
tools: [
{
name: 'getWeather',
description: '都市の天気を取得',
parameters: { city: { type: 'string' } },
handler: async ({ city }: { city: string }) => ({
temperature: 22,
condition: '晴れ',
city,
}),
},
],
});
// ネットワーク定義(複数Agentの組み合わせ)
const weatherNetwork = createNetwork({
name: 'Weather Network',
agents: [weatherAgent],
defaultModel: openai({ model: 'gpt-4o' }),
});
// 実行
const result = await weatherNetwork.run('東京と大阪の天気を比較して');
console.log(result.output);
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
Mastra
# インストール
npm install @mastra/core @mastra/openai zod
// mastra-agent.ts
import { Agent } from '@mastra/core/agent';
import { openai } from '@mastra/openai';
import { createTool } from '@mastra/core/tools';
import { z } from 'zod';
// ツール定義(Zodスキーマで型安全に)
const getWeatherTool = createTool({
id: 'getWeather',
description: '都市の天気を取得する',
inputSchema: z.object({
city: z.string().describe('都市名'),
}),
outputSchema: z.object({
temperature: z.number(),
condition: z.string(),
city: z.string(),
}),
execute: async ({ context: { city } }) => ({
temperature: 22,
condition: '晴れ',
city,
}),
});
// Agentの定義(system promptとtoolsを統合)
const weatherAgent = new Agent({
name: 'Weather Agent',
instructions: '天気情報の専門家として、正確な情報を提供してください。',
model: openai('gpt-4o'),
tools: { getWeather: getWeatherTool },
});
// 実行
const response = await weatherAgent.generate('東京と大阪の天気を比較して');
console.log(response.text);
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ポイントはAgentの粒度の違いです。Vercel AI SDKは`generateText`にオプションを重ねる関数型アプローチ。Inngest AgentKitは`createAgent`→`createNetwork`とネットワーク設計を先に決める構造。Mastraは`Agent`クラスで命令・モデル・ツールを一元管理するオブジェクト指向的アプローチです。
Tool calling実装(Zod schema)
3FWともZodによる型安全なtool定義をサポートしていますが、スキーマの位置付けが異なります。
// Vercel AI SDK: tool()関数でZodスキーマを直接渡す
import { tool } from 'ai';
import { z } from 'zod';
const searchKnowledgeBase = tool({
description: '社内ナレッジベースを検索する',
parameters: z.object({
query: z.string().describe('検索クエリ'),
category: z.enum(['技術', '営業', '法務']).optional(),
limit: z.number().min(1).max(20).default(5),
}),
execute: async ({ query, category, limit }) => {
// 実装:ベクトル検索など
return { results: [], totalCount: 0 };
},
});
// Mastra: createTool()でinputSchema/outputSchemaを分離定義
import { createTool } from '@mastra/core/tools';
import { z } from 'zod';
const searchKnowledgeBase = createTool({
id: 'searchKnowledgeBase',
description: '社内ナレッジベースを検索する',
inputSchema: z.object({
query: z.string(),
category: z.enum(['技術', '営業', '法務']).optional(),
limit: z.number().min(1).max(20).default(5),
}),
outputSchema: z.object({
results: z.array(z.object({ id: z.string(), content: z.string() })),
totalCount: z.number(),
}),
// outputSchemaを定義することで、Agent間でのtool共有時の型検証が強化される
execute: async ({ context }) => {
return { results: [], totalCount: 0 };
},
});
Mastraの`outputSchema`定義はMCP経由でtoolを複数Agent間で共有する際に特に有効です。Vercel AI SDKはinputスキーマのみで完結する場合が多く、シンプルな用途には十分です。
Memory / State管理の違い
長時間会話や複数セッションにわたる状態保持の仕組みが3FWで大きく異なります。
| 項目 | Vercel AI SDK | Inngest AgentKit | Mastra |
|---|---|---|---|
| スレッドメモリ | 手動実装(`messages`配列管理) | Networkの`state`オブジェクトで共有 | Thread-basedメモリ(組み込み) |
| セマンティック検索 | 別途RAGを実装 | なし(外部連携) | 組み込みRAG(ベクトルDB連携) |
| クロスセッション | 要外部DB | Inngestのpersistent state | Redis / PostgreSQL対応(@mastra/redis) |
| Agentへの自動注入 | なし(手動で`messages`に追記) | Network stateを全Agentが参照 | 自動(thread IDで紐付け) |
Inngest AgentKitのState管理は独特で、ネットワーク内のすべてのAgentが同一のStateオブジェクトを読み書きできます。マルチAgent協調タスクでは特に強力ですが、Stateのスキーマ設計を最初に丁寧に決める必要があります。
// Inngest AgentKit: State-based routing の例
import { createNetwork, createRoutingAgent } from '@inngest/agent-kit';
const router = createRoutingAgent({
name: 'Task Router',
description: 'タスクの種類に応じてAgentを選択',
system: (network) => {
// Stateを参照してルーティングを動的に決定
const { completedTasks, pendingTasks } = network.state.data;
return `完了済み: ${completedTasks.length}件, 残り: ${pendingTasks.length}件。次の優先タスクを処理してください。`;
},
model: openai({ model: 'gpt-4o' }),
});
const network = createNetwork({
name: 'Task Network',
agents: [researchAgent, writingAgent, reviewAgent],
router,
state: {
completedTasks: [],
pendingTasks: ['調査', '執筆', 'レビュー'],
},
});
Workflow(決定的フロー)対応
LLMに判断を任せず、コードで制御する「決定的ワークフロー」の対応度を比較します。
| 機能 | Vercel AI SDK | Inngest AgentKit | Mastra |
|---|---|---|---|
| 逐次実行 | 手動でawait連結 | Inngestステップ関数で組み込み | .then()チェーン |
| 並列実行 | Promise.all | Inngest並列ステップ | .parallel() |
| 条件分岐 | if/else | ステップ条件 | .branch() |
| エラーリトライ | 要自前実装 | Inngestで自動(exponential backoff) | ワークフローレベルで設定可能 |
| 長時間ジョブ | Edge/Serverlessのタイムアウト制約あり | Inngestで数時間〜数日の実行可能 | デプロイ環境依存 |
// Mastra: グラフベースワークフローの定義
import { Workflow, Step } from '@mastra/core/workflows';
import { z } from 'zod';
const contentPipelineWorkflow = new Workflow({
name: 'content-pipeline',
triggerSchema: z.object({ topic: z.string() }),
});
const researchStep = new Step({
id: 'research',
execute: async ({ context }) => {
const { topic } = context.triggerData;
// リサーチAgentを呼び出す
return { summary: `${topic}のリサーチ結果`, sources: [] };
},
});
const writingStep = new Step({
id: 'writing',
execute: async ({ context }) => {
const { summary } = context.getStepResult('research');
// ライティングAgentを呼び出す
return { draft: `${summary}をもとに書いた記事` };
},
});
contentPipelineWorkflow
.step(researchStep)
.then(writingStep)
.commit();
// 実行
const run = await contentPipelineWorkflow.createRun();
await run.start({ triggerData: { topic: 'AIエージェント' } });
Observability / トレーシング
本番運用に欠かせない可観測性の対応度を比較します。
| 項目 | Vercel AI SDK | Inngest AgentKit | Mastra |
|---|---|---|---|
| トレーシング標準 | OpenTelemetry(要設定) | Inngest Dev Server(組み込み) | OpenTelemetry(組み込み) |
| 外部連携 | 任意のOTelバックエンド | Inngest Cloudダッシュボード | Langfuse / LangSmith / Arize / Sentry等 |
| ローカル開発 | コンソールログ手動設定 | Inngest Dev Server(リアルタイムUI) | Mastra Studio(ブラウザUI) |
| コスト追跡 | 要自前実装 | Inngest Cloud(ジョブ単位) | トークン使用量・レイテンシ・コスト統合 |
Inngest AgentKitはローカル開発での体験が特に優れています。`npx inngest-cli@latest dev`を起動するだけで、ブラウザからAgentの実行履歴・入出力・リトライ状況をリアルタイムに確認できます。MastraのStudioも同様のUI体験を提供しますが、OpenTelemetryによる外部ツール連携の幅広さが強みです。
ホスティング・デプロイ前提の違い
3FWはデプロイ先・インフラ前提が根本的に異なります。ここを理解しないまま選ぶと後から詰まります。
| FW | 推奨デプロイ先 | サーバーレス対応 | Self-hosted | 特記事項 |
|---|---|---|---|---|
| Vercel AI SDK | Vercel(Edge Functions / Serverless) | ◎(設計がVercel前提) | ○(Node.js/Dockerでも動く) | Edge Functionsのタイムアウト制約に注意 |
| Inngest AgentKit | Inngest Cloud + 任意のホスト | ◎(Inngestキューで長時間対応) | △(Inngest Cloudへの依存あり) | 長時間ジョブに最適、Inngest無料枠あり |
| Mastra | Vercel / Netlify Edge / Self-hosted | ○(NetlifyEdge対応) | ◎(Mastra Serverで完全制御可能) | SSO/RBAC付きのプラットフォーム版あり |
事例区分: 想定シナリオ
以下は複数の構築プロジェクト経験をもとに構成した典型的なシナリオです。
- Vercelで全スタック完結: Next.jsアプリにチャット機能を追加する場合、Vercel AI SDKが最短距離。ストリーミングUIとAPI Routesの統合がシームレスです。
- 長時間バックグラウンド処理: ドキュメント解析や夜間バッチのAIパイプラインなら、Inngest AgentKitのキュー耐久性実行が適切。Vercel Serverlessの60秒制約を気にせず済みます。
- エージェントをAPI化して外部提供: MastraのServer機能でAgentをREST API・OpenAPI仕様付きで公開できます。B2B SaaSや社内プラットフォームへの統合に向いています。
採用判断マトリクス(用途別おすすめ)
| 用途 | 推奨FW | 理由 |
|---|---|---|
| Next.jsアプリへのチャット追加 | Vercel AI SDK | ストリーミングUI・Edge対応が最速 |
| マルチAgent協調・複雑な役割分担 | Inngest AgentKit | Network/Router設計が最も整理されている |
| 長時間バックグラウンドAIパイプライン | Inngest AgentKit | Inngestキューで数時間ジョブに対応 |
| RAG付きナレッジベースAgent | Mastra | RAG・メモリ・エージェントが統合済み |
| AgentをAPIとして外部提供 | Mastra | Server機能でREST+OpenAPI自動生成 |
| プロトタイプ・PoC(最短立ち上げ) | Vercel AI SDK | 抽象レベルが低くシンプルに始められる |
| エンタープライズ(SSO/RBAC必要) | Mastra | Mastra Platform版でSSO/RBAC対応 |
| LLMプロバイダーを頻繁に切り替える | Vercel AI SDK | プロバイダー統一インターフェースが最強 |
ポイント: 単純なLLM呼び出し→Vercel AI SDK。Agentネットワーク設計→Inngest AgentKit。エージェント基盤の統合プラットフォーム→Mastraという住み分けが現時点での実際のところです。3つを混在させること自体は技術的に可能ですが、保守性のために1プロジェクト1FWを推奨します。
【要注意】よくある失敗パターン4選
失敗1: Vercel AI SDKで長時間Agentを動かす
❌ Vercel Edge FunctionsでAgent Loopを回す(maxSteps=20など)
⭕ 長時間ジョブはInngest AgentKitのキューに逃がすか、Node.jsサーバーで実行する
なぜ問題か: Edge Functions・Serverless Functionsには実行時間上限(Vercel Hobbyは最大60秒)があります。`maxSteps`を大きくしてもタイムアウトで強制終了します。LLM呼び出しを複数回繰り返すAgentでは特に注意が必要です。
失敗2: Inngest AgentKitのStateを設計せずに始める
❌ とりあえずAgentとNetworkを定義し、Stateを空のオブジェクトにする
⭕ 最初にStateのスキーマ(何を蓄積し何をルーターが参照するか)を設計してから実装する
なぜ問題か: AgentKit最大の強みは「State-based routing」です。Stateを使いこなせないと、通常の`generateText`と変わらない実装になります。複数Agentが何の情報を共有するかを事前に決めることが品質の鍵です。
失敗3: MastraにRAGなし・組み込み機能を使わない
❌ MastraでAgentだけ定義し、MemoryやRAGは自前で別ライブラリを組み合わせる
⭕ MastraのMemoryシステム・Knowledge Baseを使い切ってから外部を検討する
なぜ問題か: Mastraを選ぶ理由の一つはフルスタック統合です。自前でPinecone等を組み合わせると、Mastraのオブザーバビリティ・Studioのトレーシングから外れたコードが増えて管理コストが増大します。
失敗4: 3FWのどれかをフロントからバックから全部に使おうとする
❌ 「Mastraで全て解決できるはず」とVercel AI SDKのstreamingUI機能も自前実装しようとする
⭕ フロントのストリーミングUIはVercel AI SDK、バックのAgentロジックはMastraという分業を検討する
なぜ問題か: 3FWは互いに補完できます。`useChat`フックはVercel AI SDKが最も洗練されており、バックエンドのエージェントロジックをMastraやInngestで実装する構成は実際に有効です。「1つで全解決」思考で選ぶと、不得意な領域で詰まります。
まとめ:今日から始める3つのアクション
- 今日やること: 用途を決め、上記の採用判断マトリクスで1FWに絞る。「プロトタイプならVercel AI SDK」「マルチAgent協調ならInngest」「フルスタックならMastra」。
- 今週中: 本記事のインストールコードで最小限のAgentを動かし、Tool callingとMemoryの挙動を確認する。
- 今月中: 選んだFWの公式ドキュメントのExamplesセクションを全件確認し、本番相当のワークフローを1つ実装する。
あわせて読みたい:
- Mastra完全ガイド2026|TypeScript AIエージェントフレームワーク — Mastraの詳細実装
- LangGraph v1.0完全ガイド — Python系ワークフローエンジンとの比較に
- Pydantic AI完全ガイド — 型安全なPython系Agentフレームワーク
この記事を読んで導入イメージが固まってきた方へ
UravationではAIエージェント導入の研修・コンサルを行っています。TypeScriptスタックでのエージェント構築支援も対応しています。
参考・出典
- AI SDK 4.2 — Vercel Blog(参照日: 2026-05-06)
- AgentKit Overview — Inngest(参照日: 2026-05-06)
- Build Agents with a Modern TypeScript Stack — Mastra(参照日: 2026-05-06)
- vercel/ai — GitHub(参照日: 2026-05-06)
- inngest/agent-kit — GitHub(参照日: 2026-05-06)
- mastra-ai/mastra — GitHub(参照日: 2026-05-06)
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。X(@SuguruKun_ai)フォロワー10万人超。100社以上の企業向けAI研修・導入支援。著書累計3万部突破。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。