vinoth4v
dsh-tool-council
DeepSeek Harness plugin: a council tool that asks several models on different providers the same question, then reports where they agree and where they split
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-tool-council
A DeepSeek Harness plugin that gives the model a
council tool: put one question to several models at once, each on a different provider, get every
answer back side by side, then have a separate chair model report where they agreed and — more usefully —
exactly where they split.
One model's confident answer is one sample. A council turns a contested judgement call into visible disagreement you can act on.
Council: 5/5 members answered.
## google/gemini-3.6-flash (2841ms)
...
## groq/openai/gpt-oss-120b (1204ms)
...
## Synthesis — nvidia/minimaxai/minimax-m3
Members 1-4 recommend REST; member 5 dissents for GraphQL. The split is a
weighting judgement, not a factual dispute: ...
Design
Three decisions make the output worth reading:
- Members sit on different providers and different model families. Two checkpoints of the same base model fail the same way, so their agreement tells you nothing. Diversity is the entire signal.
- The chair is not one of the members. It never grades its own answer.
- A failing member is reported, not thrown. One dead provider must not collapse the panel — that is the reason for polling several in the first place. Members run concurrently, so wall-clock is the slowest member, not the sum.
Install
Requires a working DeepSeek Harness installation (npm install -g @deepseek-ai/dsh) with at least two
provider routes configured in $DSH_HOME/settings.yaml.
Clone it inside the profile you are installing into, then register it:
mkdir -p "$HOME/.dsh/profiles/web/plugins"
git clone https://github.com/vinoth4v/dsh-tool-council \
"$HOME/.dsh/profiles/web/plugins/dsh-tool-council"
cd "$HOME/.dsh/profiles/web" && dsh plugin --profile web add ./plugins/dsh-tool-council
The location matters. dsh plugin add links the package, and Node resolves a symlink to its real
path before looking for dependencies — so a clone living outside $DSH_HOME/profiles cannot see
@deepseek-ai/dsh-llm or @deepseek-ai/dsh-tools and fails to load with ERR_MODULE_NOT_FOUND.
Cloning under profiles/ lets the ordinary parent-directory walk reach the harness's own
profiles/node_modules, which carries both.
To keep the checkout somewhere else (a normal projects directory), link the two peer packages into it by hand — pointing at your harness installation — and the same walk succeeds:
DSHMOD="$(dirname "$(readlink -f "$(command -v dsh)")")/../lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai"
mkdir -p node_modules/@deepseek-ai
ln -sfn "$DSHMOD/dsh-llm" node_modules/@deepseek-ai/dsh-llm
ln -sfn "$DSHMOD/dsh-tools" node_modules/@deepseek-ai/dsh-tools
Then add an entry to $DSH_HOME/profiles/web/cordis.patch.yml:
- insert:
- id: council
name: dsh-tool-council
config:
members:
- provider: google
model: gemini-3.6-flash
- provider: groq
model: openai/gpt-oss-120b
- provider: nvidia
model: z-ai/glm-5.2
- provider: openrouter
model: nvidia/nemotron-3-super-120b-a12b:free
- provider: mistral
model: devstral-medium-latest
synthesis:
provider: nvidia
model: minimaxai/minimax-m3
maxTokens: 2048
timeoutMs: 120000
Restart the harness. Repeat for any other profile (headless, tui) that should have the tool.
Every provider must be a route you have configured, and every model an id that route serves — the
plugin does not validate membership, so an unknown pair fails at request time with the provider's own
error, reported against that member.
Configuration
| Field | Default | Meaning |
|---|---|---|
members | 3 built-in routes | The panel. Each entry is { provider, model, role? }. Capped at 8. |
synthesis | google / gemini-3.6-flash | The chair route, or false to never synthesize. |
maxTokens | 2048 | Generation cap per member and for the chair. |
timeoutMs | 120000 | Deadline per call, fused with the caller's own cancellation. |
The built-in defaults exist only so the plugin loads without configuration. Set members to routes you
actually have — the defaults name specific providers that may not exist in your deployment.
Tool arguments
The model calls council with:
question(required) — Members see only this text, not the surrounding conversation, so it must be self-contained. The tool description tells the model as much; if answers look context-starved, this is why.members(optional) — Override the panel for one call. Each entry takes an optionalrole("security reviewer", "performance skeptic"), which is shown to the chair.synthesize(optional, defaulttrue) — Set false to read the raw answers without a chair pass.
It returns { question, answers[], synthesis? }, where each answer carries provider, model, ok,
elapsedMs, and either text or error. Synthesis is skipped when fewer than two members succeed —
there is nothing to reconcile a lone answer against.
Cost
One provider request per member, plus one for the chair. A five-member panel is six requests. The tool description tells the model to reserve it for consequential or contested questions rather than routine lookups, but on metered providers it is worth watching.
Relationship to the upstream project
This is a community plugin, not part of the harness. DeepSeek Harness
does not accept external pull requests
at this stage and instead points contributors at building plugins and tagging them dsh-plugin — which is
what this is. The upstream project's own words: "We do not believe that packages in the official
repository are inherently more important than packages created by the community."
License
MIT