DeepSeek Harness on a Local Model: Does It Work?
Want to go deeper than this article?
Free account unlocks the first chapter of all 25 courses — RAG, agents, MCP, voice AI, MLOps, real GitHub repos.
Go from reading about AI to building with AI 20 structured courses. Hands-on projects. Runs on your machine. Start free.
Short answer: yes, and there are two routes. Ollama 0.32.11 (14 August 2026) added ollama launch dsh, and dsh separately supports any OpenAI-compatible endpoint through its "Add a custom provider" form — which is exactly what Ollama serves on http://127.0.0.1:11434/v1. The harness itself needs no GPU; it is a Node app. All the hardware cost is the driver model, and 24GB VRAM running qwen3.8:27b (an 18GB download at Q4_K_M) is the comfortable target.
The catch is worth stating up front: the DeepSeek Harness README does not document local endpoints. It tells you to get a DeepSeek API key. The local path exists in the provider guide and in Ollama's release notes, not in the front door. That gap is the reason this page exists.
What We Verified, and How
This is a repository that was five days old when we checked it on 18 August 2026, so it is worth being explicit about where every claim below comes from rather than sounding more certain than we are.
Verified directly from the source:
- Repository
deepseek-ai/deepseek-harnesswas created 13 August 2026, is MIT licensed, and its default branch ismaster. It was climbing through ~156,000 stars when we checked on 18 August 2026 — a number that was visibly moving while we read it, so treat it as an order of magnitude, not a measurement. - The latest release is
dsh-v0.1.0-rc.7, published 17 August 2026. Every config shape on this page is read from that tree. package.jsondeclares"version": "0.1.0-rc.7"andengines.nodeof^22.19.0 || >=24.0.0.- The README's own words: "DeepSeek Harness is currently in developer preview and is iterating rapidly. THERE WILL BE COMPATIBILITY-BREAKING CHANGES."
- Ollama's v0.32.11 release notes, published 14 August 2026, state: "
ollama launch dshnow supports DeepSeek Harness, DeepSeek's open-source agent harness." - The custom-provider schema, field names and error codes below come from the repository's own
docs/user/guide/providers.mdand thedsh-llm-pi-aipackage README.
What we have not done: we have not yet completed a long unattended agent run against a local model and measured tool-call failure rates over time. When a project is this young and this explicitly unstable, quoting a reliability figure we cannot reproduce next week would be worse than saying nothing. The VRAM tiers below are derived from published model sizes and from what we already know about tool-calling behaviour at each size — see best Ollama models for tool calling for that groundwork.
Recheck date: this page is written against rc.7. Given the project's own breaking-change warning, verify the provider guide before following the config verbatim.
Reading articles is good. Building is better.
Free account = 20+ free chapters across 25 courses, with a per-chapter AI tutor. No card. Cancel anytime if you ever upgrade.
What dsh Actually Is
DeepSeek Harness is DeepSeek's own open-source agent harness, built on an architecture where — its words — "everything is a plugin." It runs a Web UI locally at http://127.0.0.1:3080 and drives an agent that can read and edit workspace files, run commands, delegate work to subagents, and maintain a plan.
The plugin claim is not marketing. The repository's packages/ directory contains roughly fifty first-party plugin packages: shell, fs, mcp, sandbox, subagent, lsp, terminal, schedule, workflow, credentials, guard, e2b, skill, todo and more. The LLM layer is itself a plugin — dsh-llm-pi-ai — which is precisely why a local model is configuration rather than a code change.
It is powered by Cordis, a framework whose design is described in a paper the README links, "A Programming Paradigm for Spatiotemporal Composability." You do not need to read it to use dsh, but it explains why the config surface looks the way it does: routes, seams and profiles rather than a flat list of settings.
On the growth numbers: roughly 156,000 stars five days after creation is extraordinary, and an ecosystem has already formed around it — anywhere-labs/deepseek-harness-desktop was created the same day and was near 12,800 stars on 18 August 2026. Both figures were still climbing daily; check them yourself rather than trusting a number on a page. And take them as a signal of attention, not of maturity. A five-day-old repository has had five days of bug reports.
Install and Requirements
One command, no GPU, no build step. The only real gate is your Node version.
npx @deepseek-ai/dsh web
That starts the Web UI at http://127.0.0.1:3080 by default. From a checkout instead:
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web
Node requirement, read from package.json: ^22.19.0 || >=24.0.0. Node 20 will not run it. Check with node -v first — this is the single most common install failure for any 2026-vintage TypeScript agent tool.
One behaviour that trips people: the dsh process uses its invoking directory as the default filesystem location, but a fresh Web UI has no selected workspace until you add one. The session composer stays unavailable until you click Choose workspace and select a directory. If the UI looks broken on first run, that is usually why.
Route A: ollama launch dsh
The shortest path. One command, added in Ollama 0.32.11 on 14 August 2026.
ollama launch dsh
Ollama's launch mechanism starts a supported app already pointed at your local model. The same release added ollama launch muse for Meta's Muse Code CLI. Four days earlier, 0.32.8 (10 August 2026) had added ollama launch openclaw and ollama launch hermes, and there the pattern took a --model flag, as in ollama launch openclaw --model muse-glimmer. The 0.32.11 notes show dsh without one. If you want a specific driver model rather than whatever is current, try the same flag here and fall back to Route B if it is not wired up for dsh yet.
This route is the right one if you just want to see the thing work. It is the wrong one if you need to control context window, timeouts or which subset of models the harness offers — for that, configure it properly.
Reading articles is good. Building is better.
Free account = 20+ free chapters across 25 courses, with a per-chapter AI tutor. No card. Cancel anytime if you ever upgrade.
Route B: Custom Provider (the one you will actually keep)
dsh treats any OpenAI-compatible endpoint as configuration. Ollama serves one. That is the whole trick.
Through the UI
Open Settings → Models and choose Add a custom provider. The form asks for a lowercase Provider ID, a base URL, an API protocol, a credential, and at least one model. Point the base URL at http://127.0.0.1:11434/v1.
Under Model catalog, Fetch available models queries the base URL and credential currently in the form. Ollama serves the OpenAI-compatible GET /models, so your pulled models should populate. If they do not, enter them by hand — the guide explicitly supports that for endpoints without discovery.
The Provider ID is permanent. Requests, saved sessions, model defaults and credential references all key off it. Renaming means adding a new provider and deleting the old one. Pick something you can live with — ollama, not test2.
Through settings.yaml
The equivalent hand-written form, using the schema documented in the dsh-llm-pi-ai package. Settings live in $DSH_HOME/settings.yaml:
llm-pi-ai:
providers:
ollama:
displayName: Local Ollama
apiKeyEnv: OLLAMA_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
streamIdleTimeoutMs: 600000
models:
- id: qwen3.8:27b
name: Qwen 3.8 27B
contextWindow: 262144
maxTokens: 32768
Five things about that block that the docs are unusually precise about, and that will bite you otherwise:
- A hand-declared route needs all three of
api,baseURL, and a non-emptymodelslist. dsh ships no catalog for a provider it has never heard of, so nothing can be inferred. An unserviceable profile is refused where it is written —settings.mutateanswerssettings-rejectednaming the offending route and model, rather than being stored and quietly disabling the namespace. - A
modelslist replaces the route's catalog rather than extending it. Every model you want to keep using must appear in it. An entry of nothing butidis enough. apiKeyEnvis a reference, not a secret. No key enters the file. It resolves per request from the environment. Ollama does not check it, but if you name a variable that resolves to nothing, the request fails withMISSING_CREDENTIALon purpose — the docs explain that falling through would otherwise authenticate with whatever unrelated key the environment happens to hold. Either omitapiKeyEnventirely or export something.- Sizes default generously. A model the route does not size takes
defaultContextWindowof 262,144 anddefaultMaxTokensof 32,768. Those are the docs' own admitted guesses. For a local 27B where you have not raised Ollama's context, they are far too optimistic — setcontextWindowto what you actually serve. streamIdleTimeoutMsdefaults to five minutes and covers an outstanding provider read. A large local model cold-starting from disk can exceed that. Raising it is cheap insurance.
Vision models need one extra line
A model you enter by hand is treated as text-only until it says otherwise, because nothing can interrogate an endpoint about which modalities it accepts. Attaching an image to such a model is refused before it is sent. If your local model takes images, add input:
llm-pi-ai:
providers:
ollama:
apiKeyEnv: OLLAMA_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
models:
- id: qwen3.8:27b
input: [text, image]
Or set defaultInput: [text, image] once on the route if every model you declare accepts them. The docs are careful here: both fields state a claim about your endpoint rather than checking it. Over-claiming is worse than under-claiming, because the image stays in the session log and the same doomed request repeats until you start a new session.
If Ollama is on another machine, put a token in front of it before you point an agent at it — see our securing Ollama guide.
Driver Model by VRAM Tier
On 24GB, run qwen3.8:27b — an 18GB download at Q4_K_M. On 12-16GB, run gemma4:12b (7.6GB) and expect to babysit long tool chains. Under 12GB, use dsh as an assisted editor, not an autonomous agent.
Every size is the download size from that model's own Ollama tag listing, read directly. Peak VRAM is higher: context and KV cache sit on top, which is why the verdict column is stricter than the number.
| Your hardware | Driver model | Download size | Honest verdict |
|---|---|---|---|
| 8GB VRAM | qwen3.5:9b (Q4_K_M) | 6.6GB | Runs. Single-step edits and file reads are fine. Multi-plugin chains drift. |
| 12GB VRAM | gemma4:12b | 7.6GB | Best of the small tier; 256K context per the tag listing. |
| 16GB VRAM | gemma4:12b with more context headroom | 7.6GB | qwen3.8:27b is 18GB and qwen3.5:27b is 17GB — neither fits 16GB with usable context. |
| 24GB VRAM | qwen3.8:27b (Q4_K_M) | 18GB | The pick. Ollama's 0.32.12 notes credit it with gains on "long-horizon agentic tasks" — a vendor claim, but the right shape for a harness. |
| 24GB VRAM (alt) | muse-glimmer (30B MoE, Q4_K_M) | 18GB | Apache-2.0 per its Ollama listing, built for agent loops. Faster per turn than a dense 27B. |
| 32GB VRAM | qwen3.5:35b-a3b | 24GB | MoE with 3B active. Or qwen3.8:27b-q8_0 at 30GB if quality matters more than context. |
| 32GB VRAM (alt) | nemotron-3.5-lightning | 25GB | 30B MoE, 3B active, 1M context on the standard tags. |
| Apple Silicon 32GB | qwen3.8:27b-mlx | 18GB | Ollama says it optimized this variant for "repeated tasks and coding agents" on Apple Silicon. |
| Apple Silicon 64GB+ | qwen3.8:27b-mxfp8 | 32GB | Room for a long session plus everything else you have open. |
The 16GB row is the one worth reading twice. There is a real gap in 2026's model sizes: the useful agentic models land at 17-25GB, and the tier below lands at 6-8GB. A 16GB card gets the small-model experience, not a scaled-down version of the big one. If you are buying hardware around this, that gap is the argument for 24GB, and our hardware hub has the current pricing picture.
What the Plugin System Can and Cannot Do Locally
The plugin architecture is model-agnostic — nothing in it requires DeepSeek's API. What changes on a local model is how reliably the agent drives it.
Things that work identically regardless of which model is behind them, because they are harness-side:
- Filesystem, shell and terminal plugins. Reading and editing workspace files, running commands. The harness asks before operations requiring approval under the active permission policy.
- MCP. dsh ships an
mcppackage, so your existing MCP servers plug in the same way. If that is new to you, our Ollama MCP integration guide covers the protocol side. - Subagents, plans and jobs. rc.7's release notes mention managing Codex and Claude Code subagent tasks through a Job Panel, and durable image attachments across MCP and ACP.
- Sandbox and guard packages, plus a native
landlock-runcomponent in the tree — the harness has real isolation primitives rather than trusting the model.
Things that degrade with a smaller local model, in the order you will hit them:
- Tool selection. Fifty first-party plugins means a large tool surface. A 9B model presented with dozens of tools picks wrong more often than one presented with five. Narrow what you expose.
- Argument fidelity. The right plugin called with a missing or malformed field. The harness surfaces the error; a weak model frequently re-sends the same broken call.
- Long-horizon coherence. Plans and subagents are exactly the features that assume the model remembers what it decided twenty turns ago.
There is also one hard capability difference. The provider guide notes reasoning-effort levels are per-model configuration — rc.7 added a low reasoning effort for DeepSeek models, with high still the default. On a hand-declared local route, a model has no reasoning metadata unless you declare reasoningEfforts yourself, and the docs are explicit that a hand-declared model without it "does not reason" as far as the harness is concerned. Your local model may still think; the harness simply will not offer you a control for it.
If you want that control, reasoningEfforts is a dict whose keys come from the harness's level set — off, minimal, low, medium, high, xhigh, max — and whose values are the wire spelling your endpoint expects. A level you do not declare is not offered. Declaring false instead states the model does not reason at all; an empty declaration is refused rather than guessed at.
Honest Limitations
This is a developer preview from a repository that is days old. That is not a caveat you can skim.
- Declared breaking changes. The README says so in capitals. Config that works today may not survive rc.8.
- The local path is undocumented in the README. It works via the general custom-provider mechanism, which was built for company gateways, not specifically for Ollama. Nothing about it is Ollama-aware, so nothing will warn you about an Ollama-specific mistake.
- No published local-model guidance at all. There is no first-party recommendation of which local model to drive dsh with, no minimum context guidance, and no tool-calling compatibility list. The tiers on this page are our inference from model sizes and general agent behaviour, not a vendor spec.
- A five-day-old plugin ecosystem is unaudited by definition. The
dsh-pluginGitHub topic is a discovery convention, not a review process. - Ollama's
/v1endpoint is an OpenAI-compatibility shim. It is the right choice here because dsh's custom-provider path speaksopenai-completions— but shims are where tool-calling edge cases live. If calls come back malformed, that layer is the first place to look, and our Ollama function calling guide covers the failure modes.
None of that means don't use it. It means don't build a workflow you depend on around it this month.
Local vs the DeepSeek API
Local wins on privacy, cost and offline capability. DeepSeek's own API wins on agent reliability and on being the configuration the project actually tests.
Better locally:
- Your codebase stays on your machine. For a harness with filesystem and shell access to a work repository, this is often the only argument that matters.
- No metered cost on a loop. An agent that reads twenty files to answer one question is a bad shape for per-token billing.
- No rate limits and no deprecation. The harness is MIT; the model is yours.
- Works on a plane, which is a genuine use case for an editor-adjacent agent.
Better on the API:
- It is the tested path. DeepSeek's card is the one with a dedicated UI slot and first-party reasoning-effort controls. The local route is a general-purpose escape hatch.
- Tool-call reliability at long horizons. A frontier hosted model still mangles fewer calls on turn thirty than a local 27B.
- Reasoning controls out of the box, versus declaring
reasoningEffortsby hand. - No cold starts. An 18GB local model loading from disk is real seconds, every time it is evicted.
Worth knowing that DeepSeek's model line is also available locally — our DeepSeek R1 setup guide, DeepSeek V3 local setup and the DeepSeek V4 overview cover the weights side. Running DeepSeek's harness on DeepSeek's own open weights, with nothing leaving the box, is a coherent setup — just be honest that the biggest of those models are not consumer-hardware models.
If you want the same question answered for the other big August harness, we did that too: OpenClaw on a local model.
Verdict
- Yes, dsh works without a DeepSeek API key.
ollama launch dsh(Ollama 0.32.11, 14 August 2026) is the quick route; the custom OpenAI-compatible provider athttp://127.0.0.1:11434/v1is the one to keep. - The harness costs you nothing in hardware. Node app, no GPU, port 3080. Node
^22.19.0 || >=24.0.0is the only gate. - 24GB and
qwen3.8:27b(18GB) is the sweet spot. 16GB is a real cliff, not a gentle slope — the useful agent models start at 17GB. - A hand-declared route needs
api,baseURLand a fullmodelslist, and that list replaces the catalog rather than extending it. - Fix the defaults.
defaultContextWindowof 262,144 and a five-minute idle timeout are wrong for most local setups in opposite directions. - It is rc.7 of a developer preview that warns you about breaking changes. Play with it now; don't depend on it yet.
Sources
- github.com/deepseek-ai/deepseek-harness — README, LICENSE (MIT),
package.json(v0.1.0-rc.7, Node engines),docs/user/guide/providers.md,packages/llm/llm-pi-ai/README.md, releasedsh-v0.1.0-rc.7(17 August 2026), repository creation date and star count - Ollama release notes — v0.32.11 (14 August 2026,
ollama launch dsh) and v0.32.12 (Qwen 3.8 27B) - ollama.com/library — tag listings and download sizes for qwen3.8, qwen3.5, gemma4, muse-glimmer and nemotron-3.5-lightning
- github.com/cordiverse/cordis — the framework dsh is built on
Model capability language ("substantial gains… long-horizon agentic tasks", "optimized for repeated tasks and coding agents") is quoted from Ollama's release notes and is a vendor claim, not our measurement. Download sizes are read from the tag listings. The VRAM tiers are our inference from those sizes plus general tool-calling behaviour, not a first-party specification.
FAQ
Go from reading about AI to building with AI
20 structured courses. Hands-on projects. Runs on your machine. Start free.
Liked this? 20 full AI courses are waiting.
From fundamentals to RAG, agents, MCP servers, voice AI, and production deployment with real GitHub repos. First chapter free, every course.
Build Real AI on Your Machine
RAG, agents, NLP, vision, and MLOps - chapters across 25 courses that take you from reading about AI to building AI.
Want structured AI education?
25 courses, 519+ chapters, from $9. Understand AI, don't just use it.
Continue Your Local AI Journey
Comments (0)
No comments yet. Be the first to share your thoughts!