TanStack AI 从一开始就设计为最大程度地支持树摇。整个系统——从活动函数到适配器——都使用了一种功能化、模块化的架构,确保您只打包实际使用的代码。
TanStack AI 不提供包含所有内容的一体化 API,而是提供
这意味着,如果您只使用 chat 与 OpenAI,您不会打包用于摘要、图像生成或其他提供商的代码。
每个 AI 活动都作为从 @tanstack/ai 导出的独立函数
// Import only the activities you need
import { chat } from '@tanstack/ai' // Chat/text generation
import { summarize } from '@tanstack/ai' // Summarization
import { generateImage } from '@tanstack/ai' // Image generation
import { generateSpeech } from '@tanstack/ai' // Text-to-speech
import { generateTranscription } from '@tanstack/ai' // Audio transcription
import { generateVideo } from '@tanstack/ai' // Video generation
如果您只需要聊天功能
// Only chat code is bundled
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'
以下是树摇设计在实践中的工作方式
// Only import what you need
import { chat } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
// Chat generation - returns AsyncIterable<StreamChunk>
const chatResult = chat({
adapter: openaiText('gpt-5.2'),
messages: [{ role: 'user', content: 'Hello!' }],
})
for await (const chunk of chatResult) {
console.log(chunk)
}
将打包的内容
不会打包的内容
如果您需要多个活动,只需导入您需要的
import { chat, summarize } from '@tanstack/ai'
import {
openaiText,
openaiSummarize
} from '@tanstack/ai-openai'
// Each activity is independent
const chatResult = chat({
adapter: openaiText('gpt-5.2'),
messages: [{ role: 'user', content: 'Hello!' }],
})
const summarizeResult = await summarize({
adapter: openaiSummarize('gpt-5-mini'),
text: 'Long text to summarize...',
})
每个活动都位于自己的模块中,因此打包器可以消除未使用的活动。
树摇设计不会牺牲类型安全。每个适配器为其支持的模型提供完整的类型安全
import { openaiText, type OpenAIChatModel } from '@tanstack/ai-openai'
const adapter = openaiText()
// TypeScript knows the exact models supported
const model: OpenAIChatModel = 'gpt-5.2' // ✓ Valid
const model2: OpenAIChatModel = 'invalid' // ✗ Type error
create___Options 函数也支持树摇
import {
createChatOptions,
createImageOptions
} from '@tanstack/ai'
// Only import what you need
const chatOptions = createChatOptions({
adapter: openaiText('gpt-5.2'),
})
功能化、模块化的设计提供了显著的包大小优势
// ❌ Importing more than needed
import * as ai from '@tanstack/ai'
import * as openai from '@tanstack/ai-openai'
// This bundles all exports from both packages
// ✅ Only what you use gets bundled
import { chat } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
// You only get:
// - Chat activity implementation
// - OpenAI text adapter
// - Chat-specific dependencies
对于典型的聊天应用程序
这对于大多数应用程序来说是 75% 的减小!
树摇是通过以下方式实现的
现代打包器 (Vite, Webpack, Rollup, esbuild) 可以轻松消除未使用的代码,因为
// ✅ Good - Only imports chat
import { chat } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
// ❌ Bad - Imports everything
import * as ai from '@tanstack/ai'
import * as openai from '@tanstack/ai-openai'
每个适配器类型都实现特定的接口
所有适配器都有一个 kind 属性,指示它们的类型
const chatAdapter = openaiText()
console.log(chatAdapter.kind) // 'text'
const summarizeAdapter = openaiSummarize()
console.log(summarizeAdapter.kind) // 'summarize'
TanStack AI 的树摇设计意味着
功能化、模块化的架构确保了现代打包器可以有效地消除未使用的代码,从而为您的应用程序实现最佳的包大小。