2026-08-09 OpenRouter Interceptor DeepSeek Flash Alias and a Stale Build

What I set out to do

Point the analyze module’s flash model at DeepSeek’s new Flash release, and update the SillyTavern connection profiles where it made sense. A maintenance pass on the curated list from 2026-07-06 OpenRouter Interceptor Curated Model List.

What I actually did

The new model is deepseek/deepseek-v4-flash-0731 (0.18, 1M ctx). Rather than pin the dated slug I used OpenRouter’s floating alias ~deepseek/deepseek-v4-flash-latest, which always redirects to the newest model in the V4 Flash family, so the next revision needs no edit. Verified the alias resolves both directly against OpenRouter (it reports back deepseek-v4-flash-0731) and through the local LiteLLM proxy, since the leading ~ was a real risk against the openrouter/* wildcard route.

Checking prices turned up something I had not expected: the old pinned deepseek/deepseek-v4-flash had been silently repriced upward to 0.28 and relabelled “0423” by OpenRouter. The $0.09/$0.18 comment sitting next to it in CURATED_MODEL_IDS had quietly gone false. Committed as 867a1c7.

For SillyTavern, moved Budget (was deepseek-v3.2) and Fast (was gemini-3-flash-preview) onto the alias. Applied through ST’s HTTP API rather than editing settings.json, because the running client autosaves its in-memory settings over any file write. Diffed the whole settings tree against a backup afterwards to confirm only the intended fields moved. While pricing the other profiles I found Main RP pointing at x-ai/grok-4.1-fast, which OpenRouter has deprecated and now 404s (“xAI recommends switching to Grok 4.3”). That profile had simply been broken. Repointed it to z-ai/glm-5.2 (0.22, 1M ctx).

Then a detour. The dropdown still showed plain “flash” with no prices. I ran the real toModelOptions against the live catalogue and it was perfectly correct, rendering “DeepSeek V4 Flash Latest (0.25 per 1M tokens)” with all ten curated ids matching. The extension was simply never rebuilt. Worse, dist/openrouter-models.js was a dead orphan from Jul 25 still holding the old id: vite had renamed that chunk into dist/theme.js, and dist/ is never emptied because it is symlinked into the Firefox PWA profile. Grepping dist/ found only the corpse and made a successful build look like a failed one.

The missing prices have a separate and tidier explanation. The custom-analysis modal’s empty-state branch renders the raw stored model id verbatim when the option list has not loaded, so you get a bare deepseek/deepseek-v4-flash with no label and no cost. That single mechanism accounts for both symptoms at once.

What was striking

A pinned model id is not the stable thing it looks like. This one drifted underneath the code in two directions at once, price and name, with no signal at either end, and the only reason I caught it was that I happened to be pricing its replacement. Moving to the alias hands that maintenance back to OpenRouter, which is the party that actually knows when it changes.

The build artifact lesson was the more embarrassing one. I read a stale file, concluded the build had not run, and reran it before noticing the mtime never moved. Worth remembering that a familiar filename in a build directory proves nothing about whether anything still references it.

Left two latent issues unfixed and written down: refreshModelCache returns the unpriced fallback list on any failure and options.ts renders that result unconditionally, so one transient fetch failure replaces a good priced list with five generic models; and options.html still ships a hardcoded placeholder <select> that JS is expected to overwrite.