sanshanya
better-model-provider
Per-model capability declaration for DeepSeek Harness: reasoning-effort levels (wire spellings) + request modalities (vision) for OpenAI-compatible providers. Settings section, zero runtime harness deps, no YAML.
- Stars
- 1
- Language
- TypeScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
better-model-provider
Better custom-provider model onboarding for DeepSeek Harness (dsh), with per-model declaration of native vision input and reasoning-effort levels.
English | 中文

Why you may need it
The official Models page manages providers and model rows, but two per-model capability fields stayed YAML-only: reasoningEfforts (which reasoning levels the model accepts, plus each level's wire spelling) and input (which request modalities the model admits). Until they are declared:
- the composer's model picker shows no reasoning-effort control for your model;
- image sessions refuse to switch to it (
Model ... does not accept image input), because a hand-declared model defaults to text-only.
Install
# From GitHub:
dsh plugin --profile web add github:sanshanya/better-model-provider
# Local checkout:
dsh plugin --profile web add link:<absolute path to this repo>
Restart dsh web, hard-refresh the browser, and the settings sidebar gains Model capabilities. Uninstall:
dsh plugin --profile web rm better-model-provider
Use
- Configure the provider on the official Models page first (that's where the API key lives; this page never touches credentials).
- Open Settings → Model capabilities.
- Expand a model row: pick Custom under reasoning effort and check the levels; for vision models check
imageunder input modalities. - Apply. The picker immediately offers exactly the declared levels, and the host's image admission admits the model.
Small note: declaring { high } alone gives the picker only High; also check off (blank wire → null) if Off should be available.
Development
npm install
npm run build # lib/index.js + lib/client.js (module-loader bundle)
npm test # unit + interaction flows + bundle smoke
npm test:coverage # v8, 100% per-file gates
npm run lint; npm run typecheck
# real-Harness gate (needs a local harness checkout):
BMP_DSH_DIR=/path/to/deepseek-harness npm test:live
Compatibility
Tested against DeepSeek Harness 0.1.0-rc.5 family (verified at commit 47f9438, 2026-08-13). Minimum-known-good Harness: 0.1.0-rc.5 — the plugin's wire contract (settings.describe/mutate, llm.providers/models, the { rpcId, result } envelope, and the model row schema) is the one that release line serves. Internal-only surfaces (settings.section registration shape) are treated as experimental compatibility: a newer harness that doesn't serve them degrades silently instead of breaking the page.
License
MIT