DeepSeek V4-Flash-0731 : thinking désactivé ?

Dernière mise à jour : 2 août 2026. Les informations ont été vérifiées dans la documentation officielle DeepSeek consacrée au mode thinking, à l’API Chat Completions, aux modèles et à la tarification.
La documentation DeepSeek indique que le mode thinking est activé par défaut et que disabled doit être transmis dans l’objet thinking. (api-docs.deepseek.com) Le gagnant est donc le contrôle du corps JSON final : si le dernier appel sortant contient thinking.type = disabled, le diagnostic peut avancer ; si cette valeur n’y figure pas, la configuration applicative ne constitue pas une preuve. Avec l’OpenAI SDK, l’objet doit passer par extra_body. Si une relecture directe est correcte mais que la production renvoie encore reasoning_content, il faut poursuivre vers la sérialisation du framework, la passerelle partagée et les sous-requêtes d’un AI Agent.
Cette analyse s’adresse :
- aux développeurs qui utilisent l’OpenAI SDK ou un framework compatible avec DeepSeek ;
- aux ingénieurs plateforme qui maintiennent une passerelle, un proxy ou un SDK interne ;
- aux équipes AI Agent dont la requête principale semble maîtrisée, mais dont l’usage total reste anormal.
Le symptôme apparent contre la preuve réseau
Après une migration, trois signaux sont souvent mélangés :
- un fichier de configuration affiche
disabled; - l’interface ne montre plus de raisonnement ;
- une réponse récente contient pourtant
reasoning_content, ou la latence et l’usage augmentent.
Ces signaux ne décrivent pas forcément le même appel. La documentation officielle précise que le mode thinking renvoie le contenu de raisonnement dans reasoning_content, au même niveau que content. Elle précise également que le mode est activé par défaut. (api-docs.deepseek.com)
Le premier contrôle consiste donc à relier quatre éléments :
- l’identifiant de requête ;
- le modèle annoncé dans la réponse ;
- l’heure de début et de fin ;
- les champs
usageetreasoning_content.
Un ancien message conservé dans une base de conversations peut contenir un champ de raisonnement sans que la réponse actuelle utilise encore ce mode. Le même problème existe avec le traitement en flux : un parseur peut avoir conservé dans un tampon une portion delta.reasoning_content produite par un appel précédent, puis l’afficher avec la réponse suivante.
Le raisonnement ne doit pas partir de l’écran applicatif. Il doit partir de la réponse brute associée à un identifiant précis.
Attention : la présence d’une clé
reasoning_contentdans un objet historique ne prouve pas que le dernier appel l’a générée. Il faut vérifier le corps HTTP et la réponse brute de la même transaction.
Depuis la migration, le libellé de version peut être présenté comme DeepSeek-V4-Flash-0731, tandis que le nom de modèle API reste deepseek-v4-flash. La documentation API actuelle liste deepseek-v4-flash et deepseek-v4-pro comme identifiants utilisables. (api-docs.deepseek.com) Le contrôle doit donc porter sur la valeur réellement envoyée, pas sur un alias affiché dans une console.
Le paramètre absent du corps OpenAI
Le piège le plus direct concerne l’OpenAI SDK. La documentation DeepSeek demande de placer le paramètre thinking dans extra_body lors d’un appel Chat Completions. (api-docs.deepseek.com) Une configuration interne telle que settings.thinking = "disabled" peut être correcte pour l’application, mais sans effet si aucun adaptateur ne la transforme en objet JSON reconnu.
Un exemple minimal à contrôler ressemble à ceci :
response = client.chat.completions.create(
model="deepseek-v4-flash",
messages=messages,
extra_body={
"thinking": {
"type": "disabled"
}
}
)
Le point important n’est pas le fragment de code en lui-même. C’est sa représentation après passage dans le SDK, le framework et le client HTTP. Le journal utile doit être une version désensibilisée du corps réellement sorti :
{
"model": "deepseek-v4-flash",
"thinking": {
"type": "disabled"
},
"messages": [
{"role": "user", "content": "[contenu masqué]"}
]
}
Les clés API, les messages confidentiels et les données personnelles doivent être supprimés. En revanche, model, thinking, reasoning_effort, tools, stream et les paramètres usage doivent rester visibles. Sans ces champs, une équipe peut seulement supposer que la valeur a été transmise.
Le champ reasoning_effort ne remplace pas thinking. La documentation distingue le basculement du mode et le niveau d’effort. Le premier utilise thinking.type, tandis que le second contrôle l’intensité lorsque le raisonnement est actif. (api-docs.deepseek.com) Pour désactiver le mode, changer uniquement reasoning_effort est donc une mauvaise piste.
La sérialisation SDK contre la configuration déclarée
Les frameworks compatibles avec OpenAI ne transmettent pas tous les champs inconnus. Certains construisent une liste blanche à partir des paramètres officiellement connus par leur propre modèle de données. Dans ce cas, extra_body peut être accepté par l’application, mais perdre son contenu au moment où l’adaptateur fabrique la requête HTTP.
La comparaison doit être effectuée à trois niveaux :
| Niveau contrôlé | Ce qui doit apparaître | Conclusion possible |
|---|---|---|
| Appel de l’application | extra_body.thinking.type = disabled |
La configuration de départ est correcte |
| Sortie de l’adaptateur | Le même objet après conversion | Le framework conserve ou supprime le champ |
| Requête réseau finale | thinking.type = disabled dans le JSON HTTP |
Seule preuve exploitable côté service |
Un cas classique se produit dans une chaîne de génération audio ou vidéo. Le module de scénario reçoit bien une option « sans raisonnement », mais le moteur de planification reconstruit ensuite l’appel avec une structure différente. La génération d’image, le découpage du scénario ou l’appel de transcription peuvent alors revenir au comportement par défaut.
Les journaux doivent montrer l’endroit précis où la valeur disparaît. Une capture de l’interface du framework ne suffit pas. Il faut utiliser, selon l’architecture, un intercepteur HTTP, un niveau de journalisation du client, une trace OpenTelemetry désensibilisée ou un échantillon direct vers l’API.
La documentation API indique que thinking.type accepte enabled ou disabled, avec enabled comme valeur par défaut. (api-docs.deepseek.com) Une omission accidentelle n’est donc pas neutre : elle revient à laisser le service choisir le mode par défaut.
La passerelle partagée contre l’appel direct
Une requête locale peut être correcte alors que la production réactive le thinking. La différence apparaît souvent dans une passerelle commune qui :
- remplace un alias de modèle par une route interne ;
- ajoute des paramètres selon le locataire ;
- applique une politique selon le type de tâche ;
- fusionne des variables d’environnement ;
- reconstruit le corps JSON avant l’envoi.
Le diagnostic doit comparer trois sorties indépendantes :
- appel direct vers l’endpoint officiel ;
- appel via la passerelle de test ;
- appel via la passerelle de production.
Pour chaque sortie, conserver au minimum :
| Champ | Appel direct | Passerelle de test | Production |
|---|---|---|---|
model réellement envoyé |
à relever | à relever | à relever |
thinking.type |
disabled attendu |
à comparer | à comparer |
| Alias ou route interne | aucun ou documenté | à relever | à relever |
| Identifiant de trace | requis | requis | requis |
reasoning_content dans la réponse |
à relever | à relever | à relever |
Il ne faut pas modifier le nom du modèle au hasard pour « forcer » un comportement. La documentation officielle associe les anciens noms deepseek-chat et deepseek-reasoner à des modes distincts pendant la période de compatibilité, puis annonce leur retrait après le 24 juillet 2026 à 15 h 59 UTC. (api-docs.deepseek.com) Le modèle et le mode doivent désormais être vérifiés séparément.
Les variables d’environnement sont une autre source de divergence. Une valeur comme THINKING_MODE=enabled peut être injectée au démarrage d’un service, puis fusionnée après la lecture de la configuration du dépôt. La configuration visible dans le code n’est alors pas celle qui gouverne la requête finale.
La requête principale contre les appels d’un AI Agent
Un AI Agent ne se limite pas toujours à un appel visible. Une interaction peut déclencher :
- une requête principale pour comprendre la demande ;
- une requête de planification ;
- un appel après retour d’un outil ;
- une nouvelle tentative après une erreur ;
- une synthèse finale.
La documentation DeepSeek montre que les appels d’outils peuvent générer plusieurs tours de raisonnement et que reasoning_content doit être conservé dans certaines requêtes suivantes lorsque des outils sont utilisés. (api-docs.deepseek.com) Cela crée une distinction importante : conserver un champ historique nécessaire au protocole n’est pas la même chose que réactiver le thinking sur une nouvelle requête.
Chaque nœud de la chaîne doit recevoir son propre paramètre thinking. Une option appliquée à l’entrée utilisateur ne se propage pas automatiquement aux appels fabriqués par le planificateur. Le contrôle doit donc utiliser un arbre de traces :
trace-8f2
├── appel principal model=... thinking=...
├── planification model=... thinking=...
├── outil recherche model=... thinking=...
├── nouvelle tentative model=... thinking=...
└── synthèse finale model=... thinking=...
Pour chaque ligne, l’équipe doit relever :
- le modèle retourné dans la réponse ;
- la valeur du mode dans le JSON sortant ;
- la présence de
reasoning_content; prompt_tokens,completion_tokenset les autres champsusagedisponibles ;- la durée totale et le nombre de tentatives.
La page tarifaire officielle précise que la facturation dépend du nombre de tokens d’entrée et de sortie, avec une distinction entre entrée en cache et entrée non mise en cache. Elle affiche actuellement, pour deepseek-v4-flash, 0,0028 USD par million de tokens en entrée cache hit, 0,14 USD en cache miss et 0,28 USD en sortie. (api-docs.deepseek.com) Ces montants ne permettent pas, à eux seuls, d’attribuer une hausse à la pensée active : il faut d’abord identifier quel appel produit les tokens.
FAQ de diagnostic
Les réponses ci-dessous couvrent les contrôles à effectuer sans confondre affichage, historique et requête réelle.
La checklist d’acceptation
Avant de déclarer la correction terminée, le développeur ou l’ingénieur plateforme peut valider chaque point :
- [ ] L’appel de référence utilise bien
model="deepseek-v4-flash"ou l’identifiant officiellement confirmé par l’environnement concerné. - [ ]
thinkingapparaît dansextra_bodyau niveau de l’appel OpenAI SDK. - [ ] Le JSON final désensibilisé contient exactement
"type": "disabled". - [ ] La valeur est toujours présente après la sérialisation du framework.
- [ ] La passerelle de test ne remplace pas
disabledparenabled. - [ ] La passerelle de production est comparée à l’appel direct sur le même échantillon.
- [ ] Les variables d’environnement et les règles de locataire ont été vérifiées.
- [ ] Les appels de planification, d’outil, de reprise et de synthèse ont leur propre valeur contrôlée.
- [ ] La réponse actuelle est reliée au même identifiant que la requête sortante.
- [ ]
reasoning_contentn’est plus généré sur l’échantillon de validation. - [ ] Les champs
usagesont comparés par nœud de trace et non uniquement au niveau de la requête principale. - [ ] Le flux continu est testé séparément du mode sans flux afin d’écarter un résidu de parseur.
Une seule case manquante ne prouve pas que le service a réactivé le thinking. Elle indique que la chaîne n’est pas encore suffisamment observable.
La relecture isolée contre la production opaque
La meilleure validation utilise une entrée fixe, courte et désensibilisée. Le même échantillon est envoyé successivement :
- directement à l’endpoint officiel ;
- via le client OpenAI SDK actuellement utilisé ;
- via le framework complet ;
- via la passerelle de test ;
- via la passerelle de production ;
- via le parcours AI Agent, si l’application en utilise un.
La comparaison porte sur le corps JSON final, le modèle retourné, reasoning_content, usage, le nombre de requêtes et les durées. Il ne faut pas promettre une baisse précise des coûts après la désactivation : le résultat dépend du nombre de sous-requêtes, de la longueur des messages, des reprises et des cache hits.
Pour les équipes qui doivent isoler plusieurs versions de SDK ou de passerelle, un environnement indépendant sur Mac peut être pertinent pour conserver des répertoires, des variables et des traces séparés. La console de ProxyMac peut servir de point de départ pour gérer un environnement distant, tandis que la documentation d’aide ProxyMac permet de vérifier les modalités d’accès et de session. Le besoin doit toutefois rester proportionné : une équipe qui possède déjà une chaîne de test reproductible n’a aucune raison de louer une ressource supplémentaire.
| Option de validation | Avantage | Limite réelle | Usage recommandé |
|---|---|---|---|
| Poste local unique | Rapide et peu coûteux à maintenir | Versions et variables difficiles à isoler | Vérification ponctuelle |
| Mac distant dédié | Environnement séparé, accès contrôlé, reproduction plus propre | Coût de location et gestion de session | Test SDK, passerelle et Agent |
| Environnement partagé | Mutualisation des ressources | Risque de configuration héritée ou de variables résiduelles | Équipe déjà équipée d’une gouvernance stricte |
| Appel direct temporaire | Référence simple du comportement officiel | Ne couvre pas les transformations internes | Première étape du diagnostic |
Le poste local reste préférable pour une reproduction quotidienne et stable. Le Mac distant devient intéressant lorsque la panne dépend d’une combinaison précise de versions, de variables d’environnement et de composants réseau.
| Couche | Preuve attendue | Échec typique | Action de correction |
|---|---|---|---|
| Configuration | Option interne définie | Valeur jamais convertie | Mapper l’option vers extra_body |
| SDK | Objet conservé après appel | Champ supprimé ou ignoré | Vérifier la version et l’adaptateur |
| Réseau | thinking.type=disabled |
Réécriture par proxy | Corriger la règle de fusion |
| Agent | Même valeur sur chaque sous-requête | Héritage absent | Passer le paramètre à chaque nœud |
| Réponse | Absence de raisonnement actuel | Historique pris pour une réponse | Corréler ID, horodatage et corps brut |
| Usage | Tokens associés à chaque trace | Coût attribué au mauvais appel | Agréger par arbre de requêtes |
Le recours à un environnement séparé n’est pas une solution au paramètre mal transmis. Il sert à rendre la comparaison reproductible. Une location est donc peu adaptée à un traitement lourd permanent ou à une équipe qui doit connecter des périphériques physiques spécifiques. En revanche, pour quelques jours de validation d’un SDK, d’une passerelle ou d’un AI Agent, elle évite de mélanger les dépendances de production et celles du test.
La page de facturation de ProxyMac doit être consultée avant toute réservation afin de vérifier les modalités applicables. Il est préférable de choisir une période courte, avec un scénario de relecture défini, plutôt que de louer sans critère d’acceptation.
Le choix entre environnement actuel et Mac de test
L’environnement actuel est souvent le plus rapide, mais il cumule plusieurs défauts : variables héritées, versions de SDK difficiles à figer, passerelle partagée et traces incomplètes. Un poste local peut aussi manquer d’isolement lorsqu’un Agent, un parseur de flux et un client HTTP sont mis à jour indépendamment.
Un Mac distant loué avec ProxyMac offre une séparation plus nette pour comparer un appel direct, une enveloppe OpenAI SDK et un parcours complet via passerelle. L’intérêt ne vient pas d’une puissance supposée supérieure. Il vient du fait que le test peut être reconstruit dans un espace distinct, avec ses propres versions, journaux et variables. Pour une investigation de quelques jours, cette maîtrise opérationnelle est souvent plus utile qu’une modification improvisée du modèle ou du code de production.