Skip to content

feat: deepseek-flash everywhere, and web_search is gone - #27

Merged
lroolle merged 1 commit into
mainfrom
feat/v41-flash-everywhere
Sep 18, 2026
Merged

lroolle merged 1 commit into
mainfrom
feat/v41-flash-everywhere

Conversation

@lroolle

@lroolle lroolle commented Sep 18, 2026

Copy link
Copy Markdown
Member

Follows #26. That PR moved the CLI's default to deepseek-flash. This one moves everything else: the docs, the site, and the free tier. It also acts on the two things #26 found and left open.

Web search: removed upstream, so we refuse it

DeepSeek removed web_search from the Responses API with V4.1 Flash on 2026-09-10. Its Responses API guide now lists web_search among the built-in tools that are ignored, and the response.web_search_call.* events are gone. A probe on 2026-09-18 matched: the tool was accepted, but no search ran, and the request billed 21 input tokens where a search used to bill about 40K.

  • CLI: respond --web-search is hidden and exits 1 with that reason. It sends nothing.
  • Gateway: refuses the tool with a 400 that gives the reason. DailySearches, searchInputAllowance and the search admission path are deleted. They priced searches that could no longer happen.
  • Copy: every page that offered search now says it was removed, with the date. TASTE.md records why the 2026-08-07 decision expired.

Models

  • Everywhere: deepseek-flash is the default and the recommended pick. Pro stays callable and correctly priced. Nothing ranks it above flash any more. The claim that flash is ahead cites DeepSeek's changelog and release note. The bench page compares only benchmarks that carry the same name on both DeepSeek charts, and it shows HLE-no-tools, where flash is behind.
  • Gateway:
    • DSGATE_MODEL defaults to deepseek-flash.
    • resolve() follows the Anthropic API guide exactly: claude-opus* goes to pro, and every other name goes to flash.
    • The retired flash names are the same model on both sides of the check.
    • A DSGATE_MODEL from before the rename is served under the canonical name.
    • This also fixes a live bug: freeseek's /models returns "data": [] today. It is configured as deepseek-v4-flash, and upstream lists only deepseek-flash.
  • History stays history: the August flat card, the V4 cost-per-task figures on /economics and the V4 launch table are kept and labelled. They are not relabelled as V4.1.

Pricing instant

V41At moves from the inferred 11:00 UTC to 04:00 UTC on 2026-09-10, the instant DeepSeek's release note gives. The change is in the CLI and gateway gates, the tests (04:00 is also the end of a peak window) and the copy.

Tripwires

Each tripwire below was broken on purpose, went red, and was restored to green.

  • internal/cli/claims_test.go: every "(default)" model in README, AGENTS, SKILL and llms.txt must equal deepseek.ModelFlash, and no doc may offer respond --web-search.
  • gateway/internal/server/claims_test.go: the DSGATE_MODEL default must be a current name, the index, terms and economics pages must name it, and no page may promise web search.
  • site/build.py check_model_claims: a section fails if it names a retired flash name without deepseek-flash, or has live web-search copy, unless it is marked <!-- claim:historical -->.

Verified

  • make check is green: it builds, runs the tests, price-check, the gateway with -race, and site-check.
  • go test -race ./... passes.
  • make cover-gate reports 72.9%.
  • Headless Chromium at 390px and 1280px: no page scrolls sideways.

Found, not done

OpenCode Zen still lists deepseek-v4-flash-free, but answers every request with Model is unavailable. Every free-tier chat therefore pays one refused round trip, and its prompt still reaches Zen. The gateway README and DESIGN now say to unset OPENCODE_API_KEY until Zen serves a free V4.1 model. Changing that on the box is an operator decision.

🤖 Generated with Claude Code

DeepSeek-V4.1-Flash (`deepseek-flash`) is now the default and the
recommended pick on every surface: the CLI docs, the site, and the free
tier. `deepseek-v4-pro` stays callable and correctly priced, but nothing
presents it as the default or the stronger pick any more. Where the copy
says Flash is ahead, it cites DeepSeek's own 2026-09-10 changelog and
release note.

Gateway (freeseek):
- DSGATE_MODEL defaults to deepseek-flash. resolve() now matches the
  Anthropic API guide: claude-opus* goes to pro; claude-sonnet*,
  claude-haiku* and unknown names go to deepseek-flash. The two retired
  flash names are the same model. checkModel resolves both sides, so a
  pre-rename DSGATE_MODEL does not start refusing the CLI's default.
- server.New serves the model under its canonical name. With
  DSGATE_MODEL=deepseek-v4-flash, /models had been filtering upstream's
  new-only list down to nothing. That is live on freeseek today.
- web_search is refused with the reason. DeepSeek removed it from the
  Responses API on 2026-09-10; the guide now lists it as ignored, and a
  2026-09-18 probe billed 21 input tokens where a search used to bill
  ~40K. DailySearches, searchInputAllowance and the Search admission
  field are deleted.
- Pages (index, terms, economics) name deepseek-flash. Economics now
  quotes today's card and keeps the August flat card and the V4
  cost-per-task figures as dated history.
- DESIGN/README record that OpenCode Zen's free lane answers
  "Model is unavailable" as of 2026-09-18.

CLI: `respond --web-search` is hidden and exits 1 with the reason. It
sends nothing. The free-tier search ration display is gone.

Pricing: V41At moves from the inferred 11:00 UTC to 04:00 UTC on
2026-09-10, the instant DeepSeek's release note publishes. This covers
the CLI and the gateway, plus the tests at the new peak/card boundary.

Tripwires, each mutation-checked:
- internal/cli/claims_test.go: the docs' "(default)" model must be
  deepseek.ModelFlash, and no doc may offer `respond --web-search`.
- gateway/internal/server/claims_test.go: the DSGATE_MODEL default must
  be a current name, the pages must name it, and no page may promise
  web search.
- site/build.py check_model_claims: a retired flash name without its
  successor, or live web-search copy, fails the build unless the
  section is marked historical.

Also: the playground's search toggle is removed. A pre-existing flex
bug that split the playground's "when it runs out" row is fixed. A
news entry for 2026-09-18 is added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant