Fix DeepSeek Harness model list incomplete & adopt missing fields
DeepSeek Harness fetching an incomplete model list from OpenRouter and missing the latest models — one fact first: the models list is only an advisory discovery catalog, so "incomplete" is not "unusable"; model ids outside the catalog work fine when hand-written. The real trap is adoption: Settings' adopt() copies only id / name / contextWindow / maxTokens, dropping input (vision models rejected with MODEL_DOES_NOT_SUPPORT_IMAGES) and reasoningEfforts. Hand-write the config and patch adopted entries to fix it; the incomplete fetch itself is a product gap / suspected pagination bug and needs a numbers-backed report of its own.
What the incomplete model list looks like
The symptom: the "available models" fetch is incomplete, the latest models are missing, and there is no search, quick refresh, or auto-update. A reporter hit it in practice (discussion thread) with six items:
- The fetch does not return all models;
- The latest models (such as GLM 5.3 Flash) stay missing even after adding available models in settings;
- The fetched models cannot be searched;
- There is no quick "refresh models" to add missing ones automatically;
- There is no per-author model list to keep up to date;
- There is probably no auto-update (ideally every 6 hours with exponential backoff on failures).
The first two are fetch/parse problems, the last four are product gaps — but what actually makes a model unusable is usually the adopted entries losing fields, not the incomplete fetch.
Root cause 1: the models list is an advisory discovery catalog
Fetching a list (discovery) and "can I use a model" are two different things: the models list is an advisory discovery catalog, and model resolution accepts model ids outside the catalog — a model missing from the list works fine when hand-written into the config (source). Example:
llm-pi-ai:
providers:
openrouter:
api: openai-completions
baseURL: https://openrouter.ai/api/v1
apiKeyEnv: OPENROUTER_API_KEY
models:
- id: <the openrouter model id you want>
contextWindow: 131072
input: [text, image] # vision models only
reasoningEfforts: # reasoning models only
off:
low: low
high: high
OpenRouter has hundreds of models; hardcoding the few you actually use is more reliable and more stable than repeatedly fetching a big list. One pitfall: a single invalid key in this profile section rejects the whole section (not just that key) — add one field at a time and start up after each.
Root cause 2: adoption drops fields
This is the sneakier trap than "incomplete fetch": Settings' adopt() copies only id / name / contextWindow / maxTokens and does not write input (#3226, independently verified by multiple people, patch branch exists) — an adopted vision model is treated as text-only and image sends are rejected (MODEL_DOES_NOT_SUPPORT_IMAGES). The same line also drops reasoningEfforts (#3566) — the endpoint declares reasoning tiers and they are all gone after adoption.
These failures are lagging: not an error at adoption time, but a failure later when the capability is actually used — by then you have usually forgotten that adoption was the step that dropped it. This matters especially for OpenRouter users: its catalog mixes vision and reasoning models, exactly the combination easiest to trip.
One related note: #1992 points out that hand-written route modality inheritance is looked up by provider route key — if your route name is not openrouter (say a custom name), even when the catalog knows the model id supports images, it silently falls back to ['text']. The route name affects capability inheritance.
Troubleshooting: hand-write + patch adopted entries
Work through "hand-write works → check adopted entries → check the route name" and do not wait for the fetch feature to be fixed. Step by step:
- Hand-write the model: add the models you actually use under
llm-pi-ai.providers.<name>.models(see the example above), one field at a time, starting up after each; - Check the route name: keep the route key
openrouteror use the official name, to avoid a custom name silently falling back to['text'](#1992); - Inspect adopted entries: if an adopted vision model is rejected on image sends (
MODEL_DOES_NOT_SUPPORT_IMAGES), manually addinput: [text, image]; for reasoning models addreasoningEfforts(#3226 / #3566); - Confirm the discovery owner: the model discovery seam is registered by settings namespace, and the only registration in the repo is
dsh-llm-pi-ai(#740) — make sure your OpenRouter route sits underllm-pi-ai; otherwise there may be no discovery implementation at all.
The incomplete fetch itself: report separately, lead with numbers
Of the six items, item 1 "incomplete fetch" is the one worth investigating separately — the only one with a possibly clear bug. The community's advice (source):
- Open a separate post for "incomplete fetch" with numbers (how many fetched vs how many actually exist), and first confirm whether OpenRouter's
/modelsis paginated — if it is, "discovery only read the first page" is a concrete defect; if not, parsing filtered some out; - Items 3 and 4 (search, quick refresh) depend on adopt being fixed first — otherwise they mass-produce broken entries; raise them but deprioritize;
- Items 5 and 6 (per-author list, auto-update) are product design and raise questions like "who bears the requests" and "how failures surface" — suggest filing them separately.
Notes
- "Incomplete" is not "unusable" — hand-write the common models first and do not stall on the fetch feature.
- If an adopted vision/reasoning model is rejected on images or misses tiers, check the adopt field loss (#3226/#3566) first, then the route name (#1992).
- Change hand-written config one start-up at a time — an invalid key rejects the whole section, so do not batch edits.
- Model discovery runs through the
llm-pi-aiimplementation; confirm route ownership before deciding who to report the bug to.
Sources: Discussion #4685, #3226 (adopt drops input), #3566 (adopt drops reasoningEfforts), #1992 (route key and modality inheritance), #740 (discovery ownership)
FAQ
The models list is an advisory discovery catalog; an incomplete fetch has two possible causes: OpenRouter's /models is paginated and discovery only read the first page (a concrete defect), or parsing filtered some out (source). Report it separately with numbers, but remember incomplete is not unusable.
Yes. Model resolution accepts model ids outside the catalog — a model missing from the fetched list works fine when hand-written into the config: add id/contextWindow/input/reasoningEfforts under llm-pi-ai's providers.<name>.models.
Settings' adopt() copies only id/name/contextWindow/maxTokens and does not write input (#3226) — an adopted vision model is treated as text-only and image sends are rejected; the same line also drops reasoningEfforts (#3566).
Two things: one invalid key makes the whole profile section rejected (not just that key ignored), so add one field at a time and start up after each; hand-written route modality inheritance is looked up by provider route key, so a non-openrouter route name silently falls back to ['text'] even when the catalog knows the model supports images (#1992).
Open a separate bug post with numbers (how many fetched vs how many actually exist), and first confirm whether OpenRouter's /models is paginated — if so, "discovery only read the first page" is a concrete defect; until fixed, transition with hand-written common models plus patched adopted entries.
Sources
- deepseek-harness Discussion #4685: fetching models from OpenRouter doesn't work (incomplete list, missing latest models, no search/refresh)· deepseek-ai (GitHub Discussions)
- deepseek-harness Discussion #3226: Settings adopt() copies only id/name/contextWindow/maxTokens, drops the input field· deepseek-ai (GitHub Discussions)
- deepseek-harness Discussion #3566: the same line also drops reasoningEfforts· deepseek-ai (GitHub Discussions)
- deepseek-harness Discussion #1992: hand-written route modality inheritance is looked up by provider route key· deepseek-ai (GitHub Discussions)