If you route an image to “DeepSeek V4” because the brand sounds multimodal, you will get a failed request. According to OpenRouter’s 16 September 2026 guide, V4 is a family of slugs with different input modalities, and only two of them accept an image.
Which V4 slugs actually take an image
The catalog lists V4.1 Flash, V4 Pro 0813, V4 Flash 0731, V4 Flash Vision Exp, two older 0423 checkpoints, and a Flash “latest” alias. Per the OpenRouter model-by-model breakdown, only deepseek/deepseek-v4.1-flash and deepseek/deepseek-v4-flash-vision-exp list image among their input modalities. Everything else — V4 Pro 0813, V4 Flash 0731, both 0423 checkpoints, and the ~deepseek/deepseek-v4-flash-latest alias — is text in, text out.
That alias is the trap. OpenRouter reports it resolved to Flash 0731 at the time of writing, so an image request sent through it fails. Pin the exact slug instead.
The two image routes, and what each costs you
V4.1 Flash is the default choice for new image work. OpenRouter describes it as built on DeepSeek’s Causal Encoder-Decoder architecture, activating 8B parameters on input and 16B on output from a 552B backbone, with visual and text embeddings trained jointly from the start of pre-training. It is not marked experimental, and it listed at $0.15 per million input tokens and $0.60 per million output on 11 September 2026.
V4 Flash Vision Exp is the experimental alternative: a vision-enabled variant of Flash 0731 that shipped 21 August 2026 and was the only image-capable V4 model until V4.1 Flash arrived on 10 September 2026. It listed at $0.22 in and $0.66 out. OpenRouter’s advice is to use V4.1 Flash unless you have a specific reason to test the experimental one.
The request shape is ordinary chat with an image part added. In the TypeScript SDK the body nests under chatRequest and the field is camelCase imageUrl, while the wire format is image_url. Send the text part before the image part.
const result = await openRouter.chat.send({
chatRequest: {
model: "deepseek/deepseek-v4.1-flash",
messages: [{
role: "user",
content: [
{ type: "text", text: "What error state is this screenshot showing?" },
{ type: "image_url", imageUrl: { url: "https://example.com/screenshot.png" } },
],
}],
stream: false,
},
});
When you need Pro reasoning, or video
No V4 Pro model accepts images, and no V4 model accepts video. The workaround is a two-call chain: run a vision-capable model first, then pass its text description into the V4 model you actually want. OpenRouter names qwen/qwen3.8-27b and moonshotai/kimi-k3 as models that accept image and video input.
That pattern costs more, and OpenRouter says so directly. On 11 September 2026, Qwen3.8 27B listed at $0.42 in and $3.00 out per million tokens, Kimi K3 at $2.10 and $10.53, and you pay the V4 model on top. Treat it as the route for text-only V4 reasoning or video, not the default way to read a still image.
One operational detail matters here: provider routing picks between providers of the model you named. It does not swap in a different model, so it cannot rescue an image request aimed at a text-only slug. If images can arrive without warning, inspect the message content in your own code and choose the model before sending. This is the same class of decision as the one in OpenRouter’s tool-calling loop guidance — the routing layer does what you tell it, so the branching logic belongs on your side.
Check modalities at runtime, not from memory
Model pages and the models API are the source of truth. The API returns input modalities as architecture.input_modalities on every model, which makes a cheap preflight check possible:
curl -s https://openrouter.ai/api/v1/models \
| jq -r '.data[] | select(.id | startswith("deepseek/deepseek-v4")) | "\(.id)\t\(.architecture.input_modalities | join(","))"'
Prices and checkpoints move, and OpenRouter notes that a later V4 checkpoint adding image input would show up in that same field. If your product ships image features on a pinned DeepSeek slug, that check is worth running in CI rather than trusting a note in a doc.
The practical takeaway: treat “DeepSeek V4” as a routing decision, not a model name. Pin deepseek/deepseek-v4.1-flash for image work, keep text traffic on whatever text slug you already run, and validate the modality list before an image ever reaches a text-only endpoint.
Sources
AI-assisted summary compiled from the sources above, reviewed by a human before publishing.
