DeepSeek Harness
DeepSeek Harness
(dsh) is DeepSeek's own coding agent — a plugin-composed
harness with filesystem, bash, web and sub-agent tools, available as a
web UI, a TUI, and a one-shot headless mode. Pointed at rapid-mlx it runs
entirely on your Mac: your code never leaves the machine, and there is no
DeepSeek account, API key, or token bill involved.
openai-completions provider →
/v1/chat/completions ·
Setup: rapid-mlx agents dsh --setup ·
Matrix cell:
✅ ✅ XFAIL (arch) ✅
(the DeepSeek column XFAILs on the R1-Distill checkpoint, which cannot
emit OpenAI-shape tool_calls — DeepSeek's own client gets
no exemption from its own checkpoint's gap).
Promoted to Tier-1 2026-08-17 — real end-to-end multi-step bug fix (ran the failing test, diagnosed an off-by-one, edited the file, re-ran to confirm) on
dsh against qwen3.6-35b-8bit,
64 s cold / 17 s warm on an M3 Ultra.
Install
DSH needs Node's Zstd stream API. Node 22.15 or newer works; the npm manifest does not declare that minimum, so an older Node installs cleanly and then fails at plugin boot with an opaque ESM stack.
$ node --version # must be >= 22.15 $ npm install -g @deepseek-ai/dsh
Config
Start a server, then let rapid-mlx write the provider block. It previews an exact diff first, so you can see the change before it happens:
$ rapid-mlx serve qwen3.6-35b-8bit # in another terminal $ rapid-mlx agents dsh --setup --dry-run # preview $ rapid-mlx agents dsh --setup # apply
--setup discovers which model is running and what context
window it advertises, then patches
$DSH_HOME/settings.yaml (default
~/.dsh/settings.yaml). It preserves unrelated providers and
settings, takes a timestamped backup, writes atomically, and refuses to
apply if the file changed after the preview.
Harness's generic OpenAI transport insists on resolving a credential even
for an unauthenticated loopback server, so rapid-mlx also adds the
non-secret sentinel RAPID_MLX_API_KEY: not-needed to
Harness's owner-only .credentials.yaml when that key is
absent. An existing value is preserved, and credential values are
redacted from the preview — if you keep real remote-provider keys in that
file, they are never echoed to your terminal.
Run
$ dsh web # browser UI $ dsh --profile tui # terminal UI $ dsh --profile headless "summarize this workspace" # one-shot
Why the generic provider, not deepseek-official
Harness ships a native deepseek-official adapter, and
rapid-mlx deliberately does not use it. Pointing it at a loopback server
would mean inventing an API key and asserting that your Mac carries the
DeepSeek cloud service's model identities, capacity, and rate contract.
The generic openai-completions route says exactly what is
true: a local OpenAI-compatible endpoint serving whatever model you
booted. Reasoning-effort levels are still wired through, so the
off/low/medium/high control in the UI reaches
reasoning_effort on the wire.
What Tier-1 means here
Tier-1 is a release gate, not a badge. Every version bump runs
dsh — the real binary, not a mock — through a real
multi-step bug-fix task against a booted 35B model, and grades it by
re-running the repository's own test suite. If dsh
regresses, the release cannot tag or publish.
The grading deliberately ignores dsh's exit status, because
it is not a pass signal: measured on rc.7, a Harness pointed at an
unregistered provider prints NO_ADAPTER and still exits 0.
Only the work actually landing on disk counts.
You can run the same integration suite yourself:
$ rapid-mlx agents dsh --test
It uses an isolated DSH_HOME and workspace, so it never
loads or writes your real Harness sessions or credentials.
Gotchas
-
Developer preview. DeepSeek labels Harness a developer preview
and may make compatibility-breaking configuration changes. rapid-mlx
tracks the contract exercised by
0.1.0-rc.7; the rc.6 → rc.7 upgrade did not change the provider schema. -
Node minimum is undeclared. The package imports Node's Zstd
stream API without declaring an engine range, so npm happily installs
it on a Node that cannot run it.
rapid-mlx agents dsh --testprobes for this and reports the runtime mismatch before DSH emits its plugin-loader stack trace. -
dshexits 0 on hard failure. Do not use its exit status in a script as a success check — assert on the work it was supposed to do. -
Reasoning-only checkpoints cannot drive it. DSH needs real
tool_calls, so DeepSeek R1-Distill answers inline instead of calling tools. Use a tool-trained model — Qwen 3.6, Qwen 3.8, Gemma 4 and gpt-oss all work.