The short version: DeepSeek retires its two legacy model aliases — deepseek-chat and deepseek-reasoner — on July 24, 2026 at 15:59 UTC. After that, any request that names them errors. The fix is a one-string change per call: deepseek-chat → deepseek-v4-flash, and deepseek-reasoner → deepseek-v4-flash (thinking mode) or deepseek-v4-pro for the heavy stuff. The API stays OpenAI-compatible, so nothing else moves. The one non-cosmetic catch: V4 defaults to thinking mode ON, which will change the latency and token bill for anyone who used deepseek-chat to be fast and cheap.
What is actually changing#
For two years, deepseek-chat and deepseek-reasoner were the names you hard-coded. They were always aliases — pointers to whatever DeepSeek's current generation was underneath. During the current grace period they already transparently route to the V4 line, so you are running V4 today whether your code says so or not. On the 24th, DeepSeek stops honoring the old pointers and you have to name the real model.
The mapping is small enough to memorize:
deepseek-chat→deepseek-v4-flash— the cheap, fast, everyday model.deepseek-reasoner→deepseek-v4-flashin thinking mode for most reasoning, ordeepseek-v4-prowhen you need the strongest chain-of-thought or the full 1M context.
The migration: one line#
Because the API is OpenAI-compatible, you keep your SDK, your base URL, and your auth. You change the model string. Here it is in Python with the OpenAI client:
from openai import OpenAI
client = OpenAI(
api_key="YOUR_DEEPSEEK_KEY",
base_url="https://api.deepseek.com",
)
# BEFORE — errors after 2026-07-24 15:59 UTC
# resp = client.chat.completions.create(
# model="deepseek-chat",
# messages=[{"role": "user", "content": "Summarize this changelog."}],
# )
# AFTER — pin the explicit V4 model
resp = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[{"role": "user", "content": "Summarize this changelog."}],
)
And the same change over raw HTTP:
curl https://api.deepseek.com/chat/completions \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-flash",
"messages": [{"role": "user", "content": "Summarize this changelog."}]
}'
Grep your codebase — and your prompt configs, notebooks, and env files — for the literal strings deepseek-chat and deepseek-reasoner. Aliases hide in more places than the one call you remember.
The default that will surprise you#
The name swap is loud: miss it and you get an error the moment the cutoff passes. The behavior change is quiet, and quiet is worse.
deepseek-chat was non-thinking by default — that was the whole point of reaching for it over the reasoner. The V4 models default to thinking mode ON. Swap the name and leave the default, and every reply now spends reasoning tokens before it answers: slower responses, higher output token counts, a bigger bill — for workloads (classification, extraction, short chat) that never needed it.
If you migrated deepseek-chat for its speed, explicitly select non-thinking mode when you move to deepseek-v4-flash (see DeepSeek's docs for the current parameter). Treat "thinking off" as the deliberate choice it now is, not something you inherit.
Pricing, so you can size the change#
deepseek-v4-flash is $0.14 per million input tokens and $0.28 per million output, with a 1M-token context window and up to 384K output — and cache hits on repeated input cost a fraction of that. deepseek-v4-pro is $1.74 / $3.48. For most agent backends, Flash in non-thinking mode is the like-for-like replacement for what deepseek-chat cost you; Pro is a deliberate upgrade for the hardest reasoning or the longest contexts, not a default.
The 10-minute checklist#
- Find every alias.
grep -r "deepseek-chat\|deepseek-reasoner"across code, configs, and notebooks. - Swap the names.
deepseek-chat→deepseek-v4-flash;deepseek-reasoner→deepseek-v4-flash(thinking) ordeepseek-v4-pro. - Decide thinking, per call. Fast/cheap paths: turn it off explicitly. Reasoning paths: leave it on.
- Pin, don't alias. Name the explicit version and log which model each request used, so the next retirement is a diff, not a fire.
- Watch cost and latency for a day. If either jumped, a thinking default slipped through.
The change itself is trivial. The reason it is worth a checklist is the second-order lesson every hard-coded alias eventually teaches: convenience that silently re-points is a dependency you don't control until the day it moves. Pin the name, own the switch.
Migrating the model underneath a running agent is its own discipline — we walked through it end to end in How to Migrate an AI Agent to a New LLM. And if you're weighing Flash against Pro for an agent backend, DeepSeek V4 Pro vs Flash for Agents is the decision in one table.



