Why this lesson exists
Model names are load-bearing. A retired alias does not throw an error — it silently routes to a different model at a different price. This lesson is the antidote to that specific, expensive confusion.
The two names that matter
As of the September 2026 generation, the DeepSeek API accepts two supported model identifiers.
| Model ID | Underlying model | Use it when |
|---|---|---|
deepseek-flash |
DeepSeek-V4.1-Flash | Default for almost everything. The high-throughput, cheapest-per-token, vision-capable workhorse. |
deepseek-v4-pro |
DeepSeek-V4-Pro-0813 | Rarely. Larger, slower, roughly four times the price, no vision support. |
Notice what is not on that list: deepseek-chat, deepseek-v4-flash, deepseek-v4-flash-vision-exp. Those names still resolve — the API will not reject them — but the models behind them have been retired. A request sent to a retired name is served by V4.1-Flash and billed at the Flash price.
The rule: send deepseek-flash. It is the canonical name, it is unambiguous, and it is what the pricing table is indexed on. Everything else is compatibility debt.
Why retired aliases are a trap, not a courtesy
Rerouting retired names is a kindness that creates a specific class of bug. Consider the failure it enables:
- You write integration code in the V4 era against
deepseek-v4-flash-vision-exp, because you needed the experimental vision model for a screenshot-parsing task. - V4.1-Flash ships. The experimental model is retired. Your string still works.
- Your code keeps passing tests. Your bills keep looking reasonable.
- Six months later you are debugging why a pipeline behaves differently, and the answer is that the model changed underneath you and nothing told you.
The lesson generalises well beyond DeepSeek: any identifier your system sends that is not the canonical current name is a silent dependency on someone else's migration policy. Treat alias resolution as a thing to eliminate, not a feature to rely on.
How to detect it in one call
A probe response echoes the model that actually served the request. Send a one-token completion with any model string and read the model field in the response. If you sent an alias and the response says deepseek-flash, you have been rerouted. Do this after any provider announcement — it costs a fraction of a cent and it is the only ground truth available.
curl https://api.deepseek.com/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-d '{
"model": "deepseek-v4-flash",
"messages": [{"role":"user","content":"hi"}],
"max_tokens": 1
}'
# Read the "model" field in the response. If it is not what you sent,
# you are on a compatibility route and should pin the canonical name.
The September 2026 architecture family
V4.1-Flash is described by DeepSeek as the smallest model in a new architecture family, released with native multimodal visual understanding. The family framing is the important part: a lab releasing the small model first, explicitly noting the architecture was built to scale "to larger models," is telling you the shape of the next few years.
What actually changed for you as a user:
- Vision is native, not bolted on. There is no separate vision endpoint to call. You send image content blocks in the same message array. The old
-vision-expmodel is gone and its capability has been absorbed. - Prices fell. The release notes state a price reduction alongside the model. Re-read the pricing table any time you are doing cost math — this generation has moved twice.
- Thinking is on by default. Both supported models support non-thinking and thinking modes, with thinking as the default. Lesson 9 is entirely about that switch.
Capabilities, in one table
This is the feature matrix you will keep coming back to. It is short, and every row is something you will eventually need.
| Capability | deepseek-flash | Notes |
|---|---|---|
| Context length | 1M tokens | Enormous. Lesson 11 covers using it without wasting it. |
| Max output | 384K tokens | Long enough for whole files and reports. |
| Thinking mode | Yes, default on | Non-thinking available. Effort levels: low / high / max. |
| Vision | Yes | Native multimodal input. Pro does not have this. |
| JSON output | Yes | Structured output support. |
| Tool calls | Yes | The basis of every agent pattern in Module 6. |
| OpenAI-format API | Yes | Base URL https://api.deepseek.com |
| Anthropic-format API | Yes | Base URL https://api.deepseek.com/anthropic |
| Responses API | Yes | Newer OpenAI-style surface. |
| Chat prefix completion | Beta | Force the start of a response. Useful for structured fills. |
| FIM completion | Beta | Fill-in-the-middle. Non-thinking mode only. |
| Concurrency limit | 2,500 | Generous. Pro is capped at 500. |
Checkpoint
- What are the two supported model IDs, and which is your default?
- What happens when you send
deepseek-v4-flashtoday? - Which supported model supports vision, and which does not?
- Name one capability that is beta-only, and one that is non-thinking-only.
Answers
deepseek-flashanddeepseek-v4-pro. Flash is the default for nearly everything.- The request is served by V4.1-Flash and billed at the Flash price — the model behind that name is retired.
deepseek-flashsupports vision;deepseek-v4-prodoes not.- Chat prefix completion and FIM completion are beta. FIM is non-thinking mode only.
Exercise: build the alias detector
Write a small script — ten lines is plenty — that takes a model string, sends a one-token completion, and asserts that the model field in the response matches what was sent. Print a clear warning when it does not.
Then run it against deepseek-v4-flash. You should see the warning fire. You now own a reusable detector for the single most common silent-failure class in provider integrations, and you built it in one lesson.
Next
You know what to call. Lesson 3 explains what is happening inside when you call it — and why that knowledge changes how you write prompts.