사용자 지정 모델로 어댑터 확장
extendAdapter 유틸리티를 사용하면 기존 어댑터 팩토리(openaiText, anthropicText 등)를 사용자 지정 모델 이름으로 확장하면서 입력 모달리티와 제공자 옵션에 대한 완전한 타입 안전성을 유지할 수 있습니다.
기본 사용법
import { createModel, extendAdapter } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
// Define your custom models using createModel helper
const myOpenaiModel = createModel('my-fine-tuned-gpt4',['text', 'image']);
const myOpenaiModelButCooler = createModel('my-fine-tuned-gpt5',['text', 'image']);
// Create an extended adapter factory - simple API, no type parameters needed
const myOpenai = extendAdapter(openaiText, [
myOpenaiModel,
myOpenaiModelButCooler
])
// Use with original models - full type inference preserved
const gpt5Adapter = myOpenai('gpt-5.5')
// Use with custom models - your custom types are applied
const customAdapter = myOpenai('my-fine-tuned-gpt4')
// Works seamlessly with chat()
import { chat } from '@tanstack/ai'
const stream = chat({
adapter: myOpenai('my-fine-tuned-gpt4'),
messages: [{ role: 'user', content: 'Hello!' }]
})
createModel 헬퍼
createModel 함수는 완전한 타입 추론을 지원하면서 사용자 지정 모델을 정의하는 깔끔한 방법을 제공합니다.
import { createModel } from '@tanstack/ai'
// Arguments define name and input modalities
const model = createModel(
'my-model', // model name (literal type inferred)
['text', 'image'] // input modalities (tuple type inferred)
)
모델 정의 구조
사용자 지정 모델 정의(ExtendedModelDef)에는 name, input, modelOptions 필수 속성과 features, tools 선택 속성이 있습니다. 두 createModel 오버로드를 사용하면 다음 두 가지 방식으로 이 속성을 채울 수 있습니다.
입력 모달리티 정의
위치 인수 형식은 모델 이름과 모델이 지원하는 콘텐츠 유형을 지정하는 input 배열을 받습니다.
import { createModel } from '@tanstack/ai'
const models = [
createModel('text-only-model', ['text']),
createModel('multimodal-model', ['text', 'image', 'audio']),
] as const
사용 가능한 모달리티: 'text', 'image', 'audio', 'video', 'document'
기능 객체 형식
타입이 지정된 modelOptions, 선언된 features 또는 제공자 tools를 사용자 지정 모델에 연결하려면 두 번째 인수로 기능 객체를 받는 두 번째 createModel 오버로드를 사용합니다.
import { createModel } from '@tanstack/ai'
import type { OpenAITextProviderOptions } from '@tanstack/ai-openai'
// Type brand for provider options — the value is unused at runtime.
const modelOptions: OpenAITextProviderOptions = {}
const reasoner = createModel('my-reasoner', {
input: ['text'],
features: ['reasoning', 'structured_outputs'],
tools: ['web_search'],
modelOptions,
})
input— 지원되는 입력 모달리티입니다(위치 인수 형식과 동일합니다).features— 선언된 기능 플래그입니다(예:'reasoning','structured_outputs').tools— 선언된 제공자 도구입니다(예:'web_search').modelOptions— 이 모델이 허용하는 제공자 옵션의 타입 브랜드입니다. 런타임에는 값을 사용하지 않으므로 제공자 옵션 타입으로 지정한 빈 객체를 선언합니다(예:const modelOptions: OpenAITextProviderOptions = {}).
원래 팩토리 동작 유지
extendAdapter는 구성 매개변수를 포함하여 원래 팩토리의 시그니처를 완전히 유지합니다.
import { createModel, extendAdapter } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
const customModels = [createModel('my-fine-tuned-gpt4', ['text', 'image'])] as const
const myOpenai = extendAdapter(openaiText, customModels)
// Config parameter is preserved
const adapter = myOpenai('my-fine-tuned-gpt4', {
baseURL: 'https://my-proxy.com/v1',
timeout: 30000
})
타입 안전성
확장된 어댑터는 완전한 타입 안전성을 제공합니다.
import { extendAdapter, createModel } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
const myOpenai = extendAdapter(openaiText, [createModel('custom-model', ['text'])])
// ✅ Original models work with their original types
const a1 = myOpenai('gpt-5.5')
// ✅ Custom models work with your defined types
const a2 = myOpenai('custom-model')
// ❌ Type error: invalid model name
// Note: Type checking works when you assign the result to a variable
const invalid = myOpenai('nonexistent-model') // TypeScript error!
런타임 동작
런타임에 extendAdapter는 단순히 원래 팩토리로 전달합니다.
- 사용자 지정 모델 이름의 검증은 수행하지 않습니다.
- 원래 팩토리는 전달된 값을 정확히 받습니다.
- 따라서 원래 제공자의 API가 모델 이름을 처리할 수 있습니다.
이 설계는 의도된 것입니다. 이를 통해 다음을 수행할 수 있습니다.
- 제공자가 허용하지만 TypeScript가 알지 못하는 미세 조정 모델 이름을 사용할 수 있습니다.
- 사용자 지정 모델 식별자를 허용하는 다른 백엔드로 요청을 프록시할 수 있습니다.
- 런타임 오버헤드 없이 타입 안전성을 추가할 수 있습니다.
예시: OpenAI 호환 프록시
일반적인 사용 사례는 OpenAI 호환 프록시에서 사용할 모델의 타입을 지정하는 것입니다.
import { extendAdapter, createModel } from '@tanstack/ai'
import { openaiText } from '@tanstack/ai-openai'
// Models available through your proxy
const proxyModels = [
createModel(
'llama-3.1-70b',
['text']
),
createModel(
'mixtral-8x7b',
['text']
),
] as const
const proxyAdapter = extendAdapter(openaiText, proxyModels)
// Use with your proxy's base URL
const adapter = proxyAdapter('llama-3.1-70b', {
baseURL: 'https://my-llm-proxy.com/v1'
})
예시: 미세 조정 모델
미세 조정 모델에 타입 안전성을 추가합니다.
import { chat, createModel, extendAdapter } from '@tanstack/ai'
import { anthropicText } from '@tanstack/ai-anthropic'
const fineTunedModels = [
createModel(
'ft:claude-3-opus:my-org:custom-task:abc123',
['text', 'image']
),
] as const
const myAnthropic = extendAdapter(anthropicText, fineTunedModels)
chat({
adapter: myAnthropic('ft:claude-3-opus:my-org:custom-task:abc123'),
messages: [{ role: 'user', content: 'Analyze this...' }]
})