1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TanStack AI 解説:React/Next.js で使う AI SDK の基本と実装例

Last updated at Posted at 2025-12-13

本記事はtacoms Advent Calendar 2025 の 14 日目の記事です。

1. はじめに

本記事の位置づけ

本記事は、TanStack AI にフォーカスした技術解説記事です。

LLM 系 SDK は数多く存在しますが、本記事では比較は行わず、
「TanStack AI は何が楽で、どこに割り切りがあるのか」を明らかにすることを目的とします。

具体的には、

  • TanStack AI は どんな思想で設計されているのか
  • React / Next.js の文脈で どこが楽で、どこが割り切りなのか

を、実装ベースで解説します。


TanStack AI とは何か

TanStack AI は、TypeScript / JavaScript 向けのオープンソース AI SDK です。
OpenAI、Anthropic(Claude)、Gemini、Ollama など、複数の LLM プロバイダーを 統一 API で扱えるよう設計されています。

TanStack Query / Router を開発してきた TanStack チームによる SDK で、

  • 型安全
  • ストリーミング対応
  • UI との親和性

を強く意識した設計が特徴です。

※ 2025年12月現在、アルファ版として公開されています。APIは今後変更される可能性があります。


想定読者とゴール

想定読者

  • React / Next.js / TypeScript を日常的に使っている
  • LLM を「まず UI に組み込みたい」
  • LangChain ほど重い抽象化は今は不要

本記事のゴール

  • TanStack AI が 自分のプロダクトに向いているか 判断できる
  • 強みだけでなく、向いていないケースも把握できる

2. TanStack AI の思想と設計

「AI をライブラリとして扱う」設計

TanStack AI の最大の特徴は、
AI を特別な存在として扱わず、通常のライブラリと同じ感覚で使える点にあります。

  • provider(LLM)を adapter として抽象化
  • 関数呼び出しベースの API
  • フレームワーク非依存

これにより、

UI 側のコードを書きながら、自然に AI を組み込む

という体験が実現されています。


他 SDK との思想的な違い

  • LangChain:ワークフロー・RAG・エージェント志向
  • Vercel AI SDK:Next.js / React との統合が強力
  • TanStack AI:UI 統合最優先・最小抽象化

TanStack AI は「UI 中心」のポジションにいる SDK です。


3. Hello TanStack AI

インストール

npm install @tanstack/ai @tanstack/ai-openai

chat() の基本

import { chat } from '@tanstack/ai';
import { openai } from '@tanstack/ai-openai';

const stream = chat({
  adapter: openai(),
  model: 'gpt-4o',
  messages: [{ role: 'user', content: 'Hello!' }],
});
  • adapter を切り替えるだけで他モデルに変更可能
  • 戻り値は AsyncIterable(ストリーム)

4. ストリーミング出力と UI 統合

TanStack AI はネイティブでストリーミングをサポートしています。

for await (const chunk of stream) {
  setMessages(prev => prev + chunk.content);
}

なぜ UI と相性がいいのか

  • 逐次描画できるため UX が良い
  • React の state 管理と自然に噛み合う
  • Suspense / Streaming と併用可能

「待たせない UI」 を最小コードで実現できます。


5. embedding / toolDefinition

embedding()

import { embedding } from '@tanstack/ai';
import { openai } from '@tanstack/ai-openai';

const vector = await embedding({
  adapter: openai(),
  model: 'text-embedding-3-small',
  input: 'TanStack AI は便利',
});
  • 検索・類似度計算向け
  • RAG の 部品 として使える

toolDefinition()

import { toolDefinition } from '@tanstack/ai';
import { z } from "zod";

const getWeatherDef = toolDefinition({
  name: 'getWeather',
  description: '指定した都市の天気を取得',
  inputSchema: z.object({
    city: z.string(),
  }),
});

toolDefinition は、LLM から呼び出される「外部ツールの契約」を定義するための API です。

  • ツール名・説明・入出力スキーマを定義する
  • 実装や利用する LLM モデルには依存しない
  • 実際にどのモデルで使うかは chat() 呼び出し時に決定される

このため、同じツール定義を複数の LLM プロバイダーで使い回すことができます。


6. Next.js との統合

Server Route 例

import { chat, toStreamResponse } from '@tanstack/ai';
import { openai } from '@tanstack/ai-openai';

export async function POST(req: Request) {
  const { messages } = await req.json();

  const stream = chat({
    adapter: openai(),
    model: 'gpt-4o',
    messages,
  });

  return toStreamResponse(stream);
}
  • toStreamResponse() は AsyncIterable をFetch API 互換の Response に変換するためのヘルパーです

7. TanStack AI が向いているケース / 向いていないケース

向いているケース

  • Chat UI / 補完 / 要約
  • MVP・プロトタイプ
  • React / Next.js プロダクト
  • 複数 LLM を切り替えたい

向いていないケース

  • 複雑な RAG / Agent 設計
  • サーバー主導の大規模パイプライン

8. まとめ

  • TanStack AI は UI 中心の軽量 AI SDK
  • 学習コストが低く、導入が速い
  • LangChain とは競合ではなく役割が違う

「まず UI に AI を入れたい」なら、有力な選択肢になる SDK です。


9. 参考リンク

TanStack AI 公式ドキュメント

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?