FlorianIO

JOURNAL

The Case of the Missing Thinking Toggle: ZCode, DeepSeek, and a Rename That Broke the Mapper

2026.09.133 MIN READ

I pointed ZCode at DeepSeek's official API. The model works, tool calls work, the price is great — but there is no thinking toggle. Every GLM model in the picker has one; deepseek-flash has nothing.

Root Cause

ZCode keeps its model registry at ~/.zcode/v2/config.json (C:\Users\<you>\.zcode\v2\config.json on Windows). Every model the app recognizes carries a reasoning block that ZCode itself writes:

JSON"reasoning": {
  "enabled": true,
  "variants": ["low", "max", "high"],
  "defaultVariant": "max"
}

My DeepSeek entry had limit and modalities but no reasoning block. The UI just reads this file: no block, no toggle.

Those blocks come from a model catalog bundled inside the app. I grepped the desktop bundle (app.asar) for DeepSeek's entries and found three things:

  • The old versioned names are all there, with full reasoning options:

    CODE"deepseek/deepseek-v4-flash": { ..., family: "deepseek-flash", reasoning: true,
      reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }] }
    
  • V4.1 Flash only appears under aggregator-style IDs like deepseek/deepseek-v4.1-flash.

  • The bare ID deepseek-flash — the one name DeepSeek's API has answered to since September 10 — is not in the catalog at all.

My read: ZCode matches custom model IDs against this catalog to decide which capabilities to write into the config. V4.1's launch retired the versioned names and collapsed the API to one unversioned name, so the lookup misses and no reasoning block is written. I haven't traced the matching code line by line, but every observation fits: recognized models get app-managed capability blocks, and my entry only got one for the modalities I configured by hand.

The plumbing itself is fine — the effort variants translate directly into the Anthropic thinking budget on the wire (max maps to a maximum budget, right there in the binary). The toggle was never missing. The name just stopped matching.

The Fix

  1. Open ~/.zcode/v2/config.json and find the provider entry with "name": "deepseek" ("kind": "anthropic", keyed by a UUID). ZCode can stay running — it occasionally rewrites this file but preserves manual edits (verified twice).
  2. Add a reasoning block to the model entry under models:
JSON"deepseek-flash": {
  "reasoning": {
    "enabled": true,
    "variants": ["low", "high", "max"],
    "defaultVariant": "high"
  },
  "limit": { "context": 1000000, "output": 128000 },
  "modalities": { "input": ["text", "image"], "output": ["text"] }
}
  1. Restart ZCode and open a new session. The toggle appears in the model picker.

Two notes:

  • The three variants are the effort levels deepseek-flash actually supports; ZCode maps them onto the Anthropic thinking budget. high is the cost-sane default — thinking tokens are billed at output price, $1.20 per million on this model. I flipped mine to max anyway.
  • Add "image" to modalities.input if you want native vision, and you can bump output to 384000 for the official limit.

Copy, Paste, Delegate

Or hand the whole thing to your AI:

TEXTMy ZCode (Z.ai's coding agent) is connected to DeepSeek's official API, but the
model has no thinking-mode toggle. Please fix my ZCode config for me.

Context:
- ZCode stores its model config at ~/.zcode/v2/config.json
  (Windows: C:\Users\<YOUR-NAME>\.zcode\v2\config.json).
- My DeepSeek provider is the entry under "provider" whose "name" is "deepseek"
  ("kind": "anthropic", "baseURL": "https://api.deepseek.com/anthropic",
  keyed by a UUID).
- ZCode only shows a thinking toggle when the model entry carries a "reasoning"
  block. Mine is missing one, because ZCode's bundled model catalog still keys
  DeepSeek by the old versioned names (deepseek-v4-flash etc.) and doesn't
  recognize the new official API name "deepseek-flash".

What to do:
1. ZCode can stay running while you edit — it occasionally rewrites this config
   file but preserves manual edits. No need to quit.
2. In the deepseek provider entry, find my model under "models" (its key is the
   model ID, e.g. "deepseek-flash"). Add this block as a sibling of "limit" and
   "modalities":

   "reasoning": {
     "enabled": true,
     "variants": ["low", "high", "max"],
     "defaultVariant": "high"
   }

3. Keep every existing field ("limit", "modalities", "zcode", ...) untouched,
   and keep the JSON valid — parse it before and after your edit to prove it.
4. Ask me whether "defaultVariant" should be "high" (cost-sane default) or "max"
   (full effort by default; thinking tokens are billed at DeepSeek's output
   price, $1.20 per million tokens on this model).
5. While you're in there: if "modalities.input" doesn't include "image" and I
   want V4.1 Flash's native vision, add it.
6. When done, remind me to restart ZCode and open a NEW session — the thinking
   toggle should appear in the model picker.

That's It

One unversioned rename on DeepSeek's side, one silent lookup miss on ZCode's side — nothing errors, a capability just quietly doesn't exist. ZCode will refresh its catalog eventually and make this post obsolete, which is fine. Until then: ten lines of JSON, or one pasted prompt, and the toggle is back. (´・ᴗ・`)

RELATED