Tutorial
DeepSeek Harness tutorial
From starting the Web UI to running your first agent task — and configuring every model provider. Based on the official guide.
1. Start the Web UI
After installing, run:
npx @deepseek-ai/dsh web Open http://127.0.0.1:3080. The dsh process treats the directory you ran it in as its default filesystem location, but the Web UI won't select a workspace until you add one.
2. Configure a model
Open Settings → Models, enter your DeepSeek API key, and save. The model route becomes available immediately — no server restart needed.

Screenshot from the official DeepSeek Harness docs (MIT).
To add other providers, use Add provider (Anthropic, OpenAI, and more from the installed directory) or Add custom provider for company gateways and self-hosted endpoints.
3. Choose a workspace
Click Choose workspace, add the project directory you started dsh in, then select it. The conversation input stays disabled until a workspace is selected.
4. Run your first task
Summarize this repository and identify its main packages. The agent can read and edit workspace files, run commands, delegate work, and maintain a plan. When an action needs approval under the current permission policy, the Web UI asks you first.
Model configuration (providers)
Model changes take effect on the next request — no restart needed. Keys are stored in $DSH_HOME/.credentials.yaml and are write-only.
- DeepSeek: enter the API key on the Models page.
- Directory providers (Anthropic, OpenAI, …): add a provider and its key. Bedrock, Vertex, Azure, and Codex need their native credentials (AWS/ADC/
api-version/OAuth). - Custom providers: lowercase Provider ID + base URL + protocol + credentials + at least one model. Use Get available models to query the endpoint.
- Vision models: add
input: [text, image]in$DSH_HOME/settings.yamlfor the model.
Troubleshooting
MISSING_CREDENTIAL— store the provider key or set the referenced env var.UNKNOWN_MODEL— pick a configured model or add it to your custom provider.- Get available models returns 401 — check the key; model discovery calls
GET /models. - Images rejected before sending — the model doesn't declare the image modality; add
input: [text, image].