本指南可帮助您从 TanStack AI 的先前版本迁移到最新版本。主要变更集中在改进的 tree-shaking、更清晰的 API 命名和简化的配置上。
此版本的主要破坏性变更包括:
适配器已拆分为特定于活动的函数,以实现最佳的 tree-shaking。您现在为每种活动类型导入特定的函数,而不是导入一个整体适配器。
import { chat } from '@tanstack/ai'
import { openai } from '@tanstack/ai-openai'
const stream = chat({
adapter: openai(),
model: 'gpt-5.2',
messages: [{ role: 'user', content: 'Hello!' }],
})
import { chat } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
const stream = chat({
adapter: openaiText('gpt-5.2'),
messages: [{ role: 'user', content: 'Hello!' }],
})
每个提供程序包现在导出特定于活动的函数
import {
openaiText, // Chat/text generation
openaiSummarize, // Summarization
openaiImage, // Image generation
openaiSpeech, // Text-to-speech
openaiTranscription, // Audio transcription
openaiVideo, // Video generation
} from '@tanstack/ai-openai'
import {
anthropicText, // Chat/text generation
anthropicSummarize, // Summarization
} from '@tanstack/ai-anthropic'
import {
geminiText, // Chat/text generation
geminiSummarize, // Summarization
geminiImage, // Image generation
geminiSpeech, // Text-to-speech (experimental)
} from '@tanstack/ai-gemini'
import {
ollamaText, // Chat/text generation
ollamaSummarize, // Summarization
} from '@tanstack/ai-ollama'
这是一个完整的适配器用法迁移示例
import { chat } from '@tanstack/ai'
import { openai } from '@tanstack/ai-openai'
import { anthropic } from '@tanstack/ai-anthropic'
type Provider = 'openai' | 'anthropic'
function getAdapter(provider: Provider) {
switch (provider) {
case 'openai':
return openai()
case 'anthropic':
return anthropic()
}
}
const stream = chat({
adapter: getAdapter(provider),
model: provider === 'openai' ? 'gpt-5.2' : 'claude-sonnet-4-5',
messages,
})
import { chat } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
import { anthropicText } from '@tanstack/ai-anthropic'
type Provider = 'openai' | 'anthropic'
const adapters = {
openai: () => openaiText('gpt-5.2'),
anthropic: () => anthropicText('claude-sonnet-4-5'),
}
const stream = chat({
adapter: adapters[provider](),
messages,
})
先前嵌套在 options 对象中的通用选项现在直接在配置中扁平化。
const stream = chat({
adapter: openai(),
model: 'gpt-5.2',
messages,
options: {
temperature: 0.7,
maxTokens: 1000,
topP: 0.9,
},
})
const stream = chat({
adapter: openaiText('gpt-5.2'),
messages,
temperature: 0.7,
maxTokens: 1000,
topP: 0.9,
})
这些选项现在位于顶层
providerOptions 参数已重命名为 modelOptions,以提高清晰度。此参数包含特定于模型的选项,这些选项因提供程序和模型而异。
const stream = chat({
adapter: openai(),
model: 'gpt-5.2',
messages,
providerOptions: {
// OpenAI-specific options
responseFormat: { type: 'json_object' },
logitBias: { '123': 1.0 },
},
})
const stream = chat({
adapter: openaiText('gpt-5.2'),
messages,
modelOptions: {
// OpenAI-specific options
responseFormat: { type: 'json_object' },
logitBias: { '123': 1.0 },
},
})
modelOptions 根据您使用的适配器和模型完全类型化
import { openaiText } from '@tanstack/ai-openai'
const adapter = openaiText('gpt-5.2')
// TypeScript knows the exact modelOptions type for gpt-5.2
const stream = chat({
adapter,
messages,
modelOptions: {
// Autocomplete and type checking for gpt-5.2 options
responseFormat: { type: 'json_object' },
},
})
toResponseStream 函数已重命名为 toServerSentEventsStream,以更好地反映其目的。此外,API 已略有更改。
import { chat, toResponseStream } from '@tanstack/ai'
import { openai } from '@tanstack/ai-openai'
export async function POST(request: Request) {
const { messages } = await request.json()
const abortController = new AbortController()
const stream = chat({
adapter: openai(),
model: 'gpt-5.2',
messages,
abortController,
})
return toResponseStream(stream, { abortController })
}
import { chat, toServerSentEventsStream } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
export async function POST(request: Request) {
const { messages } = await request.json()
const abortController = new AbortController()
const stream = chat({
adapter: openaiText('gpt-5.2'),
messages,
abortController,
})
const readableStream = toServerSentEventsStream(stream, abortController)
return new Response(readableStream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
Connection: 'keep-alive',
},
})
}
如果您需要 HTTP 流格式(以换行符分隔的 JSON)而不是 SSE,请使用 toHttpStream
import { toHttpStream } from '@tanstack/ai'
const readableStream = toHttpStream(stream, abortController)
return new Response(readableStream, {
headers: {
'Content-Type': 'application/x-ndjson',
},
})
TanStack AI 移除了对嵌入的支持。大多数向量数据库服务(如 Pinecone、Weaviate、Qdrant 等)都具有内置的嵌入支持,并且大多数应用程序会选择一个嵌入模型并坚持使用它。
import { embedding } from '@tanstack/ai'
import { openaiEmbed } from '@tanstack/ai-openai'
const result = await embedding({
adapter: openaiEmbed(),
model: 'text-embedding-3-small',
input: 'Hello, world!',
})
使用您的向量数据库服务的内置嵌入支持,或直接调用提供程序的 API
// Example with OpenAI SDK directly
import OpenAI from 'openai'
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY })
const result = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: 'Hello, world!',
})
这是一个显示所有变更的完整示例
import { chat, toResponseStream } from '@tanstack/ai'
import { openai } from '@tanstack/ai-openai'
export async function POST(request: Request) {
const { messages } = await request.json()
const abortController = new AbortController()
const stream = chat({
adapter: openai(),
model: 'gpt-5.2',
messages,
options: {
temperature: 0.7,
maxTokens: 1000,
},
providerOptions: {
responseFormat: { type: 'json_object' },
},
abortController,
})
return toResponseStream(stream, { abortController })
}
import { chat, toServerSentEventsStream } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
export async function POST(request: Request) {
const { messages } = await request.json()
const abortController = new AbortController()
const stream = chat({
adapter: openaiText('gpt-5.2'),
messages,
temperature: 0.7,
maxTokens: 1000,
modelOptions: {
responseFormat: { type: 'json_object' },
},
abortController,
})
const readableStream = toServerSentEventsStream(stream, abortController)
return new Response(readableStream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
Connection: 'keep-alive',
},
})
}
如果在迁移过程中遇到问题