{"id":201,"date":"2026-11-06T10:40:51","date_gmt":"2026-11-06T06:40:51","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/11\/06\/deepseek-harness-install-usage\/"},"modified":"2026-11-06T17:04:10","modified_gmt":"2026-11-06T13:04:10","slug":"deepseek-harness-install-usage","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/2026\/11\/06\/deepseek-harness-install-usage\/","title":{"rendered":"DeepSeek Harness: installation, capabilities and first launch"},"content":{"rendered":"<p>DeepSeek Harness, or dsh for short, is an open source AI agent harness from DeepSeek AI. If the model answers questions, then the harness gives her hands: reads and edits files, runs commands, holds sessions, shows the execution trajectory and allows itself to be expanded with plugins. The project is distributed under the MIT license and is in public preview.<\/p>\n<p>The main idea of \u200b\u200bDeepSeek Harness is formulated as \u201ceverything is a plugin\u201d &#8211; literally \u201ceverything is a plugin\u201d. The entire product is built on this: model adapters, a tool registry, a session log, an interface, and even the agent cycle itself. It is based on the Cordis framework, so a developer can not just add a new command, but replace the entire behavior of the agent without forking the kernel.<\/p>\n<p>You can work with dsh in several ways: through the local web interface, through a desktop application, from the command line in headless mode, or from the Python SDK. Below is installation, first launch and an overview of the capabilities.<\/p>\n<h2>What you need<\/h2>\n<p>The web interface and CLI require Node.js. The project has strict requirements:<\/p>\n<ul>\n<li><b>Node.js 22.19.0 or later<\/b> in the 22.x line.<\/li>\n<li><b>Node.js 24.0.0 or later<\/b> in the 24.x line.<\/li>\n<li><b>Node.js 23.x is not supported<\/b> in any patch: this line is not LTS and has already been discontinued.<\/li>\n<\/ul>\n<p>In addition to Node.js, you will need the DeepSeek API key. It is created in your personal account on platform.deepseek.com. The desktop application does not need Node.js &#8211; the environment is already packaged there.<\/p>\n<p>You can check the version with the command:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>node -v\n<\/code><\/pre>\n<\/div>\n<h2>Installation via npx<\/h2>\n<p>The fastest way to get to know the project is to not install anything globally at all. Just run:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>npx @deepseek-ai\/dsh web\n<\/code><\/pre>\n<\/div>\n<p>The command will download the <b>@deepseek-ai\/dsh<\/b> package from npm, set up a local web server and open the interface in the browser. By default it listens to the address:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code><a href=\"https:\/\/127.0.0.1:3080\" rel=\"noopener\" target=\"_blank\">https:\/\/127.0.0.1:3080<\/a><\/code><\/pre>\n<\/div>\n<p>If you don\u2019t need to open the browser, for example on a remote machine, add the <b>&#8211;no-open<\/b> flag:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>npx @deepseek-ai\/dsh web --no-open\n<\/code><\/pre>\n<\/div>\n<p>When launched via SSH, dsh prints the address but does not attempt to open the browser: the local address is owned by the SSH client or editor.<\/p>\n<h2>Global installation<\/h2>\n<p>If you need a tool constantly, it is more convenient to install it globally. The package provides the <b>dsh<\/b> binary:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>npm install -g @deepseek-ai\/dsh\ndsh web\n<\/code><\/pre>\n<\/div>\n<p>After this, the dsh command is available from any directory. The update is performed in the usual way:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>npm install -g @deepseek-ai\/dsh@latest\n<\/code><\/pre>\n<\/div>\n<h2>Desktop application<\/h2>\n<p>For those who don&#8217;t want to hold a terminal and Node.js, DeepSeek releases desktop builds. They are available on the official download page:<\/p>\n<ul>\n<li><b>macOS<\/b> &#8211; Apple silicon, macOS 13 or later, DMG format.<\/li>\n<li><b>Windows<\/b> &#8211; 64-bit assembly, EXE format.<\/li>\n<\/ul>\n<p>The application works with the same local files, can perform tasks in the background and stores sessions in the same way as the web version. This is a convenient option for everyday work, when you don\u2019t want to raise the server manually every time.<\/p>\n<h2>Building from sources<\/h2>\n<p>If you need full control over the code, your own patches or plugin development, the project is collected from the repository. You will need pnpm, and the repository fixes a specific version, so you should first enable Corepack:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>corepack enable\ngit clone https:\/\/github.com\/deepseek-ai\/deepseek-harness.git\ncd deepseek-harness\npnpm install\npnpm run build\npnpm dsh web\n<\/code><\/pre>\n<\/div>\n<p>The <b>pnpm run build<\/b> command prepares package and frontend artifacts, and <b>pnpm dsh web<\/b> runs the already built version without rebuilding. For development, there is a mode <b>pnpm run dev:web<\/b>: it builds, starts the server and rebuilds client bundles when the sources change.<\/p>\n<h2>First launch<\/h2>\n<p>After starting the web interface, the procedure is as follows.<\/p>\n<p>First, open <b>Settings \u2192 Models<\/b> and enter the DeepSeek API key. The key is saved in the file <b>$DSH_HOME\/.credentials.yaml<\/b>, and only a link to it remains in the settings. The settings page receives an already masked description of the secret, so it is impossible to read the key back from the interface. Model changes are applied from the next request; there is no need to restart the server.<\/p>\n<p>Then select your work folder via <b>Choose workspace<\/b>. While the workspace is not selected, the task input field remains grayed out. This is done intentionally: the agent must understand the boundaries within which it is allowed to read and change files.<\/p>\n<p>After this, you can submit the first task. For example:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>Summarize this repository and identify its main packages.\n<\/code><\/pre>\n<\/div>\n<p>The agent will read the project, draw up a plan, call the necessary tools and show the result. For operations that require confirmation based on the current access policy, dsh will ask before executing.<\/p>\n<h2>Models and providers<\/h2>\n<p>DeepSeek connects in one step: the provider card in the settings contains only a field for the API key. Additionally, you can add third-party services. The built-in directory knows identifiers like <b>anthropic<\/b>, <b>openai<\/b>, <b>moonshotai<\/b> for Kimi and <b>zai<\/b> for GLM.<\/p>\n<p>For your own gateway, corporate proxy or local server, there is a <b>Custom model API<\/b> mode. It asks:<\/p>\n<ul>\n<li>permanent provider identifier;<\/li>\n<li>display name;<\/li>\n<li>API base address;<\/li>\n<li>protocol: OpenAI Chat Completions, OpenAI Responses or Anthropic Messages;<\/li>\n<li>key and list of models.<\/li>\n<\/ul>\n<p>The protocol is important: one provider speaks one protocol. If a gateway supports both OpenAI and Anthropic, it will have to be described by two providers. For models, you can specify the size of the context window, the maximum number of output tokens, and supported input data types, including images.<\/p>\n<p>DeepSeek models have <b>off<\/b>, <b>low<\/b>, <b>high<\/b> and <b>max<\/b> reasoning levels. The level is selected in the <b>Effort<\/b> menu next to the model. For routine tasks in the repository, a fast model is sufficient, but for complex architectural tasks it makes sense to increase the effort or take a higher-class model.<\/p>\n<h2>Plugins and Creator mode<\/h2>\n<p>Plugins are the main feature of DeepSeek Harness. Through them, tools, skills, interface elements and entire applications are added. The interface has a plugin manager with official and experimental sets: agent commands, auto-confirmation, scheduled tasks, voice input, terminal, subagents.<\/p>\n<p>The <b>Creator mode<\/b> stands out separately. In this mode, you can ask the agent to write a plugin directly in the chat. It will download the Cordis plugin development skill, create a package structure, write code, install the plugin and check its status. There is an example on the official project page where a floating Pomodoro timer is assembled in this way.<\/p>\n<p>Plugins can also be installed from the command line. For a web profile, the command looks like this:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>dsh plugin --profile web add some-dsh-plugin\n<\/code><\/pre>\n<\/div>\n<p>Npm packages, links like github:owner\/repo, local directories and tgz archives are supported. After installation, it is useful to check that the plugin layer is actually included in the configuration:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>dsh --profile web --dump-config\n<\/code><\/pre>\n<\/div>\n<p>The command prints the assembled plugin tree without starting the server. If there is no new layer, the bundle most likely did not declare a dsh.bundle manifest and installed as a regular library rather than as an included plugin.<\/p>\n<p>The experimental settings include <b>Custom plugin markets<\/b>. This is an index JSON file with a list of plugins, their versions, icons and sources. By enabling the set, you get a <b>Discover<\/b> tab on the plugins page and the ability to connect third-party markets. Like any third-party source, such a market should be added only if you trust its authors.<\/p>\n<h2>Trajectory and audit<\/h2>\n<p>For each session, dsh writes an append-only event log &#8211; <b>Trajectory<\/b>. It stores the system prompt, reasoning, tool calls and their results, subagent scheduling, and context insertions. Session resumption, forks, search and replay are built on this log.<\/p>\n<p>The practical benefit is that the conversation ceases to be a black box. In the interface, you can open the trajectory and see which tools were called, how long each step took, which files were changed, and how many tokens were spent on the request. If an agent behaved strangely, the reason is usually visible here, and not in a short answer in the chat.<\/p>\n<p>Sessions are located in <b>~\/.dsh\/sessions<\/b> in the form of JSONL logs. You can read them, search for them and build your own analytics. This also makes it possible to accurately calculate expenses and cache hits that are not visible in a regular API bill.<\/p>\n<h2>Background tasks and schedules<\/h2>\n<p>DeepSeek Harness can work not only in the \u201cask and receive an answer\u201d mode. Tasks can be launched in the background and scheduled. For example, ask the agent to collect a weekly report from the project notes every Friday at 17:00. In the interface, such tasks are visible separately: you can check the status, view the history and open execution details.<\/p>\n<p>There is a headless profile for automation. It starts one session, prints the final response, and exits:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>dsh --profile headless \"run the tests\"\n<\/code><\/pre>\n<\/div>\n<p>This mode is convenient for CI, cron and scripts where a web interface is not needed. In addition to headless, the <b>sdk<\/b> and <b>acp<\/b> profiles are available: the first serves SDK clients via JSON-RPC, the second serves automation clients via ACP stdio.<\/p>\n<h2>Subagents, MCPs and skills<\/h2>\n<p>A complex task can be decomposed among subagents. The main agent plans the work, and individual subagents work on their areas. This helps keep the context compact and not dragging the entire history into each request.<\/p>\n<p>External tools and data sources are connected via MCP. The documentation includes a separate guide to memory MCP, as well as integrations like GitHub review sessions. Skills describe repeatable procedures that the agent loads as needed, rather than keeping all the instructions in a system prompt all the time.<\/p>\n<h2>Profiles, bundles and patches<\/h2>\n<p>The dsh configuration is assembled from three layers. <b>Bundle<\/b> is a set of configuration lines and plugin code, that is, a ready-made piece of functionality. <b>Profile<\/b> is a named composition of bundles, which is stored in <b>$DSH_HOME\/profiles\/<name><\/b>. <b>Patch<\/b> is a YAML file that changes already loaded lines by identifier, disables them, or adds new ones.<\/p>\n<p>The order of application is as follows: first the bundles in profile order, then the profile patch, then the general patch <b>$DSH_HOME\/cordis.patch.yml<\/b> and at the end the overlays transmitted via <b>&#8211;patch<\/b>. This means that almost any setting can be overridden without touching the bundle sources. You can view the resulting tree with the command:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>dsh --profile web --dump-config\n<\/code><\/pre>\n<\/div>\n<p>A standard web profile is called <b>web<\/b>, a serverless profile is called <b>headless<\/b>. Their settings files live in <b>$DSH_HOME\/profiles\/web\/cordis.patch.yml<\/b> and <b>$DSH_HOME\/profiles\/headless\/cordis.patch.yml<\/b>. This is where dsh writes changes made through the settings interface.<\/p>\n<h2>Python SDK<\/h2>\n<p>There is an official SDK for Python projects. It is installed in a virtual environment and brings with it a native runtime, so the system Node.js is not needed for normal work:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>python -m venv .venv\n.venv\\Scripts\\Activate.ps1\npython -m pip install deepseek-harness-sdk\n<\/code><\/pre>\n<\/div>\n<p>A minimal startup example looks like this:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>from pathlib import Path\n\nfrom deepseek_harness import DeepSeekHarness\n\nworkspace = Path(\"C:\/work\/disposable-workspace\").resolve()\ndsh_home = Path(\"C:\/work\/example-dsh-home\").resolve()\n\nwith DeepSeekHarness(\n    provider=\"deepseek-official\",\n    model=\"deepseek-v4-flash\",\n    max_tokens=49_152,\n    cwd=str(workspace),\n    dsh_home=str(dsh_home),\n    profile=\"sdk-minimal\",\n) as harness:\n    result = harness.run(\n        \"Inspect the repository and fix the failing tests.\",\n        session_id=\"example-001\",\n    )\n\nprint(result.final_response)\n<\/code><\/pre>\n<\/div>\n<p>The SDK starts the bundled dsh process with the sdk-minimal profile and reuses it before exiting the context manager. The minimal profile is intentionally limited: it has bash or pwsh, image reading, and a working directory, but no web tools, subagents, or some of the file tools. For one-time tasks, this is a plus: there is less surface to control.<\/p>\n<h2>What to pay attention to<\/h2>\n<p>DeepSeek Harness is a <b>developer preview<\/b> version 0.1.0-rc.x. The README explicitly warns that compatibility will break. For experiments, personal projects and automation, this is fine, but for a process that makes money right now, it&#8217;s worth weighing the risk and keeping a backup plan.<\/p>\n<p>The second point is Node.js. If you have 22.18 or 23.x, the installation will crash or behave unpredictably. Check the version in advance: the project uses node:sqlite and TypeScript&#8217;s built-in erasure of types that need a fresh branch.<\/p>\n<p>The third point is the sandbox and rights. By default, the agent operates in a policy close to workspace-write: it can change files in the selected folder, and potentially dangerous operations require confirmation. The danger-full-access mode gives more freedom, but the risk becomes higher. Before experimenting with a real repository, it is useful to make a commit or backup.<\/p>\n<p>The fourth point is cost. DSH itself is free, but for inference you pay the provider in tokens. For long sessions, prefix caching is important: dsh composes requests so that the history and tool schemas remain unchanged for as long as possible. If the score turns out to be higher than expected, look not only at the price per token, but also at the share of cash hits in the trajectory.<\/p>\n<h2>Is it worth trying<\/h2>\n<p>DeepSeek Harness is of interest primarily to those who want not just \u201canother chat with a model,\u201d but a controlled environment for agents. There is a transparent trajectory, normal work with files and commands, background tasks, subagents and truly deep expansion through plugins. The ability to replace an agent loop with your own is rare and potentially very useful for research and custom orchestration.<\/p>\n<p>If you need a stable tool for daily paid work, it is now wiser to treat dsh as a second agent next to the main one: try it on a personal project, compare the cost and quality of your tasks, and only then transfer it to the workflow.<\/p>\n<h2>Links<\/h2>\n<p><a href=\"https:\/\/www.deepseek.com\/harness\/\" rel=\"noopener\" target=\"_blank\">https:\/\/www.deepseek.com\/harness\/<\/a><br \/>\n<a href=\"https:\/\/www.deepseek.com\/download\/\" rel=\"noopener\" target=\"_blank\">https:\/\/www.deepseek.com\/download\/<\/a><br \/>\n<a href=\"https:\/\/github.com\/deepseek-ai\/deepseek-harness\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/deepseek-ai\/deepseek-harness<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/quickstart\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/quickstart<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/providers\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/providers<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/python-sdk\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/python-sdk<\/a><br \/>\n<a href=\"https:\/\/platform.deepseek.com\/\" rel=\"noopener\" target=\"_blank\">https:\/\/platform.deepseek.com\/<\/a><\/p>\n<h2>Sources<\/h2>\n<p><a href=\"https:\/\/github.com\/deepseek-ai\/deepseek-harness\/blob\/master\/README.md\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/deepseek-ai\/deepseek-harness\/blob\/master\/README.md<\/a><br \/>\n<a href=\"https:\/\/github.com\/deepseek-ai\/deepseek-harness\/blob\/master\/apps\/cli\/README.md\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/deepseek-ai\/deepseek-harness\/blob\/master\/apps\/cli\/README.md<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/quickstart\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/quickstart<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/providers\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/providers<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/python-sdk\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/python-sdk<\/a><br \/>\n<a href=\"https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/plugin-market\" rel=\"noopener\" target=\"_blank\">https:\/\/deepseek-harness.github.io\/deepseek-harness\/en\/guide\/plugin-market<\/a><br \/>\n<a href=\"https:\/\/dshdocs.com\/getting-started\/installation\/\" rel=\"noopener\" target=\"_blank\">https:\/\/dshdocs.com\/getting-started\/installation\/<\/a><br \/>\n<a href=\"https:\/\/dshdocs.com\/concepts\/profiles-bundles-patches\/\" rel=\"noopener\" target=\"_blank\">https:\/\/dshdocs.com\/concepts\/profiles-bundles-patches\/<\/a><br \/>\n<a href=\"https:\/\/dshdocs.com\/guides\/dsh-vs-claude-code\/\" rel=\"noopener\" target=\"_blank\">https:\/\/dshdocs.com\/guides\/dsh-vs-claude-code\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>DeepSeek Harness, or dsh for short, is an open source AI agent harness from DeepSeek AI. If the model answers questions, then the harness gives her hands: reads and edits files, runs commands, holds sessions, shows the execution trajectory and allows itself to be expanded with plugins. The project is distributed under the MIT license [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-201","post","type-post","status-publish","format-standard","hentry","category-notes"],"translation":{"provider":"WPGlobus","version":"3.0.6","language":"en","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/posts\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/comments?post=201"}],"version-history":[{"count":2,"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/posts\/201\/revisions"}],"predecessor-version":[{"id":203,"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/posts\/201\/revisions\/203"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/media?parent=201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/categories?post=201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/wp-json\/wp\/v2\/tags?post=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}