UNPKG

@tanstack/ai

Version:

Type-safe TypeScript AI SDK for streaming chat, tool calling, agents, structured outputs, and multimodal generation.

149 lines (130 loc) 7.08 kB
# BytePlus Adapter Reference ## Package ``` @tanstack/ai-byteplus ``` ## Adapter Factories | Factory | Type | Description | | ----------------------- | ------------- | -------------------------- | | `byteplusText` | Text/Chat | ModelArk chat completions | | `byteplusVideo` | Video | Seedance async task API | | `byteplusImage` | Image | Seedream image generation | | `byteplusSpeech` | TTS | Seed Speech text-to-speech | | `byteplusTranscription` | Transcription | Seed Speech ASR | Each has a `createBytePlus*(model, apiKey, config?)` sibling that takes an explicit key instead of reading the environment. ## Import ```typescript import { byteplusText, byteplusVideo, byteplusImage, } from '@tanstack/ai-byteplus' import { byteplusSpeech, byteplusTranscription } from '@tanstack/ai-byteplus' ``` ## Key Chat Models | Model | Context | Notes | | ---------------------------- | ------- | ------------------------------------------------------------------ | | `dola-seed-2-1-turbo-260628` | 256K | Flagship; text/image/video in; structured output; thinking summary | | `seed-2-0-lite-260428` | 256K | Good default; audio in; **no** structured output | | `seed-2-0-mini-260428` | 256K | Smallest 2.0; audio in; **no** structured output | | `seed-2-0-pro-260328` | 256K | Structured output; thinking summary | | `seed-2-0-lite-260228` | 256K | Structured output — use instead of `-260428` for typed output | | `seed-1-6-flash-250715` | 256K | Fast/cheap; structured output | | `glm-5-2-260617` | 1024K | Structured output; `reasoning_effort` incl. `none`/`xhigh`/`max` | | `deepseek-v4-pro-260425` | 1024K | 384K output; no structured output | | `deepseek-v3-2-251201` | 128K | Reasoning defaults **off**; no structured output | | `gpt-oss-120b-250805` | 128K | Only model accepting `thinking: { type: 'auto' }` | `BYTEPLUS_CHAT_MODELS` is the full list of 18 (also `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-250615`, `glm-4-7-251222`, `deepseek-v4-flash-260425`). Media models: `BYTEPLUS_VIDEO_MODELS` (Seedance — `dreamina-seedance-2-0-260128` / `-fast-260128` / `-mini-260615`, `seedance-1-5-pro-251215`, `seedance-1-0-pro-250528`, `seedance-1-0-pro-fast-251015`), `BYTEPLUS_IMAGE_MODELS` (Seedream — `dola-seedream-5-0-pro-260628`, `seedream-5-0-260128`, `seedream-5-0-lite-260128`, `seedream-4-5-251128`, `seedream-4-0-250828`), `BYTEPLUS_TTS_MODELS` (`seed-audio-1.0`) and `BYTEPLUS_TRANSCRIPTION_MODELS` (`seed-asr`). ## Provider-Specific modelOptions ```typescript chat({ adapter: byteplusText('dola-seed-2-1-turbo-260628'), messages, modelOptions: { // Ark-only thinking: { type: 'enabled' }, // 'enabled' | 'disabled' | 'auto' ('auto': gpt-oss-120b only) reasoning_effort: 'medium', // 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' repetition_penalty: 1.1, service_tier: 'default', // 'default' | 'flex' (flex = cheaper offline batch queue) // Sampling (OpenAI-compatible names) temperature: 0.7, top_p: 0.9, top_k: 40, frequency_penalty: 0.5, presence_penalty: 0.5, seed: 42, stop: ['\n\n'], // Token limits — mutually exclusive max_tokens: 2048, // max_completion_tokens: 2048, // Tool calling tool_choice: 'auto', parallel_tool_calls: true, // Logging / attribution logprobs: true, top_logprobs: 5, user: 'user-123', }, }) ``` `response_format` is deliberately **not** a provider option — the chat activity owns it via `outputSchema`. ## Environment Variables ``` ARK_API_KEY # chat, video, image (falls back to BYTEPLUS_API_KEY) BYTEPLUS_VOICE_API_KEY # TTS + transcription — a DIFFERENT product key ``` ## Gotchas - **Two products, two keys.** ModelArk uses `Authorization: Bearer $ARK_API_KEY` at `ark.ap-southeast.bytepluses.com`; Seed Speech uses `X-Api-Key: $BYTEPLUS_VOICE_API_KEY` at `voice.ap-southeast-1.bytepluses.com`. An Ark key on the voice host fails with `45000010 Invalid X-Api-Key`. - **Ark keys are region-isolated.** The default base URL is ap-southeast; the EU endpoint serves chat and image only (no Seedance). Override with `config.baseURL`. - **Structured output is per model and fails loud.** Only the 10 ids in `BYTEPLUS_STRUCTURED_OUTPUT_CHAT_MODELS` accept `json_schema`; the other 8 reject `json_object` too, so there is no JSON-mode fallback. `glm-4-7-251222` is excluded deliberately — it accepts the schema with `200` and then answers in prose. `seed-2-0-lite-260428` is _not_ on the list. - **`reasoning_effort` + `thinking: { type: 'disabled' }` is a 400.** So is sending both `max_tokens` and `max_completion_tokens`. - **`reasoning_effort` values are gated per model.** `minimal` / `low` / `medium` / `high` are general; `none` and `xhigh` are accepted only by `glm-5-2-260617`; `max` only by `glm-5-2-260617` and the two `deepseek-v4-*-260425` models. `thinking: { type: 'auto' }` is `gpt-oss-120b-250805` only. - **Reasoning is on by default** on every model except `deepseek-v3-2-251201`. - **`encrypted_content` round-trip.** The four thinking-summary models (`dola-seed-2-1-turbo-260628`, `seed-2-0-lite-260428`, `seed-2-0-mini-260428`, `seed-2-0-pro-260328`) emit an opaque signature over the reasoning trace that BytePlus asks for back on the next turn. The adapter round-trips it automatically over the same seam Anthropic thinking signatures use: it is captured onto `STEP_FINISHED.signature`, which lands on the thinking part as `ModelMessage.thinking[].signature` and is echoed back on the following request. Code that persists and replays history by hand must **keep the thinking part's `signature`** — not "message metadata", which is a different field and carries nothing here. Losing it costs a reasoning-cache hit, not the request: a live probe confirmed Ark accepts a turn whose assistant message omits `encrypted_content`. A structured-output turn doesn't capture the blob at all, for the same reason. - **Model ids are dated and retired aggressively.** Only ids verified against a live request are exported; the published BytePlus lists include dead ones. Bare ids mostly don't resolve — the `dola-` prefix is required on `dola-seed-2-1-turbo-260628` and the `dreamina-` prefix on the Seedance 2.0 family, but adding `dola-` to an older id 404s. - **Media option applicability is per model and enforced server-side** — Ark 400s on an inapplicable Seedance field instead of ignoring it. See the media-generation skill.