Direct
Direct upstream connection — best when you need native behavior and the full context window.
| Input | Output | Cache read |
|---|---|---|
| 0.44/M | 1.32/M | 0.01/M |

deepseek-v4-flash-vision-expUse the experimental deepseek-v4-flash-vision-exp model to perform mixed image and text tasks, such as screenshot inspection, document extraction, chart analysis, and visual agent.
The same model is available through multiple service channels — choose based on latency, reliability and cost.
Prices in $ / 1M tokensprovider field to the request body, for example "provider": { "channel": "direct" }. Valid values are direct / stable / economical; omit it to use the default channel.Direct upstream connection — best when you need native behavior and the full context window.
| Input | Output | Cache read |
|---|---|---|
| 0.44/M | 1.32/M | 0.01/M |
DeepSeek V4 Flash Vision Exp is an experimental multimodal model launched by DeepSeek on August 21, 2026, adding image understanding capabilities on top of V4 Flash. Text capabilities — including agent, reasoning, and world knowledge — are fully on par with V4 Flash, meaning adding vision does not sacrifice existing text performance.
The most notable change is its leap in multimodal agent benchmarks: overall performance approaches Claude Opus 4.8, surpassing it in 3 of 11 benchmarks. ApexBench (Pass@1) jumps from 26.2 for the text-only V4 Flash to 36.5, and Terminal Bench 2.1 reaches 83.9 (V4 Flash: 82.7, Opus 4.8: 85.0) — while it remains the same efficient sparse MoE with 13B activated parameters.
SeaWhale AI provides DeepSeek V4 Flash Vision Exp through an OpenAI-compatible interface, supporting image input, tool calling, and streaming output.
Get API Key · Model ID:
deepseek-v4-flash-vision-exp
This is the core of this upgrade. With vision added, the model can directly "see" screenshots, interfaces, and charts in agent workflows to decide its next action, and its performance on multimodal agent benchmarks is now close to top closed-source models.
Supports three core vision tasks — image description, text extraction from screenshots, and chart analysis — covering the main scenarios of everyday multimodal needs.
Each image is billed for at most 384 tokens, regardless of resolution; the detail field can also be used to further reduce token consumption for images that don't require high detail. Images are priced at the V4 Flash tier.
detail field reduces consumption on demandSupports four formats: JPEG, PNG, GIF, and WebP, detecting format by actual file content rather than extension. Images can be passed via embedded Base64, public URLs (up to 32 MiB), or the free Files API (up to 64 MiB) — with the Files API, a single upload can be reused across requests via file_id, avoiding repeated transfers.
| Scenario | Description |
|---|---|
| Multimodal agent | Automated workflows that operate interfaces by viewing screenshots and make decisions by reading charts |
| Document digitization | Batch text extraction and structuring from scanned documents and screenshots |
| Chart analysis | Interpretation of reports, diagrams, and technical drawings |
| Mixed text-and-image long documents | Multimodal document understanding within a 1M token window |
| Large-scale image pipelines | 600 images per request + per-image cost cap, suitable for scaled processing |
| Low-cost vision prototyping | Validate multimodal product ideas at Flash-tier pricing |
| Capability | V4 Flash Vision Exp | V4 Flash |
|---|---|---|
| Model ID | deepseek-v4-flash-vision-exp |
deepseek-v4-flash |
| Input modality | Text + image | Text only |
| Text capabilities | On par with Flash | Baseline |
| ApexBench (Pass@1) | 36.5 | 26.2 |
| Terminal Bench 2.1 | 83.9 | 82.7 |
| Total / activated parameters | 284B / 13B | 284B / 13B |
| Context window | 1M tokens | 1M tokens |
| Max output | 384K token | 384K token |
| Status | Experimental (Exp) | Stable |
For specific billing, refer to the real-time price card at the top of the page.
What is its relationship with V4 Flash? It is the multimodal experimental version of V4 Flash: the same 284B/13B sparse MoE base, text capabilities on par, with image input added. Think of it as "Flash that can see images."
How good is its multimodal performance? It approaches Claude Opus 4.8 overall on multimodal agent benchmarks, surpassing it in 3 of 11. Representative data: ApexBench (Pass@1) 36.5, Terminal Bench 2.1 83.9.
How is image billing calculated?
Each image is converted to at most 384 tokens, regardless of resolution, priced at the V4 Flash tier. For images that don't require high detail, use the detail field to further save tokens.
What are the image input limits? Supports JPEG, PNG, GIF, WebP; up to 600 images per request; max long edge 8192 pixels (reduced to 4096 when more than 15 images); max file size 32 MiB via URL and 64 MiB via Files API. Images are normalized to approximately 800×800 pixels before processing.
What does the "Exp" suffix mean? It is an experimental version DeepSeek uses to validate the multimodal direction; the interface and behavior may be adjusted upon the stable release. In production, it is recommended to make the model ID configurable for a smooth future switch to the stable version.
Context and output limits? 1M token context and max output of 384K token, the same as V4 Flash.
deepseek-v4-flash-vision-exphttps://api.seawhaleai.com/v2/"provider": { "channel": "direct" }SeaWhale AI is compatible with the OpenAI API protocol, so you can call it with the OpenAI SDK or plain HTTP requests. Streaming is enabled by default.
About the provider parameter (optional, a SeaWhale AI extension): most models are served over several channels that differ slightly in price and reliability. Add a provider field to the request body to pick one; omit it and the system selects the default channel — normal calls are unaffected.
provideris not part of the official OpenAI protocol — it is a SeaWhale AI extension that only takes effect on this platform. The OpenAI SDK allows custom fields like this to pass through; see the examples below.
| Value | Channel | Best for |
|---|---|---|
direct | Direct | The official upstream link, for native behavior and the full context window |
stable | Preferred | Balanced availability and speed — a good default for production traffic |
economical | Economy | Cost first, well suited to batch processing and price-sensitive workloads |
Available channels and their prices are listed under "Pricing" above (channels vary by model). Additional notes:
"provider": { "channel": "direct" }.extra_body; in Node.js put it directly on the request object and it passes through. In TypeScript projects, add a // @ts-expect-error line to skip the type check.curl https://api.seawhaleai.com/v2/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <API_KEY>" \
-d '{
"model": "deepseek-v4-flash-vision-exp",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
],
"provider": { "channel": "direct" },
"stream": true
}'
# provider is optional — remove this line to use the default channelfrom openai import OpenAI
client = OpenAI(
base_url="https://api.seawhaleai.com/v2",
api_key="<API_KEY>",
)
stream = client.chat.completions.create(
model="deepseek-v4-flash-vision-exp",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"},
],
stream=True,
# Optional: pick a service channel; omit to use the default
extra_body={"provider": {"channel": "direct"}},
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)import OpenAI from 'openai'
const client = new OpenAI({
baseURL: 'https://api.seawhaleai.com/v2',
apiKey: '<API_KEY>',
})
const stream = await client.chat.completions.create({
model: 'deepseek-v4-flash-vision-exp',
messages: [
{ role: 'system', content: 'You are a helpful assistant.' },
{ role: 'user', content: 'Hello!' },
],
stream: true,
// Optional: pick a service channel; omit to use the default
// @ts-expect-error provider is a SeaWhale AI extension, not in the OpenAI SDK types
provider: { channel: 'direct' },
})
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '')
}