Run DSH locally

Node 18 or newer is the only prerequisite. The fastest path does not install anything globally.

Start the web UI

One command downloads the package, boots the kernel and serves the interface on your machine.

terminal
npx @deepseek-ai/dsh web
The UI is served from 127.0.0.1, so nothing is exposed to your network by default.

Or build from source

Cloning gives you the plugin workspace, the docs directory and the presets to read.

terminal
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm build

Add a plugin

A plugin is an npm package. Adding one writes it into your configuration and asks the kernel to resolve its dependencies.

terminal
npx @deepseek-ai/dsh plugin add <package-name>
npx @deepseek-ai/dsh plugin list

Write your first plugin

The smallest useful plugin is a function that names what it needs and registers one thing. This one adds a tool to the table.

greet-tool.ts
import type { Context } from 'cordis'

export const name = 'greet-tool'
export const inject = ['tools']

export function apply(ctx: Context) {
  return ctx.tools.register('greet', async ({ name }) => {
    return `Hello, ${name}.`
  })
}
The returned disposer is what makes the tool disappear cleanly when the plugin is unloaded.

Pick a preset

Presets change how much surface area the agent has. Start with Standard and move down when you want a cleaner measurement.

  • Standard

    The full coding agent: file editing, shell access, retrieval, the whole tool table.

  • PTC

    Tools composed in TypeScript instead of selected one at a time, so a turn can express a whole program.

  • Minimal

    Bash and an editor. Nothing else. The honest baseline for benchmarking a model.

  • Creative

    Build your own preset and watch the runtime while it runs, service by service.

If it does not start

Node version errors

Check node -v. Anything below 18 will fail on syntax the runtime uses.

Port 3080 already in use

Pass a different port on the command line, or stop whatever is holding it.

A plugin never loads

It is almost always an unsatisfied inject. The plugin stays pending until every service it named exists, so check whether the dependency plugin loaded first.

The full guide, the architecture notes and AGENTS.md all live in the docs directory of the repository. Documentation

Cordis is a TypeScript plugin framework from the Koishi community. DSH does not implement its own plugin system. It uses this one, which is why a DSH plugin is a Cordis plugin.

Understand the kernel