Overview
BytePlus ModelArk (Ark) is ByteDance’s model platform for international customers. Its chat, Responses and image APIs follow the OpenAI shape with extra fields, and video generation runs as async tasks. Bifrost has its own BytePlus implementation that reuses the shared OpenAI converters where the wire format matches. Key characteristics:- OpenAI-compatible chat. Chat Completions use
/api/v3/chat/completions. - Native Responses API. Requests go to Ark’s own
/api/v3/responses. - Reasoning. Reasoning models think by default. Bifrost maps
reasoning_effortonto Ark’sthinkingswitch and returnsreasoning_contentas the message’sreasoning. - Tool calling and vision. Function tools and
image_urlparts use the OpenAI schema. Vision depends on the model. - Embeddings. Served by the multimodal embedding endpoint, one upstream call per input item.
- Image generation and editing. Seedream models through
/api/v3/images/generations. - Video generation. Seedance models as async tasks through
/api/v3/contents/generations/tasks.
Supported operations
Setup and configuration
Bifrost callshttps://ark.ap-southeast.bytepluses.com by default and sends the Ark API key as a bearer token. API keys belong to one region, so to use another region set network_config.base_url to that region’s host, for example https://ark.eu-west.bytepluses.com. The same provider also works against Volcengine Ark in mainland China with https://ark.cn-beijing.volces.com and a Volcengine key. Bifrost appends the /api/v3/... paths itself, so the base URL is the host only.
Ark only serves models you have activated in the ModelArk console. A request for any other model fails with a 404 whose error code is ModelNotOpen. The model field takes either a model ID such as deepseek-v4-flash-260425 or an endpoint ID such as ep-20260101000000-abcde.
- Web UI
- config.json
- API
- Go SDK
- Navigate to Models > Model Providers. Look for BytePlus under Configured Providers. If it is missing, click Add New Provider and select BytePlus.
- Click Add Key or edit an existing key.
- Set a name for your key.
- Paste your Ark API key directly or use an environment variable (for example,
env.BYTEPLUS_API_KEY). - Under Allowed Models, list the model or endpoint IDs this key should serve. Ark has no model list endpoint, so these are also the models Bifrost lists for the provider.
- Save the provider configuration.
1. Chat Completions
Request parameters
BytePlus supports the OpenAI chat parameters Ark documents, includingmax_completion_tokens, temperature, top_p, tools, tool_choice, response_format, stream and stream_options. For the full parameter reference, see OpenAI Chat Completions.
Ark hosts ByteDance’s Seed models alongside third-party models such as DeepSeek (deepseek-v4-flash-260425), GLM and gpt-oss-120b. The ModelArk console lists what your account can activate. Some chat models, including deepseek-v4-flash, take text only and reject image_url parts with a 400.
Reasoning
Reasoning models such as Seed and DeepSeek V4 think unless told not to. Ark returns the thinking asreasoning_content, which Bifrost exposes as the message’s reasoning. reasoning_effort maps onto Ark’s values like this:
Extra parameters
Extra parameters pass through, so Ark-only fields such asthinking, service_tier or repetition_penalty reach the API unchanged.
Errors
Ark returns OpenAI-shaped errors. Bifrost keeps Ark’s string error code, for exampleModelNotOpen, InvalidEndpointOrModel.NotFound or RateLimitExceeded.EndpointTPMExceeded, in error.code.
2. Responses API
Responses requests go to Ark’s native/api/v3/responses, streamed or not. Ark-only fields such as thinking, caching and expire_at can be sent through extra params.
3. Embeddings
BytePlus serves embeddings through the multimodal modelskylark-embedding-vision-251215 on /api/v3/embeddings/multimodal. That endpoint fuses every part of a request into one vector, so Bifrost sends each input item as its own call, up to 8 at a time, and returns the vectors in input order with usage added up. An item can mix text, image and video parts, and comes back as one vector.
Per-item
dimensions override the request-level value, since every item is a separate call. task_type and title are not forwarded to BytePlus. Token-ID inputs aren’t supported.
4. List Models
Ark has no model list endpoint on its API-key surface, so Bifrost lists the models and aliases configured on each key, the same way it does for Fireworks.5. Image Generation and Editing
Seedream generates and edits images through the same endpoint. An edit request sends its source images as Seedream reference images.
Any other extra params, such as
background, layer_decomposition or optimize_prompt_options, are sent to Ark unchanged. When content safety blocks some images in a group, Bifrost returns the rest. When it blocks all of them, the request fails with a 400 carrying Ark’s error code.
Streaming
Setstream: true to get each image as soon as Seedream finishes it. Ark streams on Seedream 5.0 lite, 4.5 and 4.0 only. Seedream 5.0 pro and flash reject the request with a 400.
image_generation.partial_image event (image_edit.partial_image for edits) carrying its url or b64_json. The stream ends with one image_generation.completed event that carries the usage and repeats the last image. An image blocked by content safety is skipped and the rest keep coming. The stream ends with an error if Ark reports an internal error, or if every image is blocked.
6. Video Generation
Seedance video generation is asynchronous. Create a task, poll it, then download the result.Parameter mapping
Image references, and the first and last frames, also accept the
asset://<ASSET_ID> form for media in your Ark asset library.
Other extra params are sent to Ark unchanged. That covers draft, return_last_frame, service_tier, priority, execution_expires_after, omni_reference_task_type, camera_fixed, frames, watermark and safety_identifier. A task created with return_last_frame: true lists the final frame as a second videos[] entry with content_type: image/jpeg, after the video, so GET /v1/videos/{id}/content still downloads the video. A mov output comes back with content_type: video/quicktime.
To work from a draft, create a task with draft: true at 480p, then create a second task with extra_params.draft_task_id set to the draft’s ID as Bifrost returned it. Drafts are valid for 7 days.
Failed, cancelled and expired tasks all come back as status: failed, with Ark’s error code when it gives one. Model availability differs by region, so check the ModelArk console before pointing video traffic at a non-default region.
