본문으로 건너뛰기

트리 셰이킹 및 번들 최적화

TanStack AI는 처음부터 최대한의 트리 셰이킹을 고려해 설계되었습니다. 활동 함수부터 어댑터까지 전체 시스템이 함수형 모듈식 아키텍처를 사용하므로 실제로 사용하는 코드만 번들에 포함됩니다.

설계 철학

모든 기능을 포함하는 모놀리식 API 대신 TanStack AI는 다음을 제공합니다.

  • 개별 활동 함수 - 필요한 활동만 가져옵니다(chat, summarize 등).
  • 개별 어댑터 함수 - 필요한 어댑터만 가져옵니다(openaiText, openaiSummarize 등).
  • 함수형 API 설계 - 번들러가 쉽게 제거할 수 있는 순수 함수입니다.
  • 별도 모듈 - 각 활동과 어댑터가 자체 모듈에 있습니다.

따라서 OpenAI와 함께 chat만 사용하면 요약, 이미지 생성 또는 다른 프로바이더의 코드가 번들에 포함되지 않습니다.

활동 함수

각 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.5'),
messages: [{ role: 'user', content: 'Hello!' }],
})

번들에는 다음 항목이 포함되지 않습니다:

  • 요약 로직
  • 이미지 생성 로직
  • 기타 activity 구현

어댑터 함수

각 프로바이더 패키지는 활동 유형별로 개별 어댑터 함수를 내보냅니다.

OpenAI

import {
openaiText, // Chat/text generation
openaiSummarize, // Summarization
openaiImage, // Image generation
openaiSpeech, // Text-to-speech
openaiTranscription, // Audio transcription
openaiVideo, // Video generation
} from '@tanstack/ai-openai'

Anthropic

import {
anthropicText, // Chat/text generation
anthropicSummarize, // Summarization
} from '@tanstack/ai-anthropic'

Gemini

import {
geminiText, // Chat/text generation
geminiSummarize, // Summarization
geminiImage, // Image generation
geminiSpeech, // Text-to-speech (experimental)
} from '@tanstack/ai-gemini'

Ollama

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.5'),
messages: [{ role: 'user', content: 'Hello!' }],
})

for await (const chunk of chatResult) {
console.log(chunk)
}

번들에 포함되는 항목:

  • chat 함수와 해당 종속성
  • openaiText 어댑터와 해당 종속성
  • ✅ 채팅 전용 스트리밍 및 도구 처리 로직

번들에 포함되지 않는 항목:

  • summarize 함수
  • generateImage 함수
  • ❌ 기타 어댑터 구현(Anthropic, Gemini 등)
  • ❌ 기타 activity 구현

여러 활동 사용

여러 활동이 필요하다면 사용하는 것만 가져옵니다.

import { chat, summarize } from '@tanstack/ai'
import {
openaiText,
openaiSummarize
} from '@tanstack/ai-openai'

// Each activity is independent
const chatResult = chat({
adapter: openaiText('gpt-5.5'),
messages: [{ role: 'user', content: 'Hello!' }],
})

const summarizeResult = await summarize({
adapter: openaiSummarize('gpt-5.4-mini'),
text: 'Long text to summarize...',
})

각 활동은 자체 모듈에 있으므로 번들러가 사용하지 않는 활동을 제거할 수 있습니다.

타입 안전성

트리 셰이킹 가능한 설계는 타입 안전성을 희생하지 않습니다. 각 어댑터는 지원하는 모델에 완전한 타입 안전성을 제공합니다.

import { openaiText, type OpenAIChatModel } from '@tanstack/ai-openai'

const adapter = openaiText('gpt-5.5')

// TypeScript knows the exact models supported
const model: OpenAIChatModel = 'gpt-5.5' // ✓ Valid
const model2: OpenAIChatModel = 'invalid' // ✗ Type error

Create 옵션 함수

create___Options 함수에도 tree-shaking이 적용됩니다:

import {
createChatOptions,
createImageOptions
} from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'

// Only import what you need
const chatOptions = createChatOptions({
adapter: openaiText('gpt-5.5'),
})

번들 크기의 이점

함수형 모듈식 설계는 번들 크기를 크게 줄여 줍니다.

모든 것 가져오기 (비효율적)

// ❌ 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

실제 영향

일반적인 채팅 애플리케이션의 경우, 단일 액티비티와 어댑터를 가져오면 모든 액티비티와 모든 제공자 어댑터를 번들링하는 것보다 훨씬 적은 코드를 가져옵니다. 각 액티비티와 어댑터가 자체 부작용 없는 모듈에 존재하므로, 번들러는 참조하지 않는 모든 것을 제거합니다 — 따라서 라이브러리가 지원하는 제공자와 액티비티가 많을수록 집중된 가져오기와 네임스페이스 가져오기 간의 차이가 더 커집니다.

작동 방식

트리 셰이킹은 다음을 통해 구현됩니다.

  1. ES 모듈 내보내기 - 각 함수는 기본 내보내기가 아닌 이름이 지정된 내보내기입니다
  2. 별도 모듈 - 각 활동과 어댑터가 자체 파일에 있습니다.
  3. 부작용 없음 - 함수는 순수하며 모듈 수준의 부작용이 없습니다
  4. 기능적 합성 - 함수들이 서로 결합되어 죽은 코드 제거를 가능하게 합니다
  5. 타입 전용 가져오기 - 타입 가져오기는 빌드 시 제거됩니다.

최신 번들러(Vite, Webpack, Rollup, esbuild)는 다음 이유로 사용하지 않는 코드를 쉽게 제거할 수 있습니다.

  • 함수는 정적 분석이 가능함
  • 사용하지 않는 코드의 동적 가져오기 없음
  • 모듈 레벨의 사이드 이펙트 없음
  • 명확한 의존성 그래프

권장 사항

  1. 필요한 것만 가져오세요 - 전체 네임스페이스를 가져오지 마세요
  2. 특정 어댑터 함수를 사용하세요 - openaiTextopenai 대신 가져오세요
  3. 라우트에 따라 작업을 분리하세요 - 다른 API 라우트는 다른 작업을 사용할 수 있습니다
  4. 가능하면 게으르게 로드하세요 - 코드 분할 라우트를 위한 동적 가져오기를 사용하세요
  5. 모바일 채팅 번들을 클라이언트 전용으로 유지하세요 - React Native 및 Expo 채팅 화면은 제공자 SDK, 서버 응답 헬퍼, React DOM UI, 개발자 도구 UI 또는 기타 프레임워크 패키지가 아닌 useChat와 채팅 연결 어댑터를 가져와야 합니다. 빠른 시작: React Native를 참조하여 서버 전용 제공자 경계 및 모바일 전송 설정을 확인하세요.
// ✅ 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'

어댑터 타입

각 어댑터 유형은 특정 인터페이스를 구현합니다:

  • ChatAdapter - 스트리밍 채팅 응답을 위한 chatStream() 메서드를 제공합니다
  • SummarizeAdapter - 텍스트 요약화를 위한 summarize() 메서드를 제공합니다
  • ImageAdapter - 이미지 생성을 위한 generateImage() 메서드를 제공합니다
  • TTSAdapter - 텍스트-음성 변환을 위한 generateSpeech() 메서드를 제공합니다
  • TranscriptionAdapter - 오디오 전사화를 위한 generateTranscription() 메서드를 제공합니다
  • VideoAdapter - 비디오 생성을 위한 generateVideo() 메서드를 제공합니다

모든 어댑터에는 유형을 나타내는 kind 속성이 있습니다.

import { openaiText, openaiSummarize } from '@tanstack/ai-openai'

const chatAdapter = openaiText('gpt-5.5')
console.log(chatAdapter.kind) // 'text'

const summarizeAdapter = openaiSummarize('gpt-5.4-mini')
console.log(summarizeAdapter.kind) // 'summarize'

요약

TanStack AI 의 트리 셰이커블 설계는 다음과 같습니다:

  • 더 작은 번들 - 실제로 사용하는 코드만 포함합니다.
  • 더 빠른 로드 시간 - 다운로드하고 파싱할 JavaScript가 줄어듭니다.
  • 더 나은 성능 - 코드가 적어 실행이 빨라집니다.
  • 타입 안전성 - 런타임 오버헤드 없이 TypeScript를 완전히 지원합니다.
  • 유연성 - 필요에 따라 활동과 어댑터를 조합합니다.

함수형 모듈식 아키텍처는 최신 번들러가 사용하지 않는 코드를 효과적으로 제거하도록 하여 애플리케이션의 번들 크기를 최적화합니다.