Languages: English | 中文
A custom LLM provider plugin for DeepSeek Harness (dsh) that connects dsh to Command Code — a faithful port of pi-commandcode-provider onto dsh's LLM seam.
Works with every Command Code plan, including the $1/month Go plan. Even the Go plan — the only one without Provider API access — gives you an API key in the Studio; that key authenticates the CLI/agent login. This plugin uses that same key against Command Code's own
/alpha/generateendpoint, not the traditional Provider API protocol, so it works even when a plan has no Provider API access.
Disclaimer: This is an unofficial, community-maintained integration. It is not affiliated with, endorsed by, or supported by Command Code. You need your own Command Code account. Command Code's terms, availability, and pricing apply.
Newbie-friendly: one command to install — the plugin mounts itself, no config files to edit.
dsh plugin --profile web add dsh-commandcode-provider@0.1.3The package declares dsh.bundle, so dsh plugin add installs it AND automatically joins it to the profile's bundle layers — the shipped cordis.patch.yml mounts the provider row for you.
Do not also add a manual
cordis.patch.ymlrow for this plugin — the bundle patch already mounts it; a second row would double-register the provider.
The provider then appears in the web UI automatically.
Even on the Go plan, Command Code gives you an API key used for authentication:
- Open commandcode.ai and sign in.
- Go to Studio → API Keys (in the sidebar).
- Click Generate API key and copy it.
This key is an authentication key for using Command Code — it is not a "Provider API" key. The plugin speaks Command Code's own
/alpha/generateprotocol with it, so no Provider API access is required, and the Go plan works.
** Command:** In a dsh chat, run:
/commandcode-setkey
and paste the key when prompted.
That's it — pick a Command Code model from the model picker and start chatting.
This plugin is not a traditional API-protocol provider:
- It talks to Command Code's own streaming endpoint
https://api.commandcode.ai/alpha/generatewith the same wire protocol the official CLI uses (x-command-code-version,x-cli-environment,x-project-slug, … headers). - The API key from Studio is an authentication credential for that endpoint — the same one
cmd loginwrites to~/.commandcode/auth.json. - Because it rides the CLI protocol instead of the Provider API, it works on every plan, including Go, and even models the Provider API cannot serve.
- Model discovery still uses the public Provider API catalog endpoint when reachable, with an offline cache at
<dsh home>/commandcode/commandcode-models.json; if that endpoint is unreachable (e.g. a Go plan), the last cached catalog keeps serving.
Everything the pi plugin does, on the dsh host plane:
-
Provider registration — registers the
commandcodeprovider route onctx.llmwith the same/alpha/generatestreaming protocol, retry/timeout/abort semantics, and message/tool conversion as the pi plugin (paired tool-call filtering, data-URL image forwarding, legacy schema normalization). -
Model discovery with offline cache — fetches the catalog from
https://api.commandcode.ai/provider/v1/modelsand caches it locally (versioned, atomic writes); offline, the last cached catalog keeps serving. -
Reasoning metadata — models with known Command Code effort support advertise their thinking levels through the LLM seam; a selected level is sent as
params.reasoning_effort. -
Image input — models marked
imagein the catalog accept image blocks (resolved through dsh's durable attachment service); text-only models reject images before any network request. -
Authentication — credentials resolve per request through, in order:
- the Harness credential seam (
ctx.credentials, what the web Models page writes), - the trusted launch environment (
COMMANDCODE_API_KEY), - existing Command Code auth files:
~/.commandcode/auth.json,~/.pi/agent/auth.json,~/.omp/agent/auth.json.
No browser OAuth flow — the key is entered in the web UI (Settings → Models → Command Code → Edit) or via
/commandcode-setkey. - the Harness credential seam (
-
Commands —
/commandcode-refresh(re-fetch + re-register the catalog),/commandcode-status(redacted diagnostics),/commandcode-setkey(store an API key). -
Pricing display — the static per-model cost table from the pi plugin (USD per million tokens).
-
Error hygiene — context-overflow wording is normalized to
CONTEXT_WINDOW_EXCEEDED, and every error/diagnostic text is redacted.
The commandcode-provider settings section accepts (all optional):
| Field | Default | Meaning |
|---|---|---|
apiKeyEnv |
COMMANDCODE_API_KEY |
Credential reference resolved per request |
displayName |
Command Code |
Name shown by selectors |
baseURL |
COMMANDCODE_API_BASE env → https://api.commandcode.ai |
API base for /alpha/generate (usually leave at default) |
modelsUrl |
COMMANDCODE_MODELS_URL env → Provider API |
Model discovery endpoint |
modelsTimeoutMs |
COMMANDCODE_MODELS_TIMEOUT_MS env → 10000 |
Discovery timeout |
modelsCachePath |
COMMANDCODE_MODELS_CACHE env → <dsh home>/commandcode/commandcode-models.json |
Catalog cache path |
models |
— | Optional explicit catalog entries; each overrides (or adds to) the discovered model by id |
defaultContextWindow |
262144 |
Context capacity for models neither the catalog nor an override sizes |
defaultMaxTokens |
32768 |
Output capability for models neither the catalog nor an override sizes |
timeoutMs |
— | Per-attempt HTTP request timeout |
streamIdleTimeoutMs |
300000 |
Max idle time while one stream read is outstanding |
retryPolicy |
normal defaults | Provider-owned model-request retry policy |
# $DSH_HOME/settings.yaml
commandcode-provider:
apiKeyEnv: COMMANDCODE_API_KEY # credential reference the Models page writes- Removed the browser OAuth flow (and the local callback server): no more
/commandcode-login, no browser pop-up. The API key is entered directly in Settings → Models → Command Code → Edit (single API key field) or via/commandcode-setkey. - Models-page card for Command Code shows only the API key field; no API address to configure.
- Initial port of
pi-commandcode-provider:/alpha/generatestreaming, model discovery + cache, reasoning efforts, image input, pricing display.
npm install # dev + test dependencies
npm run typecheck # strict tsc against the harness seam sources
npm run build # emit lib/ (ESM + declarations)
npm test # vitest suite (wire protocol, discovery, cost, adapter, plugin entry)The typecheck and vitest resolve the @deepseek-ai/* seam packages from a local D:/1codeprojects/deepseek-harness checkout via tsconfig.json paths / vitest.config.ts aliases; a published build only needs the peerDependencies a dsh host already provides.
MIT
中文文档: README.zh.md