Product Launch · Xiaohu's Take

DeepSeek Ships DeepSeek-V4-Pro, Open-Sources Its Harness, and Raises API Prices

219 packages, MIT license, and your existing hooks and skills just carry over.

The 60-Second Brief
  • DeepSeek has fully open-sourced its agent harness. Install Node, and a single npx command gets you running.
  • Features like plan mode, subagents, permission approvals, and MCP are swappable plugins here—even the main loop itself.
  • The public agent benchmark results for V4-Pro were produced using this harness, and that benchmark config gave the model just two tools.
  • Prices rise on August 17. The peak-time price for the cache-hit tier is 12 times the current rate.
Disclosure: This article draws on the repository source code, official X account, and API docs that DeepSeek itself published. The benchmark numbers are the vendor's own—no third-party replication exists. All price multipliers were calculated by us from the official old and new rate cards. Our descriptions of dsh's behavior come from the source and docs; we did not deploy it ourselves.
Intro

Three Big Announcements in One Day

On August 13, DeepSeek made three announcements in a single day.

1. It open-sourced DeepSeek Harness (dsh). This is an agent harness, in the same category as Claude Code and Codex. Features that other tools hard-code into their core—plan mode, subagents, permission approvals, MCP integration—are all implemented as detachable, swappable plugins. That includes the agent's main loop itself. It also recognizes what you already have: Claude Code's hooks and skills work as-is, and it can even delegate sub-tasks to a real Claude Code installation on your machine.

2. The official DeepSeek-V4-Pro release. The upgrades focus on hands-on, get-things-done ability. Scores on tasks like modifying repos, running commands, and completing a job from start to finish roughly doubled (DeepSWE went from 12.8 to 62.7). This capability now surpasses Opus-4.8, landing close to Kimi-K3 and Fable 5. Knowledge and reasoning still lag, with an HLE of only 42.7 versus Fable 5's 53.3.

3. A comprehensive API price increase. Starting at midnight on August 17, pricing shifts to peak and off-peak rates. The cache-hit input price goes up 12-fold, and output rises 4.5-fold.

The first two are two sides of the same coin: the V4-Pro benchmark table has a footnote stating that the public Code Agent tasks used "DeepSeek Harness (minimal mode)."

19:31 V4-Pro out Official X post w/ benchmarks 19:56 Harness open-sourced GitHub repo, MIT 8/17 00:00 New prices live Peak and off-peak rates THE FINE PRINT ON THE BENCH Public Code Agent scores were measured using the DeepSeek Harness minimal mode, max reasoning effort
Times in Beijing time. 25 minutes between the first two announcements.

So the harness released today is literally the system that produced those benchmark scores. And the config file shows exactly which features were on or off during the run.

Concepts

What's a Harness?

An LLM only knows how to do one thing: read text, produce text. It can't open your files, run a command, or remember yesterday's conversation. All that is the job of the surrounding program—the harness. It reads your project's files and hands them to the model. When the model says "run npm test", the harness actually runs it and feeds the output back. If the model wants to edit a file, the harness decides whether to allow it or ask you first.

That layer is a harness. Claude Code is one, Codex is one, and so is Cursor's Agent mode. The same model can behave very differently inside different harnesses, because the harness decides what the model sees, touches, and does when it gets stuck.

HARNESS (THE OUTER SHELL) LLM Only: text in, text out Text Text Reads files for it The model can't touch the disk Runs commands for it And feeds the output back Keeps it from breaking things Asks you before risky actions Remembers what happened Carries context across turns
Our own diagram. The block in the middle is the model; the ring around it is all the harness's job.
Analogy

The model is an engine; the harness is the rest of the car—steering, pedals, brakes, dashboard. Even the best engine won't get you anywhere without the rest of the vehicle. And the same engine in different cars feels completely different to drive.

Philosophy

Plan Mode, Subagents, Permissions, and MCP All Live Outside the Core

Most agent tools on the market bake all of these in: plan mode, subagents, permissions, MCP, context compression. You can toggle parameters and turn them on and off, but you can't swap them out. If that doesn't work, you can fork the project or wait for the vendor to add an option.

dsh flips that. Its core directory contains just eight packages: session logs, system prompt assembly, tool registry, agent interface, default driver, and scope primitives. None of the features above are in there.

COMMON APPROACH DSH Core: everything baked in Plan Mode Subagents Permissions MCP Context Compress Main Loop Can't swap, only tweak core · only 8 packages sessions · prompts · tools · agent ↓ Everything below is a swappable plugin Plan Mode Subagents Permissions MCP client Context Compress Web/CLI UI
Drawn from the repo's directory structure. Left is the common approach; right is dsh's actual package layout.

Plan mode is a plugin. Subagents are eleven packages across seven providers. Permission approvals are two packages. MCP integration is a client plugin. Context compression is four packages. Todos, scheduled tasks, and background jobs are each standalone. The UI is split the same way: web UI in apps/web, command line in apps/cli, and a terminal interface requires installing a profile yourself—it doesn't ship with the distribution.

This extends to the agent's main loop. The contributor guidelines are clear: new behavior attaches at documented extension points; if you must modify the main loop, the same commit must update the architecture docs.

There is no privileged kernel that requires patching: you extend dsh by mounting plugins alongside other plugins, and registrations are effects that are undone when their plugin is unmounted.

docs/architecture.zh.md
Analogy

Other agent tools are sealed appliances with a few ports. dsh is the whole machine, engine included, built from LEGO bricks. Swap any piece you like, and the space left behind cleans itself up.

The trade-off is real: it's in developer preview, and the README warns of breaking changes. Config patches are whole-line replacements, with no deep-merge layer.

Architecture

Even the Main Loop Is a Swappable Plugin

The foundation that makes all this swappability possible is a framework called Cordis, whose source is vendored wholesale into the repo's vendor/ directory. It lets each plugin attach services, events, and side effects to a shared context; when a plugin is unloaded, everything it attached is automatically undone.

On top of that foundation, every part of the product is a plugin: the model adapter, the tool registry, session persistence, and the agent loop itself.

Here's how it fits together at runtime: a running dsh instance is a plugin tree, assembled by layering configs in order. The base layer is dsh-base, which bundles model adapters, tools, persistence, sandbox and approval policies, settings, credentials, and telemetry. Add dsh-web-app and you get a browser UI; add dsh-headless and it runs one task, prints the result, and exits without starting a server. Your changes go on top.

Empty profile root · nothing yet dsh-base models · tools · persistence · sandbox · credentials · telemetry dsh-web-app or dsh-headless Adds a web UI, or a run-and-exit mode your cordis.patch.yml Write only the lines you want to change Higher layers apply later; the last one wins
Our own diagram. Running dsh --profile web --dump-config prints the whole actual plugin tree; any line in that output can be overridden by a line of yours.

The whole-line rule applies here: to change one field, you rewrite the entire line, including everything you want to keep.

Principles

Everything the Model Sees Must Be Replayable, and Capabilities Come in Threes

Two principles keep this modular architecture from collapsing.

1. Every token the model sees must be reconstructable from the log

The session log is append-only. The context for each request is a projection of that stream. The rule is stated in reverse: anything that reaches a model request must be reconstructable from the log, and a runtime assertion enforces it. So if you want to add something new that the model can see, you must also add a corresponding session event. No sneaking things in.

That gives you sessions that pause, resume, fork, and replay exactly with no hidden model-visible state.

2. A capability requires three roles

dsh defines a "capability" as three roles: the one declaring the interface, the one implementing it, and the one consuming it (usually a tool for the model). All three must be designed together; a missing role means it's not a capability.

CONSUMING TOOLS (UNCHANGED) Bash Persistent Terminal Language Server SAME INTERFACE: filesystem + processes Impl A: on your machine Impl B: remote sandbox
Our own diagram. Swap the bottom layer from A to B, and all three tools above move with it, unchanged.

Swap the bottom layer and everything follows: filesystem and processes share one environment, so a remote sandbox automatically moves Bash, the persistent terminal, and the language server—no per-tool remote versions. Subagents work the same way. The interface is "take a self-contained task, return a final answer." Whether that's a forked process in the same runtime or a different vendor's product makes no difference to the caller.

Tools

Code Mode, ralph, and Self-Installing Plugins

If everything is replaceable, what ships? Around thirty usual suspects: bash, file read/write/edit, glob and grep, web search and fetch, todos, plan mode, language server, persistent terminal (one terminal session that persists across commands rather than spawning fresh each time), background tasks, scheduled tasks, subagent dispatch and messaging, and session_search for browsing your own history. It also integrates with MCP servers, and those tools appear as native tools to the model.

Three other tools stand out.

1. Code Mode: the model writes a program to call tools in bulk

Usually the model calls one tool at a time—the harness runs it, returns the result, and asks for the next step. Searching files then reading a few means many round-trips, and every intermediate result piles into the context.

run_code takes a different approach: the model writes a short TypeScript program that chains calls together with await tools.grep(...), await tools.read(...), etc. It runs the whole thing in one shot, then returns only the final result the model cares about.

CONVENTIONAL CODE MODE MODEL TOOLS Many round-trips All intermediate results in context MODEL WRITES A PROGRAM await tools.grep(…) await tools.read(…) …filter out the noise return 3 lines of results One call, done Only the return value hits context
Our own diagram; round-trip counts are illustrative. The main saving is context: intermediate noise stays out of the model's view.
Analogy

Before, you'd call to check in after every tiny errand—ten calls for ten errands. Now you hand over a single to-do list, and get one final report at the end.

2. ralph: a brand-new agent for every single turn

Give it a fixed goal, and it starts a new subagent each turn. That new agent sees none of the previous turns' conversation. Only two things pass between turns: the real files in the workspace (its long-term memory) and a short structured report. It keeps going until a report says done or stuck, or until it runs out of turns.

THE ONE RULE: DON'T CHANGE THE GOAL Turn 1 Fresh agent Turn 2 Fresh agent Turn 3 Fresh agent …… Only a structured report passes between turns; previous dialogue is gone SHARED WORKSPACE (same files across all turns) Changed files live here—this is its only long-term memory
Our own diagram. The tool description explicitly says to use it only when asked; the goal tool should be used for normal long-running tasks.

3. cordis: the agent installs plugins into its own running process

This group has four actions and one read-only report. They operate on the currently running process, not on config files on disk.

1
Definecordis_define registers a new plugin. Nothing runs yet; you just see a card in the session with a start control.
2
Runcordis_run evaluates the host half inside a sandbox and delivers the browser half to every open web page.
3
Stopcordis_stop shuts it down completely and removes it from the page, but the definition stays, ready to run again.
4
Forgetcordis_undefine deletes the definition too; the card stays in the session as an unloaded record.

Note the "browser half" in step 2: the agent can write a UI on the fly and deliver it directly to the web page you have open. There's also a companion tool, cordis_inspect, that lets the agent read the live state of its own process: which services exist, which plugins are alive, and which tools are registered.

Compatibility

Your Hooks and Skills Just Carry Over

So what does the move cost someone who already uses Claude Code? Most of what you have doesn't need to change.

Existing hooks work unchanged. (Hooks are small scripts triggered automatically at fixed moments, like running a format check before every file save.) dsh ships two bridge plugins: one consumes Claude Code's hooks.json, even handling the ${CLAUDE_PLUGIN_ROOT} and ${CLAUDE_PROJECT_DIR} variable substitutions; the other consumes Codex's hook config. The exit-code convention is also respected: exit code 2 means block the operation and use stderr as the reason. When multiple hooks match, the strictest wins—deny overrides ask, ask overrides allow.

Skills are read directly. It scans for SKILL.md format skills in two places: its own ~/.dsh/skills and a ~/.agents directory, which the config describes as a "shared agent config root scanned for skill compatibility."

It can also hand work back to a real Claude Code. Subagents come with seven providers, two of which are external products: one calls the official Claude Agent SDK and looks for a claude command on your machine; the other launches the official codex app-server --stdio. You send over a self-contained task and get back only the final answer. That Claude Code runs with your existing local account and config—the docs explicitly note it neither copies nor filters these files, nor does it create or modify your login state.

hooks.json SKILL.md MCP servers Claude Code Codex dsh All treated as native Send a self-contained task Only the final answer comes back
Our own diagram. The first three bring your existing stuff in; the last one sends work back out.

This all works thanks to the trio rule from earlier: the subagent interface is "accept a self-contained task, return a final answer." Anything that satisfies that interface can be a provider, even another vendor's finished product.

The hook bridge has its limits though: native plugins can do everything the bridge does, with more power, types, and no serialization loss. The bridge is a compatibility path so existing configs work today; real customization means writing a native plugin.

The reverse direction also works: DeepSeek's API can directly back tools like Claude Code, GitHub Copilot, or OpenCode, no code changes needed. Swapping the harness and swapping the model are now independent decisions.

Permissions

If the Sandbox Can't Start, Work Is Refused

But give all these tools to an AI, and what happens when it mistypes a command? This harness has three permission tiers, defaulting to the strictest.

read-only
Default. No collateral damage even on bugs; can't even write to a temp directory.
workspace-write
Can only write inside the workspace. On Windows, also gets a private per-session temp directory.
danger-full-access
No file modification limits. This is what the benchmark environment used.

Each platform uses its native mechanism: Linux prefers bwrap, falling back to Landlock (for which they wrote their own C extension); macOS uses Seatbelt; Windows uses ACL-restricted tokens.

On an unsupported platform, or if the sandbox mechanism can't start, it fails with SANDBOX_UNAVAILABLE and refuses to execute—never silently downgrading to "no restrictions." Better to block work entirely than to loosen permissions without your knowledge.

The current tier is also communicated to the model as a message, but only once and only when the policy changes. No spam.

Evidence

DeepSeek's Benchmark Ran with Just Two Tools

So how much of this did DeepSeek actually use when it ran its own benchmarks?

The minimal mode mentioned in the benchmark footnote has its config right in the repo (examples/jsonrpc-agent/minimal.cordis.yml), readable line by line. The model was given exactly two things.

MINIMAL.CORDIS.YML · THE BENCHMARK CONFIG System prompt, one sentence You are a helpful software engineer assistant. ✓ Persistent bash State preserved, 5-min timeout ✓ String-replacement editor Output cap 16,000 chars EVERYTHING ELSE OFF Skill system Runtime context injection Workspace context Context compression (not installed) Plain bash tool Background task tool This config scored on Terminal Bench 2.1 87.9 third overall, beating Opus-4.8's 85.0
Line-for-line from minimal.cordis.yml in the repo. Permissions were set to danger-full-access; the benchmark environment was completely open.

Of the thirty-odd built-in tools listed in the previous section, only two remain here: a stateful bash and a string-replacement editor. The skill system is off, runtime context injection is off, workspace context is off, context compression isn't installed, and even the plain bash tool and background task tool are turned off. The system prompt is the most unremarkable sentence imaginable: "You are a helpful software engineer assistant."

Terminal Bench 2.1's 87.9 and DeepSWE's 62.7 were achieved with this config.

The scores come from the model itself, with no prompt-engineering tricks in the harness underneath. The out-of-the-box harness has everything enabled; what to run is up to you.

Data

V4-Pro's Gains Are Mostly in Getting Things Done

Since the scores are mostly the model's, what exactly did V4-Pro improve? First, a caveat: the table below is the vendor's own.

DeepSeek official benchmark table comparing V4-Pro-0813 against its own preview and GLM-5.2, Kimi-K3, Opus-4.8, Fable 5
Official benchmark table. The footnote at the bottom is the one from the top of this article: public Code Agent tasks were tested with DeepSeek Harness (minimal mode). Source: @deepseek_ai

Compared to its own preview, the biggest gains are all in "have the model autonomously complete a job" type tasks.

DeepSWE12.8 → 62.7
12.8
62.7
DSBench-Hard31.1 → 67.2
31.1
67.2
Cybergym52.7 → 83.3
52.7
83.3
AutomationBench12.8 → 31.8
12.8
31.8
Terminal Bench 2.172.1 → 87.9
72.1
87.9
Light bars are V4-Pro-Preview; dark bars are V4-Pro-0813. Bar lengths are proportional within each benchmark; benchmarks are not comparable across rows.

DeepSWE jumped from 12.8 to 62.7, nearly a five-fold increase. The previous preview was essentially failing this type of task.

Against the competition, it's a mixed bag. On Terminal Bench 2.1, the 87.9 trails Kimi-K3 (88.3) and Fable 5 (88.0), but beats Opus-4.8's 85.0. The 31.8 on AutomationBench is the highest on the table. But HLE—knowledge and reasoning, no tools—sits at 42.7, well behind Fable 5's 53.3 and Opus-4.8's 49.8. DeepSWE's 62.7 also still trails Fable 5's 70.0 and Kimi-K3's 67.5.

The gains cluster in hands-on tasks; knowledge and reasoning barely moved in this release.

The official post also mentions two more things: V4-Pro and V4-Flash both support adjustable reasoning effort—low, high, or max—with the official guidance being low for simple tasks, high for everyday agent workflows, and max for complex ones (the benchmark used max). And there's native support for OpenAI's Responses API, with a one-click setup script for Codex in the official docs: it backs up your existing ~/.codex/config.toml, writes the model metadata, changes only the necessary fields, and preserves your existing MCP server config.

Pricing

From August 17, Cache-Hit Input Costs 12x More

The same day also brought the third announcement: starting at midnight Beijing time on August 17, API pricing moves to peak and off-peak rates. Peak hours are 9:00–12:00 and 14:00–18:00, totaling 7 hours a day; the other 17 hours are off-peak, at exactly half the peak price.

0:00 9–12 14–18 24:00 Dark 7 hrs = peak price Light 17 hrs = half price
Beijing time. Drawn by us from the official announcement.

For deepseek-v4-pro: output is currently ¥6 per million tokens. The new price is ¥13.5 off-peak and ¥27 peak—4.5 times the current rate at peak. Input (cache miss) is ¥3 now, going to ¥4.5 and ¥9.

The biggest jump is the cache-hit input price.

¥ per M tokensCurrentNew · Off-peakNew · Peak
pro input (cache hit)0.0250.15 (6x)0.30 (12x)
pro input (cache miss)34.5 (1.5x)9 (3x)
pro output613.5 (2.25x)27 (4.5x)
flash input (cache hit)0.020.05 (2.5x)0.10 (5x)
flash input (cache miss)11.5 (1.5x)3 (3x)
flash output24.5 (2.25x)9 (4.5x)

Multipliers calculated by us from the official old and new rate cards; the rates themselves are from DeepSeek's API pricing page.

Why does the cache-hit tier matter? Because agents work turn by turn, and each turn has to resend the entire conversation and all the files it's read. That part almost always hits the cache. The tier with the biggest increase is exactly the tier you consume most when running an agent for a long time.

Analogy

A cache hit is like taking the same road every day and getting a commuter discount at the toll booth. The commuter discount just went up 12x. Someone driving by once barely notices; someone on it every day feels it first.

Concurrency limits are 500 for deepseek-v4-pro and 2500 for deepseek-v4-flash. The official announcement does not explain the price increase.

Maturity

Of 218 Packages, Each Must Document Its Own Shortcomings

So can you use this today?

219
Packages in the workspace
17k
Stars on day one, six hours after launch (queried 2026-08-13 22:02 Beijing time)
rc.6
Latest npm version, three releases on August 13 alone

It's installable: the first candidate version hit npm on August 10, three more came on the 13th, and the latest is 0.1.0-rc.6. The repo was created at 19:56 that day, and by 22:02 it had 17k stars and 1,182 forks. Fill in your API key, pick a workspace directory, and you're off.

dsh web UI settings page with a form to fill in the DeepSeek API key
Web UI settings page: the key takes effect immediately, no restart needed; you can also add other providers or custom OpenAI-compatible endpoints. Source: repo docs/user/guide/

But the README's first line is a warning: it's in developer preview, iterating fast, and breaking changes are coming. The internal spec is even blunter: since there are no external users yet, a correct foundation is worth more than a compatibility layer. The session file format version is still at 0, with no compatibility promises whatsoever.

Enforcing this seriousness is a CI gate: of the 219 packages, 218 must have a "Known Limitations and Deferred Work" section in their README. Miss it, and the build fails. The single exemption is a package containing only type definitions, and even that exemption must document why it has no limitations.

A few highlights:

The ACP automation interface only supports starting new sessions. Loading, listing, resuming, deleting, and forking are all unsupported.
Attachment objects are retained indefinitely. Reference-counted garbage collection hasn't been implemented yet.
Config patches are whole-line replacements. No deep-merge layer; to override a line, rewrite the entire line.
The web CLI deliberately doesn't support --host 0.0.0.0. It won't let you bind the service to all interfaces.
Getting Started

What to Install and Run

Just want to use it: Install Node (22.19+ or 24+), run npx @deepseek-ai/dsh web, open the address it prints in your browser, and put your DeepSeek API key in Settings (no restart needed). Then click "Choose Workspace" to add and select your project directory—the input field stays disabled until you do. For operations that need approval, the UI asks you first.

Want to hack on it: In addition to Node, you'll need Corepack-enabled pnpm (the repo pins 11.7.0) and Git 2.26 or newer. Clone, run pnpm install, then run pnpm run typecheck once. If that passes, your environment is set up. Installation also hooks in Git scripts: a pre-commit hook runs lint and auto-fixes, and a pre-push hook runs the type check.

TODO markers in the code come in three flavors: FIXME means release-blocking, must be resolved before a stable release; TODO means should do when there's time; XXX means "if I think of it"—no commitment.

🧰 Quick Start · DeepSeek Harness (dsh)
PriceOpen source, free (MIT). Model API billed separately
PrereqNode 22.19+ or 24+, run npx @deepseek-ai/dsh web, add DeepSeek API key in settings
Source
DeepSeek HarnessDeepSeek AI·GitHub repo·2026-08-13
Editorial note
README.zh.md itself is only 75 lines. Architecture, tool lists, benchmark config, and per-package limitations all come from the cloned repo's source and docs (HEAD 47f9438). The benchmark table is the official image; bar charts and price multipliers were calculated and drawn by us from official data. All other diagrams are our own. Star count and npm version were queried at 2026-08-13 22:02 Beijing time. Cover image is the auto-generated GitHub repo card.