ai-core/adapter-configuration
プロバイダアダプターの選択と設定: openaiText、anthropicText、geminiText、ollamaText、grokText、groqText、openRouterTextに対応しています。modelOptionsによるモデル別の型安全性、推論・思考設定、実行時のアダプター切り替え、カスタムモデル向けのextendAdapter()、createModel()機能を提供します。APIキー環境変数: OPENAI_API_KEY、ANTHROPIC_API_KEY、GOOGLE_API_KEY/GEMINI_API_KEY、XAI_API_KEY、GROQ_API_KEY、OPENROUTER_API_KEY、OLLAMA_HOSTに対応しています。
description の原文を見る
Provider adapter selection and configuration: openaiText, anthropicText, geminiText, ollamaText, grokText, groqText, openRouterText. Per-model type safety with modelOptions, reasoning/thinking configuration, runtime adapter switching, extendAdapter() for custom models, createModel(). API key env vars: OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY/GEMINI_API_KEY, XAI_API_KEY, GROQ_API_KEY, OPENROUTER_API_KEY, OLLAMA_HOST.
SKILL.md 本文
アダプター構成
依存関係: このスキルは ai-core に基づいています。先に読んで重要なルールを確認してください。
実装前に: ユーザーがどのプロバイダーとモデルを使いたいのかを聞いてください。 その後、プロバイダーのソースコード (アダプターのモデルメタデータファイル、例:
packages/typescript/ai-openai/src/model-meta.ts) またはプロバイダーの API/ドキュメントから最新の利用可能モデルを取得して、 最新のモデルを推奨してください。 このスキルと参照ファイルのモデルリストは古い可能性があります。 特定のモデルを推奨する前に、必ずソースに対して検証してください。
セットアップ
アダプターを作成して chat() で使用します:
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
const stream = chat({
adapter: openaiText('gpt-5.2'),
messages,
temperature: 0.7,
maxTokens: 1000,
})
return toServerSentEventsResponse(stream)
アダプターファクトリー関数は、モデル名を文字列リテラルとして、
オプションの設定オブジェクト(API キー、ベース URL など)を受け取ります。
モデル名はファクトリーに渡され、chat() には渡されません。
コアパターン
1. アダプター選択
各プロバイダーは、ツリーシェイク可能なアダプターファクトリーを備えた専用パッケージを持っています。 テキストアダプターはチャット/コンプリーション用の主要なものです:
| プロバイダー | パッケージ | ファクトリー | 環境変数 |
|---|---|---|---|
| OpenAI | @tanstack/ai-openai | openaiText | OPENAI_API_KEY |
| Anthropic | @tanstack/ai-anthropic | anthropicText | ANTHROPIC_API_KEY |
| Gemini | @tanstack/ai-gemini | geminiText | GOOGLE_API_KEY または GEMINI_API_KEY |
| Grok (xAI) | @tanstack/ai-grok | grokText | XAI_API_KEY |
| Groq | @tanstack/ai-groq | groqText | GROQ_API_KEY |
| OpenRouter | @tanstack/ai-openrouter | openRouterText | OPENROUTER_API_KEY |
| Ollama | @tanstack/ai-ollama | ollamaText | OLLAMA_HOST (デフォルト: http://localhost:11434) |
// 各ファクトリーは第 1 引数としてモデルを、第 2 引数としてオプション設定を取ります
import { openaiText } from '@tanstack/ai-openai'
import { anthropicText } from '@tanstack/ai-anthropic'
import { geminiText } from '@tanstack/ai-gemini'
import { grokText } from '@tanstack/ai-grok'
import { groqText } from '@tanstack/ai-groq'
import { openRouterText } from '@tanstack/ai-openrouter'
import { ollamaText } from '@tanstack/ai-ollama'
// モデル文字列はファクトリーに渡され、chat() には渡されません
const adapter = openaiText('gpt-5.2')
const adapter2 = anthropicText('claude-sonnet-4-6')
const adapter3 = geminiText('gemini-2.5-pro')
const adapter4 = grokText('grok-4')
const adapter5 = groqText('llama-3.3-70b-versatile')
const adapter6 = openRouterText('anthropic/claude-sonnet-4')
const adapter7 = ollamaText('llama3.3')
// オプション: 明示的な API キーを渡します
const adapterWithKey = openaiText('gpt-5.2', {
apiKey: 'sk-...',
})
2. ランタイムアダプター切り替え
アダプターファクトリーマップを使用して、ユーザー入力または構成に基づいて プロバイダーを動的に切り替えます:
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import type { TextAdapter } from '@tanstack/ai/adapters'
import { openaiText } from '@tanstack/ai-openai'
import { anthropicText } from '@tanstack/ai-anthropic'
import { geminiText } from '@tanstack/ai-gemini'
// プロバイダー + モデルからアダプターファクトリー呼び出しへのマップを定義します
const adapters: Record<string, () => TextAdapter> = {
'openai/gpt-5.2': () => openaiText('gpt-5.2'),
'anthropic/claude-sonnet-4-6': () => anthropicText('claude-sonnet-4-6'),
'gemini/gemini-2.5-pro': () => geminiText('gemini-2.5-pro'),
}
export function handleChat(providerModel: string, messages: Array<any>) {
const createAdapter = adapters[providerModel]
if (!createAdapter) {
throw new Error(`Unknown provider/model: ${providerModel}`)
}
const stream = chat({
adapter: createAdapter(),
messages,
})
return toServerSentEventsResponse(stream)
}
3. 推論 / 思考の構成
異なるプロバイダーは、その modelOptions を通じて推論/思考を公開します:
import { chat } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
import { anthropicText } from '@tanstack/ai-anthropic'
import { geminiText } from '@tanstack/ai-gemini'
// OpenAI: 努力度と要約を使った推論
const openaiStream = chat({
adapter: openaiText('gpt-5.2'),
messages,
modelOptions: {
reasoning: {
effort: 'high',
summary: 'auto',
},
},
})
// Anthropic: 予算トークン付き拡張思考
const anthropicStream = chat({
adapter: anthropicText('claude-sonnet-4-6'),
messages,
maxTokens: 16000,
modelOptions: {
thinking: {
type: 'enabled',
budget_tokens: 8000, // 1024 以上 maxTokens 未満である必要があります
},
},
})
// Anthropic: 適応的思考 (claude-sonnet-4-6 以降)
const adaptiveStream = chat({
adapter: anthropicText('claude-sonnet-4-6'),
messages,
maxTokens: 16000,
modelOptions: {
thinking: {
type: 'adaptive',
},
effort: 'high', // 'max' | 'high' | 'medium' | 'low'
},
})
// Gemini: 予算またはレベル付き思考設定
const geminiStream = chat({
adapter: geminiText('gemini-2.5-pro'),
messages,
modelOptions: {
thinkingConfig: {
includeThoughts: true,
thinkingBudget: 4096,
},
},
})
4. カスタムモデルでアダプターを拡張
extendAdapter() と createModel() を使用して、カスタムまたはファインチューニングされた
モデルを追加しながら、元のモデルの型安全性を保持します:
import { extendAdapter, createModel } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
// カスタムモデルを定義
const customModels = [
createModel('ft:gpt-5.2:my-org:custom-model:abc123', ['text', 'image']),
createModel('my-local-proxy-model', ['text']),
] as const
// 拡張ファクトリーを作成 - 元のモデルは完全に型付きのまま
const myOpenai = extendAdapter(openaiText, customModels)
// 元のモデルを使用 - 完全な型推論が保持されます
const gpt5 = myOpenai('gpt-5.2')
// カスタムモデルを使用 - 型システムに受け入れられます
const custom = myOpenai('ft:gpt-5.2:my-org:custom-model:abc123')
// 型エラー: 'nonexistent-model' は有効なモデルではありません
// myOpenai('nonexistent-model')
ランタイムでは、extendAdapter は単に元のファクトリーにパススルーします。
_customModels パラメーターは型推論にのみ使用されます。
よくある間違い
a. 高: レガシーモノリシックとツリーシェイク可能なアダプターの混同
レガシーの openai() (および anthropic() など)モノリシックアダプターは非推奨です。
これらはモデルを chat() で取得し、ファクトリーではありません。
// 間違い: レガシーモノリシックアダプターパターン
import { openai } from '@tanstack/ai-openai'
chat({ adapter: openai(), model: 'gpt-5.2', messages })
// 正しい: ツリーシェイク可能なアダプター、モデルはファクトリーで
import { openaiText } from '@tanstack/ai-openai'
chat({ adapter: openaiText('gpt-5.2'), messages })
出典: docs/migration/migration.md
b. 中: API キー環境変数名が違う
各プロバイダーは特定の環境変数名を使用します。間違った名前を使うと ランタイムエラーが発生します:
| プロバイダー | 正しい環境変数 | よくある間違い |
|---|---|---|
| OpenAI | OPENAI_API_KEY | |
| Anthropic | ANTHROPIC_API_KEY | |
| Gemini | GOOGLE_API_KEY または GEMINI_API_KEY | GOOGLE_GENAI_API_KEY (機能しません) |
| Grok (xAI) | XAI_API_KEY | GROK_API_KEY (機能しません) |
| Groq | GROQ_API_KEY | |
| OpenRouter | OPENROUTER_API_KEY | |
| Ollama | OLLAMA_HOST | API キーは不要、ホスト URL のみ (デフォルト: http://localhost:11434) |
出典: アダプターソースコード (各アダプターパッケージの utils/client.ts)。
参考資料
アダプターごとの詳細リファレンスファイル:
緊張関係
高: 型安全性とクイックプロトタイピング -- モデルごとの型安全性には、特定のモデル文字列リテラルが必要です。クイックプロトタイピングは string 変数を使った動的選択を望みます。クイックセットアップを最適化するエージェントは、型安全性を知らないうちに失います。モデル名がユーザー入力または構成ファイルから来る場合は、extendAdapter() を使ってカスタム名を追加してください。
相互参照
- 参照:
ai-core/chat-experience/SKILL.md-- アダプター選択はチャットセットアップに影響します - 参照:
ai-core/structured-outputs/SKILL.md--outputSchemaはプロバイダーの違いを透過的に処理します
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- TanStack
- リポジトリ
- TanStack/ai
- ライセンス
- MIT
- 最終更新
- 2026/5/12
Source: https://github.com/TanStack/ai / ライセンス: MIT