BytePlus
BytePlus 어댑터는 네 가지 생성 유형에 걸쳐 TanStack AI를 ByteDance의 국제 모델 플랫폼인 BytePlus에 연결합니다.
- Chat — ModelArk의 OpenAI 호환
/chat/completions엔드포인트에서 사용하는 Seed 모델 제품군(GLM, DeepSeek, gpt-oss 포함)이며, 기본적으로 추론이 활성화됩니다. - Video — 비동기 작업 API인 Seedance입니다.
- Image — Seedream입니다.
- Speech — 다른 API 키를 사용하는 다른 호스트에서 제공되는 Seed Speech 음성 합성 및 전사입니다(제품 두 개, 키 두 개 참고).
설치
npm install @tanstack/ai-byteplus
# or
pnpm add @tanstack/ai-byteplus
# or
yarn add @tanstack/ai-byteplus
제품 두 개, 키 두 개
BytePlus는 이러한 모델을 두 제품으로 나누며, 두 제품은 자격 증명을 공유하지 않습니다.
| 어댑터 | 제품 | 환경 변수 | 인증 헤더 |
|---|---|---|---|
byteplusText, byteplusVideo, byteplusImage | ModelArk (Ark) | ARK_API_KEY (없으면 BYTEPLUS_API_KEY 사용) | Authorization: Bearer |
byteplusSpeech, byteplusTranscription | Seed Speech | BYTEPLUS_VOICE_API_KEY | X-Api-Key |
두 키를 사용하므로 BYOK에는 두 개의 slug가 사용됩니다. byteplusByok(Ark)와 byteplusVoiceByok(Seed Speech)이며, 둘 다 @tanstack/ai-byteplus/byok에서 제공합니다.
# ModelArk: chat, Seedance video, Seedream image
ARK_API_KEY=...
# Seed Speech: TTS and transcription — a separate product key
BYTEPLUS_VOICE_API_KEY=...
음성 어댑터에 Ark 키를 전달하면 45000010 Invalid X-Api-Key 오류와 함께 실패합니다.
Ark 키는 리전에 따라 격리됩니다. 기본 base URL은 아시아 태평양 남동부 엔드포인트(https://ark.ap-southeast.bytepluses.com/api/v3)이며, 한 리전에서 발급된 키는 다른 리전에서 인증되지 않습니다. baseURL을 사용해 어댑터를 다른 위치로 지정합니다.
import { createBytePlusText } from '@tanstack/ai-byteplus'
import { arkApiKey } from './config'
const adapter = createBytePlusText('dola-seed-2-1-turbo-260628', arkApiKey, {
baseURL: 'https://ark.eu-west.bytepluses.com/api/v3',
})
BytePlus 문서에 따르면 EU 엔드포인트는 채팅과 이미지만 제공하며, Seedance 동영상은 아시아 태평양에서만 사용할 수 있습니다.
채팅
어댑터에 모델이 포함되므로 별도의 model 옵션은 없습니다.
서버 — SSE를 통해 응답을 스트리밍하는 엔드포인트입니다.
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { byteplusText } from '@tanstack/ai-byteplus'
export async function POST(request: Request) {
const { messages } = await request.json()
const stream = chat({
adapter: byteplusText('dola-seed-2-1-turbo-260628'),
messages,
})
return toServerSentEventsResponse(stream)
}
클라이언트 — 다른 모든 공급자와 동일한 useChat 훅을 사용합니다.
import { useState } from 'react'
import { fetchServerSentEvents, useChat } from '@tanstack/ai-react'
export function Chat() {
const [input, setInput] = useState('')
const { messages, sendMessage, isLoading } = useChat({
connection: fetchServerSentEvents('/api/chat'),
})
return (
<div>
{messages.map((message) => (
<div key={message.id}>
<strong>{message.role}</strong>
{message.parts.map((part, index) =>
part.type === 'text' ? <p key={index}>{part.content}</p> : null,
)}
</div>
))}
<form
onSubmit={(event) => {
event.preventDefault()
if (!input.trim() || isLoading) return
sendMessage(input)
setInput('')
}}
>
<input value={input} onChange={(e) => setInput(e.target.value)} />
<button type="submit" disabled={isLoading}>
Send
</button>
</form>
</div>
)
}
모델 옵션
Ark의 채팅 엔드포인트는 OpenAI와 호환되므로 샘플링 매개변수는 OpenAI의 snake_case 이름을 유지하며 modelOptions에 포함됩니다. thinking, reasoning_effort, repetition_penalty, service_tier는 Ark 전용 추가 옵션입니다.
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { byteplusText } from '@tanstack/ai-byteplus'
export async function POST(request: Request) {
const { messages } = await request.json()
const stream = chat({
adapter: byteplusText('dola-seed-2-1-turbo-260628'),
messages,
modelOptions: {
temperature: 0.7,
top_p: 0.9,
max_tokens: 2048,
thinking: { type: 'enabled' },
reasoning_effort: 'medium',
},
})
return toServerSentEventsResponse(stream)
}
타입 시스템으로 표현할 수 없으며, 두 가지 모두 실제 검증에서 400을 반환하는 제약이 있습니다.
max_tokens와max_completion_tokens는 함께 사용할 수 없습니다.reasoning_effort는thinking: { type: 'disabled' }와 함께 사용할 수 없습니다.
service_tier: 'flex'는 지연 시간이 보장되지 않는 더 저렴한 오프라인 배치 큐로 요청을 라우팅합니다.
추론 및 encrypted_content
Seed 모델은 기본적으로 추론합니다. 추론은 별도의 reasoning_content 델타 스트림으로 전달되고 답변 텍스트가 아닌 추론 콘텐츠로 노출되므로, useChat은 이를 응답과 별도로 렌더링합니다. 요청별로 비활성화할 수 있습니다.
import { chat, toServerSentEventsResponse } from '@tanstack/ai'
import { byteplusText } from '@tanstack/ai-byteplus'
export async function POST(request: Request) {
const { messages } = await request.json()
const stream = chat({
adapter: byteplusText('dola-seed-2-1-turbo-260628'),
messages,
modelOptions: { thinking: { type: 'disabled' } },
})
return toServerSentEventsResponse(stream)
}
disabled는 모든 곳에서 작동하며, auto는 gpt-oss-120b-250805에서만 허용됩니다. deepseek-v3-2-251201은 기본적으로 추론이 비활성화된 유일한 모델입니다.
네 가지 "thinking summary" 모델 — dola-seed-2-1-turbo-260628, seed-2-0-lite-260428, seed-2-0-mini-260428, seed-2-0-pro-260328 —은 추론 추적과 함께 불투명한 encrypted_content blob도 생성합니다. 이는 해당 추적에 대한 서명이며, BytePlus 문서에서는 다음 턴의 assistant 메시지에 이를 그대로 돌려보내도록 요구합니다.
어댑터가 이를 자동으로 왕복 처리합니다. Anthropic의 thinking 서명이 사용하는 것과 동일한 경로를 통해 blob을 스트림에서 캡처하고 추론 단계에 signature로 연결합니다. 이 값은 assistant 메시지의 thinking 부분에 포함되며 다음 요청에 다시 전달됩니다. 다음 두 가지 결과를 알아두어야 합니다.
- 대화 기록을 직접 영속화하고 재생하는 경우 thinking 부분의
signature를 유지해야 합니다. 이를 제거하면 추론 캐시 적중을 얻지 못합니다. 치명적이지는 않습니다. 실제 프로브를 통해 assistant 메시지에서encrypted_content를 생략한 턴도 Ark가 허용하는 것을 확인했습니다. - 같은 이유로 구조화된 출력 턴에서는 blob을 캡처하지 않습니다. 이 경우에도 캐시 적중만 잃을 뿐 요청이 실패하지는 않습니다.
구조화된 출력
18개 채팅 모델 중 10개가 response_format: { type: 'json_schema' }를 지원합니다.
dola-seed-2-1-turbo-260628, seed-2-0-pro-260328, seed-2-0-lite-260228, seed-2-0-mini-260215, seed-1-8-251228, seed-1-6-250915, seed-1-6-250615, seed-1-6-flash-250715, seed-1-6-flash-250615, glm-5-2-260617.
import { chat } from '@tanstack/ai'
import { byteplusText } from '@tanstack/ai-byteplus'
import { z } from 'zod'
const RecipeSchema = z.object({
name: z.string().meta({ description: 'Name of the dish' }),
minutes: z.number().meta({ description: 'Total cooking time in minutes' }),
ingredients: z.array(z.string()),
})
const recipe = await chat({
adapter: byteplusText('dola-seed-2-1-turbo-260628'),
messages: [{ role: 'user', content: 'Give me a recipe for carbonara' }],
outputSchema: RecipeSchema,
})
console.log(recipe.name, recipe.minutes)
나머지 8개 모델에서는 어댑터가 성능을 낮추는 대신 명확하게 실패합니다. chat({ outputSchema })는 예외를 발생시키고 스트리밍 형식은 작동하는 모델을 명시하는 RUN_ERROR를 생성합니다. 사용할 수 있는 JSON 모드 대체 수단도 없습니다. Ark는 이 모델 모두에서 response_format: { type: 'json_object' }도 거부합니다.
표를 읽는 대신 실제 API를 프로브하여 발견한, 알아두어야 할 두 가지 함정이 있습니다.
- 공개된 기능 표는 양쪽 방향 모두에서 잘못되었습니다. 명백한 기본 모델인
seed-2-0-lite-260428은 JSON 스키마를 거부하는 8개 모델 중 하나입니다. 타입이 지정된 출력이 필요하면seed-2-0-lite-260228또는dola-seed-2-1-turbo-260628을 사용합니다. glm-4-7-251222은 스키마를 허용한 뒤 무시합니다.200응답과 함께 산문으로 답합니다. 지원 목록에서 의도적으로 제외했으므로, 파싱할 수 없는 출력을 전달하는 대신 어댑터가 사전에 거부합니다.
모델 선택기의 모델을 이 목록으로 제한하려는 경우 BYTEPLUS_STRUCTURED_OUTPUT_CHAT_MODELS를 가져올 수 있습니다.
동영상 생성(Seedance)
동영상 생성은 실험적 기능입니다.
Seedance는 비동기 작업 API입니다. generateVideo()가 작업을 시작하고 jobId를 반환하며, 동영상 URL은 최종 상태와 함께 전달됩니다.
import { generateVideo, getVideoJobStatus } from '@tanstack/ai'
import { byteplusVideo } from '@tanstack/ai-byteplus'
const adapter = byteplusVideo('dreamina-seedance-2-0-260128')
const { jobId } = await generateVideo({
adapter,
prompt: 'a guitar being played in a store',
size: '16:9_720p',
duration: 5,
})
let status = await getVideoJobStatus({ adapter, jobId })
while (status.status === 'pending' || status.status === 'processing') {
await new Promise((resolve) => setTimeout(resolve, 5000))
status = await getVideoJobStatus({ adapter, jobId })
}
console.log(status.status === 'completed' ? status.url : status.error)
생성된 동영상 URL은 작업 완료 후 24시간이 지나면 만료됩니다(작업 레코드 자체는 7일 동안 유지됨). 따라서 보관하려는 파일은 다운로드해야 합니다(생성된 파일 보관 참고).
size는 ratio 또는 ratio_resolution 템플릿입니다('16:9', '16:9_720p'). 비율은 16:9, 9:16, 4:3, 3:4, 1:1, 21:9, adaptive입니다.
클라이언트에서 전체 수명 주기 구동
서버 — stream: true로 폴링을 코어에 위임하고 청크를 전달합니다.
import { generateVideo, toServerSentEventsResponse } from '@tanstack/ai'
import { byteplusVideo } from '@tanstack/ai-byteplus'
export async function POST(request: Request) {
const { prompt } = await request.json()
const stream = generateVideo({
adapter: byteplusVideo('dreamina-seedance-2-0-260128'),
prompt,
size: '16:9_720p',
duration: 5,
stream: true,
pollingInterval: 5000,
})
return toServerSentEventsResponse(stream)
}
클라이언트 — useGenerateVideo가 작업을 추적합니다.
import { fetchServerSentEvents, useGenerateVideo } from '@tanstack/ai-react'
export function SeedanceGenerator() {
const { generate, result, videoStatus, isLoading, error } = useGenerateVideo({
connection: fetchServerSentEvents('/api/generate/video'),
})
return (
<div>
<button
onClick={() => generate({ prompt: 'a guitar being played in a store' })}
disabled={isLoading}
>
{isLoading ? 'Generating…' : 'Generate video'}
</button>
{isLoading && <p>Status: {videoStatus?.status ?? 'starting…'}</p>}
{error && <p>Error: {error.message}</p>}
{result && <video src={result.url} controls width={640} />}
</div>
)
}
모델별 옵션
Seedance 옵션은 모델별로 다르며, Ark는 적용할 수 없는 필드를 무시하지 않고 400 오류와 함께 거부합니다 — "the specified parameter draft is not supported for model seedance-1-0-pro in t2v, must be empty". 적용 가능한 집합은 다음과 같습니다:
| 옵션 | 허용하는 모델 |
|---|---|
service_tier ('default' | 'flex') | Seedance 1.x만 해당 — Seedance 2.5와 2.0 제품군에서는 거부됨 |
camera_fixed | Seedance 1.x 만 지원 |
frames (소수점 단위 출력, 25 + 4n 에서 [29, 289]) | seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015 |
draft (저렴한 저해상도 미리보기) | seedance-1-5-pro-251215 만 지원 |
priority (0–9) | Seedance 2.5 및 dreamina-seedance-2-0-* 시리즈 |
duration: -1 (모델이 길이를 선택) | Seedance 2.5, 2.0 및 seedance-1-5-pro-251215 |
output_format ('mp4' | 'mov') | Seedance 2.5 (기본 mp4) |
seed, watermark, generate_audio, return_last_frame, callback_url | 모든 모델 |
동영상에서 watermark의 기본값은 false입니다(Seedream 이미지와 반대입니다). generate_audio는 모든 곳에서 허용되지만 실제로 오디오 트랙을 생성하는 모델은 Seedance 2.5, 2.0, 1.5-pro뿐입니다.
해상도도 모델마다 다릅니다. 어떤 Seedance 모델에도 2K 등급은 없으며, 4k는 dreamina-seedance-2-0-260128에서만 제공되고, Seedance 2.5는 480p/720p/1080p를 지원합니다. 또한 이전 설명에 480p/720p만 지원한다고 되어 있지만 seedance-1-0-pro-fast-251015는 1080p도 지원합니다. 지원되지 않는 조합은 요청을 보내기 전에 명확한 오류와 함께 로컬에서 감지됩니다.
참조 미디어는 공유 역할 힌트인 start_frame, end_frame, reference를 따릅니다. Seedance 2.5와 2.0 제품군은 모든 멀티모달 참조(참조 이미지, 동영상, 오디오)를 지원합니다. Seedance 2.5는 추가로 오디오만 포함된 참조 입력과 참조 이미지 최대 30개, 동영상 10개, 오디오 클립 10개를 지원합니다(2.0은 각각 9개/3개/3개). 1.x 모델은 시작/끝 프레임만 지원하며 seedance-1-0-pro-fast-251015는 시작 프레임만 지원합니다.
Seedance 2.5
Seedance 2.5(dreamina-seedance-2-5-260628)는 이 패키지의 우선 지원 모델입니다. 더 긴 클립(최대 30초), 오디오만 포함된 참조 입력, output_format: 'mov'를 지원하는 현재의 멀티모달 플래그십입니다. 2.0 시리즈와 마찬가지로 계정에서 호출하려면 먼저 Ark Console에서 모델 활성화 또는 리소스 팩이 필요할 수 있습니다(그전까지는 404 ModelNotOpen이 반환됩니다).
import { generateVideo } from '@tanstack/ai'
import { byteplusVideo } from '@tanstack/ai-byteplus'
const { jobId } = await generateVideo({
adapter: byteplusVideo('dreamina-seedance-2-5-260628'),
prompt: 'a guitar being played in a store',
size: '16:9_1080p',
duration: 10,
modelOptions: {
generate_audio: true,
priority: 5,
output_format: 'mp4',
},
})
| 기능 | Seedance 2.5 |
|---|---|
| 기간 | 4~30초 또는 -1(모델이 선택하며 동영상 편집 작업에 필요) |
| 해상도 | 480p, 720p, 1080p (기본 720p) — 4k 없음 |
| 참조 미디어 | 이미지 1 |
| 첫 + 마지막 프레임 | 예 |
priority / generate_audio | yes |
service_tier / camera_fixed / frames / draft | no |
byteplusVideo()는 BytePlus가 패키지 릴리스 사이에 제공하는 id에 대해 여전히 모든 문자열을 허용합니다. 알 수 없는 id에서는 로컬 가드가 완화되어 Ark가 요청을 검증하며, 알려진 id(2.5 포함)는 문서화된 좁히기 규칙을 유지합니다.
이 어댑터의 Seedance와 fal을 통한 Seedance 비교
Seedance는 수백 개의 다른 호스팅 모델과 함께 프록시하는 @tanstack/ai-fal을 통해서도 사용할 수 있습니다. 이 어댑터는 BytePlus와 직접 통신하므로 BytePlus의 청구 및 속도 제한, BytePlus 자체 명명법의 모델 id, fal의 정규화된 부분집합이 아닌 위의 Seedance 우선 요청 필드(camera_fixed, draft, priority, 참조 미디어 역할)를 사용합니다. 이미 보유한 계정에 맞는 쪽을 선택하면 되며, Seedance만을 위해 둘 다 설치할 이유는 없습니다.
이미지 생성(Seedream)
import { generateImage } from '@tanstack/ai'
import { byteplusImage } from '@tanstack/ai-byteplus'
const result = await generateImage({
adapter: byteplusImage('dola-seedream-5-0-pro-260628'),
prompt: 'a guitar being played in a store',
size: '2K',
modelOptions: { watermark: false },
})
console.log(result.images[0]?.url)
size에는 토큰(1K, 2K, 4K) 또는 명시적 픽셀 값(2048x2048) 중 하나를 사용하며, 두 형식을 섞을 수는 없습니다. 기존 이미지를 편집하거나 조건으로 사용하려면 prompt 배열에 이미지 파트를 전달합니다(참조 최대 14개, dola-seedream-5-0-pro-260628에서는 10개).
import { generateImage } from '@tanstack/ai'
import { byteplusImage } from '@tanstack/ai-byteplus'
const result = await generateImage({
adapter: byteplusImage('seedream-5-0-260128'),
prompt: [
{ type: 'text', content: 'Put this guitar on a concert stage' },
{
type: 'image',
source: { type: 'url', value: 'https://example.com/guitar.png' },
},
],
})
console.log(result.images.length)
다음 두 가지 동작은 예상과 다를 수 있습니다.
watermark의 기본값은true입니다.watermark: false를 전달하지 않으면 BytePlus가 오른쪽 아래 모서리에 "AI generated"를 삽입합니다. 어댑터는 이 필드를 암묵적으로 설정하지 않으므로 공급자의 기본값이 적용됩니다.numberOfImages는 개수가 아니라 상한입니다. Seedream에는n매개변수가 없습니다. 이미지 두 개 이상을 요청하면 그룹 이미지 모드(max_images와 함께sequential_image_generation: 'auto')로 매핑되며, 모델이 프롬프트에 적합하다고 판단한 실제 이미지 수를 결정합니다. 4개를 요청해도 2개가 반환될 수 있으며, 이 경우 어댑터가 경고를 기록합니다.
결과 URL은 24시간 후 만료됩니다. 대신 바이트를 인라인으로 받으려면 modelOptions에 response_format: 'b64_json'을 전달합니다.
음성 합성(Seed Speech)
Seed Speech는 Ark 키가 아닌 BYTEPLUS_VOICE_API_KEY를 사용합니다.
import { generateSpeech } from '@tanstack/ai'
import { byteplusSpeech } from '@tanstack/ai-byteplus'
const result = await generateSpeech({
adapter: byteplusSpeech('seed-audio-1.0'),
text: 'welcome to the guitar store',
voice: 'en_female_stokie_uranus_bigtts',
format: 'mp3',
})
console.log(result.contentType, result.audio.length)
Seed Speech에는 최상위 speaker 필드가 없습니다. 음성은
references 항목 안에 전달되므로 어댑터가 voice를
references: [{ speaker: 'en_female_stokie_uranus_bigtts' }]로 변환합니다.
따라서 modelOptions.references는 해당 항목에 병합되지 않고 대체하므로, 음성 복제를 위해 references를 전달하는 요청에서는 voice가 조용히 제거됩니다. 클립과 함께 기본 음성도 사용하려면 speaker 멤버를 직접 포함해야 합니다.
음성 id의 접미사는 요청하는 세대를 나타냅니다.
_uranus_bigtts— 현재 세대인 TTS 2.0 음성입니다._mars_bigtts/_moon_bigtts— TTS 1.0 음성입니다.*_emo_v2_*— 감정 태그도 허용하는 TTS 1.0 음성입니다.
전체 목록은 BytePlus 음성 목록에 있으며 이 패키지의 릴리스보다 훨씬 자주 변경되므로 모든 문자열을 허용합니다.
출력 형식은 wav, mp3, pcm, ogg_opus입니다. ogg_opus, 명시적 sample_rate, references(음성 복제 — 30초 오디오 클립 최대 3개이며 텍스트에서 @Audio1–@Audio3으로 지정), watermark, 단어 단위 타이밍에는 modelOptions를 사용합니다.
import { generateSpeech } from '@tanstack/ai'
import { byteplusSpeech, type BytePlusTTSResult } from '@tanstack/ai-byteplus'
const result: BytePlusTTSResult = await generateSpeech({
adapter: byteplusSpeech('seed-audio-1.0'),
text: 'welcome to the guitar store',
modelOptions: {
format: 'ogg_opus',
sample_rate: 48000,
speech_rate: 20,
enable_subtitle: true,
},
})
for (const sentence of result.subtitle?.sentences ?? []) {
console.log(sentence.text, sentence.start_time)
}
다음 세 가지를 고려해야 합니다.
- 합성 출력은 120초로 제한됩니다. 제한은
originalDuration(speech_rate적용 전 길이)에 적용되며, BytePlus가 과금하는 기준도 이 값입니다. - 자막 타이밍은 밀리초인 반면
duration과originalDuration은 초 단위입니다. 실제로 단위가 다릅니다. - 결과의
url은 생성 후 약 2시간이 지나면 만료되므로 링크가 아닌 base64audio를 영속화해야 합니다.
클라이언트 부분은 표준 useGenerateSpeech 훅이며, BytePlus에만 해당하는 내용은 없습니다.
전사(Seed Speech ASR)
음성 키를 사용합니다. 엔드포인트는 동기식이므로 오디오를 입력하면 폴링 없이 전사 결과가 출력됩니다.
import { generateTranscription } from '@tanstack/ai'
import { byteplusTranscription } from '@tanstack/ai-byteplus'
import { audioFile } from './audio'
const result = await generateTranscription({
adapter: byteplusTranscription('seed-asr'),
audio: audioFile,
modelOptions: { enable_punc: true, enable_speaker_info: true },
})
console.log(result.text)
for (const segment of result.segments ?? []) {
console.log(segment.speaker, segment.text)
}
오디오는 File, base64, 데이터 URL 또는 공개 URL일 수 있으며 최대 2시간, 100MB입니다. enable_itn은 말한 숫자와 날짜를 숫자 표기로 변환하고, enable_punc는 구두점을 삽입하며, enable_ddc는 간투사를 제거하고, enable_speaker_info는 segment.speaker로 노출되는 화자 레이블을 연결합니다.
지원 모델
- 채팅 —
dola-seed-2-1-turbo-260628,seed-2-0-lite-260428,seed-2-0-mini-260428,seed-2-0-pro-260328,seed-2-0-lite-260228,seed-2-0-mini-260215,seed-2-0-code-preview-260328,seed-1-8-251228,seed-1-6-250915,seed-1-6-250615,seed-1-6-flash-250715,seed-1-6-flash-250615,glm-5-2-260617,glm-4-7-251222,deepseek-v4-pro-260425,deepseek-v4-flash-260425,deepseek-v3-2-251201,gpt-oss-120b-250805. - 비디오 —
dreamina-seedance-2-5-260628,dreamina-seedance-2-0-260128,dreamina-seedance-2-0-fast-260128,dreamina-seedance-2-0-mini-260615,seedance-1-5-pro-251215,seedance-1-0-pro-250528,seedance-1-0-pro-fast-251015. - 이미지 —
dola-seedream-5-0-pro-260628,seedream-5-0-260128,seedream-5-0-lite-260128,seedream-4-5-251128,seedream-4-0-250828. - 음성 —
seed-audio-1.0(TTS) 와seed-asr(전사).
BytePlus는 모델 id를 빠르게 폐기하고 공개 목록에도 더 이상 확인되지 않는 id가 포함되므로, 이 패키지는 실제 요청에 응답한 날짜가 포함된 id만 제공합니다. BYTEPLUS_CHAT_MODELS, BYTEPLUS_VIDEO_MODELS, BYTEPLUS_IMAGE_MODELS, BYTEPLUS_TTS_MODELS, BYTEPLUS_TRANSCRIPTION_MODELS가 권위 있는 목록이며 모델 선택기 구축을 위해 내보냅니다.
API 레퍼런스
모든 팩토리는 환경 변수 형식과 명시적 키 형식을 제공합니다.
byteplusText(model, config?) / createBytePlusText(model, apiKey, config?)
Seed, GLM, DeepSeek, gpt-oss 모델용 채팅 어댑터입니다. ARK_API_KEY(또는 BYTEPLUS_API_KEY)를 읽습니다. config.baseURL은 리전 엔드포인트를 재정의합니다.
byteplusVideo(model, config?) / createBytePlusVideo(model, apiKey, config?)
Seedance 동영상 어댑터(실험적 기능)입니다. ARK_API_KEY를 읽습니다.
byteplusImage(model, config?) / createBytePlusImage(model, apiKey, config?)
Seedream 이미지 어댑터입니다. ARK_API_KEY를 읽습니다.
byteplusSpeech(model, config?) / createBytePlusSpeech(model, apiKey, config?)
Seed Speech TTS 어댑터입니다. **BYTEPLUS_VOICE_API_KEY**를 읽습니다.
byteplusTranscription(model, config?) / createBytePlusTranscription(model, apiKey, config?)
Seed Speech 전사 어댑터입니다. **BYTEPLUS_VOICE_API_KEY**를 읽습니다.
공급자 도구
BytePlus는 공급자별 도구 팩토리를 노출하지 않습니다. @tanstack/ai의 toolDefinition()으로 직접 정의하면 됩니다. Ark의 도구 호출은 표준 OpenAI 형식이며 일반적인 도구 흐름과 함께 작동합니다.