DeepSeek released DeepSeek Harness v0.1 in developer preview and published the full source code under the MIT license. The project ships as dsh at deepseek-ai/deepseek-harness. A harness is the layer between a model and the environment it acts in — the tools, files, sandboxes, and control loop that let an agent keep working. DeepSeek frames it as Agent = Model + Harness. Most harnesses hard-code that layer: the agent loop, the tool registry, and the session store are fixed, and extension happens only at whatever hooks the authors exposed. Harness takes the opposite position, stated in the first lines of its README: everything is a plugin. Models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and the UI all sit behind Cordis plugin boundaries, and any of them can be selected, swapped, or extended in configuration without changing Harness source code. That makes this a kit for assembling agent runtimes rather than a fixed coding assistant, and it is why the release matters more than the model announcement it shipped alongside.
Is it deployable?
Yes, but as developer infrastructure, not as a production agent product. v0.1 is a developer preview.
- Company level: AI-native startups and platform or developer-experience teams inside mid-to-large enterprises that already run internal tooling. Regulated enterprises can pilot it locally because it is MIT-licensed and self-hosted.
- Industries: Software and devtools, financial services and insurance (auditable agent runs), healthcare and pharma R&D, cloud and semiconductor vendors publishing reference agent stacks, and academic or industrial research labs benchmarking models.
- Applications: Internal coding agents over private repositories, model evaluation inside a controlled two-tool environment, agent observability and run replay, custom sandbox and approval policies, and packaging house tooling as reusable plugins.
The Cordis kernel
Harness runs on Cordis, a meta-framework whose design is set out in A Programming Paradigm for Spatiotemporal Composability. The kernel handles plugin mounting, unmounting, and dependencies. Capabilities live in the plugins, not in a privileged core.
Plugins cover models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and the UI. Cordis services and events let them work together. Developers select, swap, or extend any capability in configuration, without changing Harness source code.
Four runtime modes
Standard is the full coding agent: file editing, shell, file and web search, skills, planning, goals, subagents, and workflows. Code mode exposes those tools through a Code Mode SDK, so the model can combine multi-step operations in one TypeScript program. Minimal keeps two tools, a persistent bash and str_replace_editor, for benchmarking models in a bare environment. Creator mode adds runtime inspection, in-memory plugin experiments, and preset-authoring guidance.
Every run is traceable
Everything the model sees is written to an append-only session log. That includes system prompts, reasoning, tool calls and results, subagent scheduling, and every context injection. The Trajectory view inspects those records by source. Resume, fork, search, and replay all operate on the same event stream. Most agent frameworks log tool calls; recording every context injection is the sharper claim here.
Model routing is also a plugin
In Settings → Models, a DeepSeek API key takes effect on the next request without restarting the server. The installed catalog adds providers such as Anthropic and OpenAI by API key. Bedrock, Vertex, Azure, and Codex need native credentials instead: AWS credentials and a region, an ADC project, an api-version, and OAuth respectively. Custom providers accept any OpenAI-compatible base URL and protocol. Keys are write-only and stored in $DSH_HOME/.credentials.yaml; settings retain only a credential reference.
Running it
npx @deepseek-ai/dsh web starts the Web UI, served at http://127.0.0.1:3080 by default. From a checkout: git clone, pnpm install, pnpm run build, then pnpm dsh web. A Python SDK ships as deepseek-harness-sdk and needs Python 3.10 or newer, on Linux x64, Linux arm64, or macOS 14+ on arm64. Its bundled runtime requires no system Node.js.
<div class="dsh-split">
<div>
<div class="dsh-stage">
<svg class="dsh-board" viewBox="0 0 460 420" role="img" aria-label="Cordis kernel with nine mountable plugin nodes">
<g id="dsh-wires"></g>
<g class="dsh-core">
<circle class="dsh-core-ring" cx="230" cy="210" r="52"></circle>
<circle cx="230" cy="210" r="42" fill="rgba(77,107,254,.14)" stroke="#4D6BFE" stroke-width="1.4"></circle>
<text x="230" y="205" text-anchor="middle" fill="#E9EDF9" font-family="JetBrains Mono, monospace" font-size="12" font-weight="700">cordis</text>
<text x="230" y="221" text-anchor="middle" fill="#8AA0FF" font-family="JetBrains Mono, monospace" font-size="10" letter-spacing="1">KERNEL</text>
</g>
<g id="dsh-nodes"></g>
</svg>
</div>
</div>
<div>
<div class="dsh-code">
<div class="dsh-code-bar">
<span>settings.yaml</span>
<span class="dsh-count" id="dsh-count">9 / 9 mounted</span>
</div>
<pre class="dsh-yaml" id="dsh-yaml"></pre>
</div>
<p class="dsh-note">Composition is a configuration concern. Unmounting a plugin removes the capability from the running agent — it does not require editing the harness itself.</p>
</div>
</div>
<div class="dsh-readout" id="dsh-readout">
<p class="dsh-readout-k" id="dsh-ro-k">Select a plugin</p>
<p class="dsh-readout-v" id="dsh-ro-v">Nine capabilities are mounted. Cordis services and events let them work together, and any one can be selected, swapped, or extended in configuration without changing Harness source code.</p>
</div>
</div>
<div class="dsh-panel" id="dsh-p2" role="tabpanel" aria-labelledby="dsh-t2" hidden>
<p class="dsh-lede">Harness ships <b>four runtime modes</b>. Each one loads a different default plugin set, so the same kernel can be a full coding agent or a deliberately bare benchmarking environment.</p>
<div class="dsh-modebar" id="dsh-modebar"></div>
<div class="dsh-split">
<div>
<div class="dsh-code">
<div class="dsh-code-bar"><span id="dsh-mode-label">Standard mode</span><span class="dsh-count" id="dsh-mode-count"></span></div>
<div style="padding:14px 15px 4px;">
<div class="dsh-chips" id="dsh-mode-chips"></div>
</div>
</div>
</div>
<div>
<div class="dsh-readout">
<p class="dsh-readout-k">What this mode is for</p>
<p class="dsh-readout-v" id="dsh-mode-desc"></p>
</div>
<p class="dsh-note">Minimal mode exists to benchmark the <b>model</b>, not the scaffolding: two tools, <code>bash</code> and <code>str_replace_editor</code>, and nothing else in the way.</p>
</div>
</div>
</div>
<div class="dsh-panel" id="dsh-p3" role="tabpanel" aria-labelledby="dsh-t3" hidden>
<p class="dsh-lede">Everything the model sees is written to an <b>append-only session log</b>: system prompts, reasoning, tool calls and results, subagent scheduling, and every context injection. Resume, fork, search, and replay all read the same event stream.</p>
<div class="dsh-filters" id="dsh-filters"></div>
<div class="dsh-log" id="dsh-log" aria-live="polite"></div>
<div class="dsh-actions">
<button class="dsh-btn" id="dsh-replay" type="button">Replay</button>
<button class="dsh-btn" id="dsh-fork" type="button">Fork from here</button>
<button class="dsh-btn" id="dsh-resume" type="button">Resume</button>
</div>
<p class="dsh-note">Illustrative stream. The record types and the resume / fork / search / replay behaviour are from the DeepSeek Harness product page; the example contents are written for this walkthrough.</p>
</div>
<div class="dsh-foot">
<span class="dsh-brand">Interactive explainer · <b>Marktechpost</b></span>
<span>
<a href="https://github.com/deepseek-ai/deepseek-harness" target="_blank" rel="noopener noreferrer">GitHub</a>
·
<a href="https://deepseek.com/harness/en/" target="_blank" rel="noopener noreferrer">Product page</a>
·
<a href="https://deepseek-harness.github.io/deepseek-harness/en/guide/quickstart" target="_blank" rel="noopener noreferrer">Docs</a>
</span>
</div>
</div>
<script>
(function () {
"use strict";
var SVGNS = "http://www.w3.org/2000/svg";
/* ———- Height reporting for iframe embedding (defined first: called during setup) ———- */
var root = document.getElementById("dsh-explainer-root");
var lastH = 0;
function reportHeight() {
if (!root || window.parent === window) return;
var h = root.offsetHeight + 40;
if (h === lastH) return;
lastH = h;
try {
window.parent.postMessage({ type: "dsh-explainer-height", height: h }, "*");
} catch (err) { /* no-op */ }
}
var PLUGINS = [
{ id: "models", label: "models", desc: "Model routes. Catalog providers such as Anthropic and OpenAI, native-auth providers, and custom OpenAI-compatible endpoints." },
{ id: "tools", label: "tools", desc: "The tool registry the model calls: file editing, shell, and file and web search." },
{ id: "skills", label: "skills", desc: "Reusable instruction sets the agent can load into a run." },
{ id: "sessions", label: "sessions", desc: "The append-only event log. Resume, fork, search, and replay all operate on this stream." },
{ id: "sandboxes", label: "sandboxes", desc: "The execution boundary. The Web UI asks before operations that require approval under the active permission policy." },
{ id: "storage", label: "storage", desc: "Where settings, credential references, and session state persist on disk." },
{ id: "loops", label: "loops", desc: "The agent control loop — what the harness does after each model turn." },
{ id: "scheduling", label: "scheduling", desc: "Subagent dispatch and the ordering of delegated work." },
{ id: "ui", label: "UI", desc: "The Web UI itself, including the Trajectory view. It is a plugin like everything else." }
];
var state = {};
PLUGINS.forEach(function (p) { state[p.id] = true; });
var nodesG = document.getElementById("dsh-nodes");
var wiresG = document.getElementById("dsh-wires");
var yamlEl = document.getElementById("dsh-yaml");
var countEl = document.getElementById("dsh-count");
var roK = document.getElementById("dsh-ro-k");
var roV = document.getElementById("dsh-ro-v");
var readout = document.getElementById("dsh-readout");
var CX = 230, CY = 210, RX = 168, RY = 148, NW = 96, NH = 30;
PLUGINS.forEach(function (p, i) {
var a = (i * (360 / PLUGINS.length) – 90) * Math.PI / 180;
var x = CX + RX * Math.cos(a);
var y = CY + RY * Math.sin(a);
p._x = x; p._y = y;
var edgeX = CX + 44 * Math.cos(a);
var edgeY = CY + 44 * Math.sin(a);
var stopX = x – (NW / 2 + 4) * Math.cos(a);
var stopY = y – (NH / 2 + 4) * Math.sin(a);
var wire = document.createElementNS(SVGNS, "line");
wire.setAttribute("x1", edgeX.toFixed(1));
wire.setAttribute("y1", edgeY.toFixed(1));
wire.setAttribute("x2", stopX.toFixed(1));
wire.setAttribute("y2", stopY.toFixed(1));
wire.setAttribute("class", "dsh-wire");
wire.setAttribute("data-wire", p.id);
wire.style.animationDelay = (i * 0.14) + "s";
wiresG.appendChild(wire);
var g = document.createElementNS(SVGNS, "g");
g.setAttribute("class", "dsh-node is-mounted");
g.setAttribute("data-node", p.id);
g.setAttribute("tabindex", "0");
g.setAttribute("role", "button");
g.setAttribute("aria-pressed", "true");
g.setAttribute("aria-label", p.label + " plugin, mounted");
var r = document.createElementNS(SVGNS, "rect");
r.setAttribute("x", (x – NW / 2).toFixed(1));
r.setAttribute("y", (y – NH / 2).toFixed(1));
r.setAttribute("width", NW);
r.setAttribute("height", NH);
r.setAttribute("rx", 7);
var t = document.createElementNS(SVGNS, "text");
t.setAttribute("x", x.toFixed(1));
t.setAttribute("y", (y + 4).toFixed(1));
t.setAttribute("text-anchor", "middle");
t.textContent = p.label;
g.appendChild(r);
g.appendChild(t);
nodesG.appendChild(g);
function toggle() {
state[p.id] = !state[p.id];
render();
select(p);
}
g.addEventListener("click", toggle);
g.addEventListener("keydown", function (e) {
if (e.key === "Enter" || e.key === " " || e.key === "Spacebar") { e.preventDefault(); toggle(); }
});
g.addEventListener("focus", function () { select(p); });
g.addEventListener("mouseenter", function () { select(p); });
});
function select(p) {
var on = state[p.id];
roK.textContent = p.label + " plugin";
roV.innerHTML = "";
roV.appendChild(document.createTextNode(p.desc));
var badge = document.createElement("span");
badge.className = "dsh-readout-state " + (on ? "on" : "off");
badge.textContent = on ? "mounted" : "unmounted";
roV.appendChild(document.createElement("br"));
roV.appendChild(badge);
readout.className = "dsh-readout" + (on ? "" : " is-off");
}
function render() {
var mounted = 0;
PLUGINS.forEach(function (p) {
var on = state[p.id];
if (on) mounted++;
var node = nodesG.querySelector(‘[data-node="’ + p.id + ‘"]’);
var wire = wiresG.querySelector(‘[data-wire="’ + p.id + ‘"]’);
node.setAttribute("class", "dsh-node " + (on ? "is-mounted" : "is-off"));
node.setAttribute("aria-pressed", on ? "true" : "false");
node.setAttribute("aria-label", p.label + " plugin, " + (on ? "mounted" : "unmounted"));
wire.setAttribute("class", "dsh-wire" + (on ? "" : " is-off"));
});
countEl.textContent = mounted + " / " + PLUGINS.length + " mounted";
var lines = [];
lines.push(‘<span class="k">cordis</span>:’);
lines.push(‘ <span class="k">plugins</span>:’);
PLUGINS.forEach(function (p) {
if (state[p.id]) {
lines.push(‘ <span class="k">dsh-‘ + p.id.toLowerCase() + ‘</span>: <span class="v">mounted</span>’);
} else {
lines.push(‘<span class="off"> # dsh-‘ + p.id.toLowerCase() + ‘: unmounted</span>’);
}
});
yamlEl.innerHTML = lines.join("n");
reportHeight();
}
render();
/* ———- Modes ———- */
var MODES = [
{
key: "standard", n: "01", name: "Standard",
desc: "Full coding agent with file editing, shell, file and web search, skills, planning, goals, subagents, and workflows.",
chips: ["file editing", "shell", "file search", "web search", "skills", "planning", "goals", "subagents", "workflows"]
},
{
key: "code", n: "02", name: "Code",
desc: "All Standard mode capabilities, with tools exposed through the Code Mode SDK so the model can combine multi-step operations in one TypeScript program.",
chips: ["file editing", "shell", "file search", "web search", "skills", "planning", "goals", "subagents", "workflows", "Code Mode SDK", "TypeScript orchestration"]
},
{
key: "minimal", n: "03", name: "Minimal",
desc: "Two-tool coding agent with persistent bash and str_replace_editor. Built for benchmarking models in a minimal environment.",
chips: ["bash (persistent)", "str_replace_editor"]
},
{
key: "creator", n: "04", name: "Creator",
desc: "Built for creating custom agent presets, with all Standard mode capabilities plus runtime inspection, plugin experiments, and preset-authoring guidance.",
chips: ["file editing", "shell", "file search", "web search", "skills", "planning", "goals", "subagents", "workflows", "runtime inspection", "plugin experiments", "preset authoring"]
}
];
var modebar = document.getElementById("dsh-modebar");
var modeChips = document.getElementById("dsh-mode-chips");
var modeDesc = document.getElementById("dsh-mode-desc");
var modeLabel = document.getElementById("dsh-mode-label");
var modeCount = document.getElementById("dsh-mode-count");
MODES.forEach(function (m, i) {
var b = document.createElement("button");
b.type = "button";
b.className = "dsh-mode";
b.setAttribute("aria-pressed", i === 0 ? "true" : "false");
b.innerHTML = ‘<span class="n">’ + m.n + ‘</span>’ + m.name;
b.addEventListener("click", function () { setMode(i); });
modebar.appendChild(b);
});
function setMode(idx) {
var m = MODES[idx];
Array.prototype.forEach.call(modebar.children, function (b, i) {
b.setAttribute("aria-pressed", i === idx ? "true" : "false");
});
modeLabel.textContent = m.name + " mode";
modeCount.textContent = m.chips.length + " model-facing capabilities";
modeDesc.textContent = m.desc;
modeChips.innerHTML = "";
m.chips.forEach(function (c, i) {
var s = document.createElement("span");
s.className = "dsh-chip";
s.style.animationDelay = (i * 0.045) + "s";
s.textContent = c;
modeChips.appendChild(s);
});
reportHeight();
}
setMode(0);
/* ———- Trajectory ———- */
var SOURCES = ["system prompt", "context inject", "reasoning", "tool call", "tool result", "subagent"];
var EVENTS = [
{ s: "system prompt", t: "harness identity + workspace prompt assembled" },
{ s: "context inject", t: "sandbox policy recorded as runtime user context" },
{ s: "context inject", t: "workspace file tree (depth 2) attached" },
{ s: "reasoning", t: "plan: locate failing tests, then read the runner config" },
{ s: "tool call", t: "bash · pnpm vitest run –reporter=json" },
{ s: "tool result", t: "exit 1 · 3 failing in packages/llm/llm-pi-ai" },
{ s: "reasoning", t: "provider catalog resolution looks like the likely cause" },
{ s: "subagent", t: "scheduled: read-only survey of provider adapter" },
{ s: "tool call", t: "str_replace_editor · view packages/llm/llm-pi-ai/src/catalog.ts" },
{ s: "tool result", t: "1 file, 214 lines returned" },
{ s: "context inject", t: "compaction skipped · session under threshold" },
{ s: "tool call", t: "str_replace_editor · str_replace catalog.ts" },
{ s: "tool result", t: "edit applied · 1 replacement" },
{ s: "reasoning", t: "re-run the suite to confirm the fix holds" },
{ s: "tool call", t: "bash · pnpm vitest run" },
{ s: "tool result", t: "exit 0 · all suites passing" }
];
var logEl = document.getElementById("dsh-log");
var filtersEl = document.getElementById("dsh-filters");
var active = {};
SOURCES.forEach(function (s) { active[s] = true; });
var forkAt = null;
var timer = null;
var shown = 0;
SOURCES.forEach(function (s) {
var b = document.createElement("button");
b.type = "button";
b.className = "dsh-filter";
b.setAttribute("aria-pressed", "true");
b.textContent = s;
b.addEventListener("click", function () {
active[s] = !active[s];
b.setAttribute("aria-pressed", active[s] ? "true" : "false");
paint();
});
filtersEl.appendChild(b);
});
function paint() {
logEl.innerHTML = "";
for (var i = 0; i < shown; i++) {
var e = EVENTS[i];
if (!active[e.s]) continue;
var row = document.createElement("div");
row.className = "dsh-ev" + (forkAt !== null && i >= forkAt ? " forked" : "");
row.innerHTML =
‘<span class="seq">’ + String(i + 1).padStart(3, "0") + ‘</span>’ +
‘<span class="src">’ + e.s + ‘</span>’ +
‘<span class="txt">’ + e.t + ‘</span>’;
logEl.appendChild(row);
}
reportHeight();
}
function stream(from) {
if (timer) { clearInterval(timer); timer = null; }
shown = from || 0;
paint();
timer = setInterval(function () {
if (shown >= EVENTS.length) { clearInterval(timer); timer = null; return; }
shown++;
paint();
}, 260);
}
document.getElementById("dsh-replay").addEventListener("click", function () { forkAt = null; stream(0); });
document.getElementById("dsh-resume").addEventListener("click", function () { stream(shown); });
document.getElementById("dsh-fork").addEventListener("click", function () {
forkAt = Math.max(1, Math.min(shown, EVENTS.length) – 4);
paint();
});
stream(0);
/* ———- Tabs ———- */
var tabs = [].slice.call(document.querySelectorAll(".dsh-tab"));
tabs.forEach(function (tab, i) {
tab.addEventListener("click", function () { activate(i); });
tab.addEventListener("keydown", function (e) {
if (e.key === "ArrowRight" || e.key === "ArrowLeft") {
e.preventDefault();
var next = (i + (e.key === "ArrowRight" ? 1 : tabs.length – 1)) % tabs.length;
tabs[next].focus();
activate(next);
}
});
});
function activate(idx) {
tabs.forEach(function (t, i) {
t.setAttribute("aria-selected", i === idx ? "true" : "false");
document.getElementById(t.getAttribute("aria-controls")).hidden = (i !== idx);
});
reportHeight();
}
/* ———- Height reporting listeners ———- */
window.addEventListener("load", reportHeight);
window.addEventListener("resize", reportHeight);
if (window.ResizeObserver) { new ResizeObserver(reportHeight).observe(root); }
reportHeight();
})();
</script>
</body>
</html>
“>
Key Takeaways
- MIT-licensed, ships as
dsh, and is a developer preview. - The Cordis kernel makes models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and UI swappable plugins.
- Four modes — Standard, Code, Minimal, Creator — each load a different default plugin set.
- An append-only session log captures every context injection; resume, fork, search, and replay share one event stream.
- Provider-agnostic by design: DeepSeek, Anthropic, OpenAI, Bedrock, Vertex, Azure, Codex, and OpenAI-compatible endpoints.
Check out the DeepSeek Harness product page, GitHub repository, Developer docs, DeepSeek announcement on X and Cordis. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
The post DeepSeek AI Releases DeepSeek Harness in Developer Preview: An MIT-Licensed Agent Harness Where Everything is a Plugin appeared first on MarkTechPost.