Hands-on notes
- DeepSeek Harness is an open-source agent chassis. The CLI is
dsh. It is not a DeepSeek model and not an API price list. - We pulled 0.1.5-rc.1 with
npx @deepseek-ai/dshon Node.js v24.14.1.dsh --helpcalls the product an ordered stack of plugin-bundle patches. dsh --profile web --dump-default-configprinted 152 plugin rows. Default model:deepseek-official/deepseek-flash. Web listen:127.0.0.1:3080. Default agent preset:standard.- Models register on
ctx.llm, tools onctx.tools, the loop onctx.agentLoop. Swapping a model does not swap the bash backend or the loop. - Developer preview: breaking changes are promised. Start at deepseek.com/harness and the GitHub repo.
Separate model / tool / loop before you decide whether dsh should be your daily coding agent.
What DeepSeek Harness is
DeepSeek Harness is DeepSeek’s open-source agent runtime. The README is blunt: Cordis makes everything a plugin — model adapters, the tool registry, session logs, sandboxes, and the agent loop itself can be swapped in configuration without forking the harness. The product page lists the same surface: models, tools, skills, sessions, sandbox, storage, loop, scheduler, UI.
The CLI name is dsh. That is a different query from “how much is DeepSeek V4-Flash.” One is inference. The other is the chassis that wires a model to tools and a session log. Token cost still follows the provider; see DeepSeek V4-Flash API pricing.
The project is a developer preview and warns about compatibility breaks. The repo went public on 2026-08-13. Docs assume you may write plugins. This article only answers what it is, how the pieces compose, and what we actually printed from the CLI.
What we ran: environment, commands, raw numbers
If the piece says hands-on, it needs environment, tasks, method, and raw output. This is what we ran locally — not a restated screenshot of the marketing site.
Environment: macOS (darwin 25.4.0), Node.js v24.14.1. Install path: npx --yes @deepseek-ai/dsh, no source checkout. DSH_HOME pointed at an isolated directory so we did not write the default ~/.dsh.
Tasks: (1) CLI help and version; (2) web help; (3) export the web profile’s default tree (no user layer, no --patch). We did not run a full coding task with an API key, so this article does not claim “we patched a repo.”
npx --yes @deepseek-ai/dsh --version # 0.1.5-rc.1 npx --yes @deepseek-ai/dsh --help npx --yes @deepseek-ai/dsh web --help export DSH_HOME="$PWD/.tmp_dsh_home" npx --yes @deepseek-ai/dsh --profile web --dump-default-config
dsh --help defines the product as an ordered stack of plugin-bundle patch layers under your overrides. Two command families matter: web (alias of --profile web) and plugin (forwards the rest to pnpm in that profile). Examples also show headless for one-shot tasks, --dump-config, and --from-default-profile.
dsh web --help matches the docs: --host, --port (0 lets the OS pick), --no-open, --trusted-host. In the composed tree, webserver defaults to 127.0.0.1 and 3080.
| Item | Value we saw | Evidence |
|---|---|---|
| npm version | 0.1.5-rc.1 | dsh --version |
| Default model | deepseek-official / deepseek-flash | agent-default-model in the dump |
| Web bind | 127.0.0.1:3080 | webserver in the dump |
| Default preset | standard | agent-presets |
| Default tree | 539 YAML lines / 152 ids | --dump-default-config |
| disabled flags | 26 rows (mostly tool-*) | same dump |
Those 26 disabled: true rows are mostly model-facing tools (tool-bash, tool-fs, tool-skill, tool-web). dsh-web-app turns them off until a workspace or preset turns them back on. A grey tool in the dump does not mean the Web UI has no bash. Marketing pages skip this.
How models, tools, and the loop compose
The architecture doc describes a running dsh as a plugin tree stacked at boot. Day to day you touch four objects:
- Profile: a named composition under
$DSH_HOME/profiles/<name>. Shipped templates:web,headless,sdk,sdk-minimal,acp. - Bundle: an npm package with
dsh.bundlethat contributes a patch. First init puts@deepseek-ai/dsh-baseat the bottom. - Plugin module: TypeScript that exports
apply(ctx). Adapters callctx.llm.registerAdapter(); tools usectx.tools; the loop isctx.agentLoop. - Layer order: each bundle patch → the profile’s
cordis.patch.yml→ home-level patch →--patchoverlays.
| Layer | What you touch | What you swap | Do not confuse |
|---|---|---|---|
| Model | Settings → Models, or $DSH_HOME/settings.yaml | Official card, catalog provider, custom gateway | A new model does not replace bash |
| Tools | Preset / DSH_TOOLS_MODE / tool plugins | Full standard set, minimal pair, your own | Tool schemas join the prompt; the model catalog is a different book |
| Loop | Default dsh-agent-loop, replaceable | Another loop plugin | Most products hard-code the loop; dsh does not |
| Entry | dsh web / headless / sdk / acp | Same CLI, different profile | Do not invent a second binary |
Official install for a third-party plugin is dsh plugin --profile web add <package or git>. When we ran dsh plugin --profile web --help, we got pnpm’s help text — “forwards to pnpm” is literal. Local experiments: dsh web --patch ./cordis.yml (first plugin tutorial). Tag public repos with dsh-plugin.
The official DeepSeek card stores one write-only key in $DSH_HOME/.credentials.yaml. A custom gateway needs a lowercase Provider ID, base URL, and a protocol (openai-completions, openai-responses, or anthropic-messages). The Provider ID is permanent. A working key can still 400: reasoning models may send the system prompt as role developer and the cap as max_completion_tokens. Official fix: compat.supportsDeveloperRole: false and maxTokensField: max_tokens in settings.yaml. Details: Configure models.
The Web UI blocks the composer until you pick a workspace. The suggested first prompt is “summarize this repository.” See Use the Web UI. Skills are procedural memory, not the same object as a dsh plugin; see Hermes Agent Skills list.
Which of the four modes to pick
The product page lists four modes. Our dump’s default preset is standard. The other three below are official descriptions — we do not call them “tested” beyond that label.
| Mode | What shipping docs give you | Use it when | Do not expect |
|---|---|---|---|
| Standard | Edit, shell, search, skills, plan, goals, subagents, workflows | Daily coding agent | It will not pick your model price |
| PTC | Standard plus Code Mode SDK — the model writes TypeScript to chain tools | Long tool chains, fewer round-trips | Wrong gateway shape still fails |
| Minimal | Persistent bash + str_replace_editor | Smallest tool bench for a model | No full search/workflow set |
| Create | Standard plus runtime inspection, in-memory plugin trials, new presets | You are authoring a composition | Preview APIs will move |
Permissions are a separate triad in the dump’s permission plugin: read-only, workspace-write (default, override with DSH_PERMISSION_MODE), and danger-full-access. Standard mode is not “write the whole disk.”
dsh vs Claude Code / Hermes
Treat dsh as a chassis you can unscrew and the choice gets simpler.
- You want replaceable models, tools, and loop, and you will write plugins: DeepSeek Harness. Pin the version in preview.
- You want a productized coding agent with a subscription bill: start from Claude Code 2026 pricing. dsh will not clone that checkout flow.
- You want Skills / Gateway procedural memory: Hermes is closer. dsh ships
dsh-skill, but the filesystem skill is disabled in the default dump until composition turns it on. - You already run MCP: the protocol stays its own layer — MCP developer guide. Docs treat dsh as an MCP client, not a replacement.
Third-party writeups mention optional bundles that delegate to Claude Code or Codex. Our default web dump does not list subagent-claude-code, so we do not call that out-of-the-box. For how stacks layer, see 2026 AI agent stack.
FAQ
Is DeepSeek Harness the same thing as a DeepSeek model?
No. The harness is a runtime; the model is inference. The default route is official DeepSeek, but you can add OpenAI, Anthropic, or a custom gateway. You pay whoever you selected.
How do I install dsh, and what port does the Web UI use?
Official: npx @deepseek-ai/dsh web. We saw 0.1.5-rc.1 and 127.0.0.1:3080. Add --no-open over SSH. From source: pnpm install && pnpm run build && pnpm dsh web.
How do models and tools actually combine?
A profile stacks bundles; bundles insert plugins via patches. Models land on ctx.llm, tools on ctx.tools, the loop on ctx.agentLoop. Print your tree with dsh --profile web --dump-config.
Which of the four modes should I use?
Daily coding: standard (default). Bench the model: minimal. Long tool chains: PTC. Author presets: create. Names can move in preview.
Can I run developer preview in production?
Officially, expect breaks. Experiment in an isolated DSH_HOME and pin the npm version. Do not hang unpinned npx on the Mac that holds production certs.
Summary
DeepSeek Harness answers how you unscrew an agent chassis, not where DeepSeek ranks on a model board. Hard facts from 0.1.5-rc.1: 152 plugins in the default web tree, Flash as the default model, port 3080, preset=standard. Composition is profile → bundle → adapter / tool registry / loop — not one frozen binary.
Run dsh on a Mac that does not close its lid
dsh web wants a long-lived Node process, a workspace disk, and API keys. Close a laptop and sessions, subagents, and Trajectory replay die together. A cloud Mac mini is a cleaner Harness host: dsh web --no-open over SSH, DSH_HOME and the workspace on the same box, production certs stay elsewhere. Keep workspace-write until a day-rent check passes, then lock a month.
Compare options · View plans · Onboarding checklist · Get started