Skip to main content

1. Overview

DeepSeek Harness (CLI command dsh) is DeepSeek’s official open-source agent harness, positioned as “Model + Harness = Agent” — it ships no models of its own; instead it gives a large model the “hands” to operate files, terminals, the web, and external services, so the model can decompose tasks, read files, edit code, run commands, and deliver results autonomously in your workspace. Built on an “everything-is-a-plugin” architecture, the model is just one replaceable capability, so any OpenAI-compatible or Anthropic-compatible model service can be plugged in. DeepSeek Harness offers a Web UI (default http://127.0.0.1:3080), a CLI, and an SDK. With GravitexAI you get:

2. Requirements

  • Node.js installed (LTS recommended)
  • macOS / Linux / Windows; the Web UI is accessed from a browser
DeepSeek Harness is currently in Developer Preview and iterating rapidly — expect compatibility-breaking changes. Check the official release notes before upgrading.

3. Prerequisites

  • Node.js installed on your machine
  • An API key (format sk-xxxxxxxxxx) created in the GravitexAI Console

4. Quick Start

Step 1: Install and launch DeepSeek Harness

No global install needed — start the Web UI via npx:
This starts the Web UI at http://127.0.0.1:3080 and opens it in your browser; pass --no-open to skip opening the browser. Config and data are stored in the $DSH_HOME directory by default (~/.dsh/ on macOS/Linux, %USERPROFILE%\.dsh\ on Windows).

Step 2: Get a GravitexAI API Key

  1. Open the GravitexAI Console
  2. Click “Create Token”, name it, and save
  3. Copy the key starting with sk-

Step 3: Add a custom provider

In the Web UI, go to Settings → Models, choose Add a custom provider, and fill in:
Each provider uses exactly one protocol. OpenAI-family models (e.g. gpt-5.5) must use the openai-responses protocol, while models such as DeepSeek, Gemini, and Kimi use openai-completions. For Claude-family models, the Anthropic-native protocol (anthropic-messages) is recommended, with Base URL https://api.gravitex.ai (no /v1). Create one provider per protocol (e.g. gravitex, gravitex-openai, gravitex-anthropic; see “Advanced Configuration” below).
The completed form looks like this: Adding a custom provider in DeepSeek Harness

Step 4: Add models

In the provider form’s model catalog, click Fetch available models — DeepSeek Harness calls the gateway’s GET /models endpoint and lists what it offers; search, check the models you want, and click Add selected: Fetching available models in DeepSeek Harness If discovery fails or the list is empty, typing model IDs manually works exactly the same. Make sure each model matches its provider’s protocol, e.g.: See the GravitexAI Model Plaza for the full list of model IDs.

Step 5: Select a model and start

After saving the provider, its models appear in the session’s model selector — pick one and start your task. Selecting a model also makes it the default for new sessions; model changes take effect on the next request — no restart needed: Selecting a model in DeepSeek Harness

5. Feature Quick Reference

6. Advanced Configuration (Optional)

Once you’ve finished the setup above in the Web UI, you can usually skip this section. The Models page only exposes basic fields (key, endpoint, protocol, model IDs, context window, etc.). Everything else — reasoning effort, image input, request compatibility switches — is edited directly in $DSH_HOME/settings.yaml (default ~/.dsh/settings.yaml on macOS/Linux, %USERPROFILE%\.dsh\settings.yaml on Windows; when the browser and server are on the same machine, you can also click Open config file at the top of the Settings page). Changes apply on the next request — no restart needed. About the API key: apiKeyEnv: GRAVITEX_API_KEY in the examples below means the key is read from an environment variable. Before hand-writing the config, set it in your terminal:
The commands above only apply to the current terminal session. On Windows, use setx GRAVITEX_API_KEY "sk-xxxxxxxxxx" to persist it (open a new terminal afterwards); on macOS/Linux, add the export line to ~/.zshrc or ~/.bashrc.
If you already saved a provider’s key in the Web UI, settings.yaml contains an auto-generated credential reference. When adding extra config on top of that, keep the reference as-is — do not replace it with apiKeyEnv. The apiKeyEnv style is for fully hand-written configs where the key comes from an environment variable.

Complete reference configuration

Below is a complete settings.yaml example with all three providers — copy it and trim to your needs:

Field reference

The last two compat fields can also be set at the provider level, applying to every model under that provider:

7. FAQ

The current provider resolved no credential. Check according to how you configured it: if you used the Web UI, re-save the API key on the Models page; if you hand-wrote the config with apiKeyEnv, make sure the environment variable is set (e.g. export GRAVITEX_API_KEY="sk-...") and visible to the terminal that launches dsh. Don’t paste keys into the chat to work around it.
The model ID isn’t recognized by the current provider. Check that the model has been added to the provider’s model list, and that its capitalization and spelling exactly match the GravitexAI Model Plaza.
Confirm the provider holding that model uses the openai-responses protocol. GPT-family models cannot live under an openai-completions provider — create a separate openai-responses provider (e.g. gravitex-openai) and add the model there.
A 401 means the key or endpoint doesn’t match — confirm the Base URL is https://api.gravitex.ai/v1 and the key starts with sk- with no extra spaces. If the list is empty or discovery fails, just type model IDs manually; it works identically.
The gateway’s request shape differs from OpenAI’s. Set compat.supportsDeveloperRole: false and compat.maxTokensField: max_tokens at the provider level in settings.yaml (see Section 6) and retry.
An empty off sends no reasoning field, so models that think by default keep thinking. Set compat.thinkingFormat: deepseek for that model (see the example in Section 6).
Manually entered models are treated as text-only. Add input: [text, image] to the model in settings.yaml. Conversely, if the provider rejects a request with an image, the declared capability doesn’t exist — remove image and start a new session.
No. Provider IDs are permanent (requests, saved sessions, and credential references all point to them). To change one, add a new provider and delete the old. Display name, Base URL, protocol, credentials, and model list remain editable.