DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins

@dr-co/dsh-speech-gate

Speech Gate

Speech-to-text gate for DeepSeek Harness: OpenAI-compatible API or a local command.

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add @dr-co/dsh-speech-gate@0.1.1
READMECompatibilityVersions

Compatibility and provenance

Speech Gate is published as @dr-co/dsh-speech-gate and currently resolves to version 0.1.1. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
npm
Registry updated
10/22/2026

Versions

0.1.1stable
10/22/2026

Related plugins

Loading related plugins…

Latest
0.1.1
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
25.9 kB
Files
5
Surface
any
License
MIT
Source
npm
GitHub
★ 0
Weekly downloads
0
Last push
10/22/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in models-usage.

Usage@linxin666/dsh-usageUsage statistics plugin for the dsh web GUI: per-provider balance and coding-plan quota detection plus a live token usage ledger, with a compact price glance card above the sidebar's Settings rowConnect Workbuddydsh-connect-workbuddyConnects locally signed-in WorkBuddy models (domestic and international versions) to DeepSeek Harness, automatically reading each model’s points multiplier from the upstream catalog on every refresh, with per-model image input toggles, multi-account switching, automatic account rotation from an accoClient Ui Model Capabilities@linxin666/dsh-client-ui-model-capabilitiesPer-model capability declarations (image input and reasoning efforts) for custom pi-ai providers, edited in place on the Models settings cards; writes the official llm-pi-ai settings namespace, no DSH source changes.Plugin Subscriptionsdsh-plugin-subscriptionsUse ChatGPT (Codex), Claude, Grok (X Premium), GitHub Copilot, and Google Antigravity subscriptions as DeepSeek Harness LLM providers, with OAuth login from the web Settings page

README

dsh-speech-gate

A configurable speech-to-text provider for DeepSeek Harness.

Harness keeps recognizers behind the speechToText service (@deepseek-ai/dsh-experimental-speech-to-text): a registry of named providers that a channel resolves before transcribing. This package registers one or more of them, so a host can offer a choice between a hosted model, a local whisper server and a local command without any channel knowing about it.

Two backends, one package:

backendwhat it doesgood for
apiPOST {baseUrl}/audio/transcriptions (OpenAI-compatible multipart)hosted models, whisper.cpp --server, faster-whisper-server, whisper-asr-webservice
execruns a command, prints the transcript on stdoutwhisper-cli or faster-whisper on the same machine
configured-modelsame call as api, but the endpoint and key come from the model connector the Host already hasa Host whose OpenAI/Mistral model is configured once, without pasting the secret twice

The provider never transcodes audio: the channel already hands it canonical 16 kHz mono PCM16 WAV, which is what every speechToText provider accepts.

Install

Pick whichever source fits the Host. All three install the same package, and dsh plugin records the result in the profile's package.json.

From npm — a released version, the default choice:

dsh plugin --profile <profile> add @dr-co/dsh-speech-gate        # latest release
dsh plugin --profile <profile> add @dr-co/dsh-speech-gate@0.1.0  # pinned, reproducible

From GitHub — no registry involved; useful when you want the current main:

dsh plugin --profile <profile> add github:unera/dsh-speech-gate            # main branch
dsh plugin --profile <profile> add github:unera/dsh-speech-gate#v0.1.0     # a tag
dsh plugin --profile <profile> add github:unera/dsh-speech-gate#206fb1e    # a commit

From a local checkout — while developing, file: follows your edits (re-run add after changing files, because pnpm copies the directory):

git clone https://github.com/unera/dsh-speech-gate
dsh plugin --profile <profile> add file:$PWD/dsh-speech-gate

The package ships no dsh.bundle, so dsh plugin add installs it as a plain dependency and the profile patch below is what actually mounts it — dsh plugin prints a warning saying exactly that.

Then mount it in the profile patch ($DSH_HOME/profiles/<profile>/cordis.patch.yml) next to the service it feeds:

- id: speech-to-text
  config:
    defaultProvider: openai-compatible
    language: ru
- insert:
    - id: speech-provider
      name: '@dr-co/dsh-speech-gate'
      config:
        providers:
          - id: openai-compatible
            backend: configured-model
            name: OpenAI gpt-4o-mini-transcribe
            location: cloud
            languages: [ru, en]
            language: ru
            model: gpt-4o-mini-transcribe
          - id: mistral-voxtral
            backend: configured-model
            name: Mistral Voxtral
            location: cloud
            languages: [ru, en]
            language: ru
            model: voxtral-mini-latest
          - id: whisper-local
            backend: api
            name: Local whisper server
            location: host-local
            languages: [ru, en]
            baseUrl: http://127.0.0.1:8080/v1
            model: whisper-1
          - id: whisper-exec
            backend: exec
            name: Local whisper command
            location: host-local
            languages: [ru, en]
            command: whisper-cli
            args: ['-f', '{input}', '-l', '{language}', '-nt']

Every entry becomes a selectable provider; with the optional @deepseek-ai/dsh-experimental-voice-input-bundle enabled, that choice (and the language) appears in the Web UI under Plugins → Voice Input. A flat config (backend, baseUrl, model, …) registers a single provider and is still supported.

Reusing the Host model connector (configured-model)

Typing the same secret twice is the main friction: the Host already holds an OpenAI or Mistral key for the chat model. backend: configured-model reuses it — the entry names only the transcription model, and the endpoint plus the credential name come from the table below:

providerendpointcredential
openaihttps://api.openai.com/v1OPENAI_API_KEY
mistralhttps://api.mistral.ai/v1MISTRAL_API_KEY
groqhttps://api.groq.com/openai/v1GROQ_API_KEY
- id: openai-transcribe
  backend: configured-model
  model: gpt-4o-transcribe

- id: openai-mini
  backend: configured-model
  model: gpt-4o-mini-transcribe

- id: voxtral
  backend: configured-model
  model: voxtral-mini-latest

Resolution runs once per transcription, against the providers the Host reports through llm.listProviders():

  1. an explicit provider in the entry;
  2. otherwise the model family — voxtral-* → mistral, whisper-large-v3* → groq, gpt-4o* / gpt-4* / whisper* → openai;
  3. otherwise, when the Host has exactly one of the known providers configured, that one;
  4. otherwise the transcription fails with the candidate list. It never guesses: the wrong credential would quietly bill the wrong account.

A provider that the model configuration does not include is refused with "has no model connector configured". configured-openai-model remains accepted as the earlier OpenAI-only spelling. baseUrl, apiKeyRef, apiKeyEnv and apiKeyFile still override anything the table provides.

Requirements

  • DeepSeek Harness 0.2.1-rc.2 or newer (the version this was tested on), Node 22+;
  • the speechToText service mounted in the profile — @deepseek-ai/dsh-experimental-speech-to-text;
  • for configured-model: the matching model connector configured in the Host;
  • for exec: the local binary the entry names.

Agent instructions

For an agent wiring this up on a Host, in order:

  1. dsh plugin --profile <profile> add github:unera/dsh-speech-gate # or @dr-co/dsh-speech-gate from npm once published (or file:/path/to/checkout while iterating).
  2. In $DSH_HOME/profiles/<profile>/cordis.patch.yml, mount the service row and insert this plugin — copy the example above. If a bundle already inserts speech-to-text, override that row (- id: speech-to-text) instead of inserting a second one.
  3. Point defaultProvider at one of the entry ids (a name that is registered, otherwise the service fails the first call explicitly).
  4. dsh --profile <profile> --dump-config | grep -A30 speech to confirm the composition, then restart the server so new plugin code loads.
  5. Verify with a canonical 16 kHz mono PCM16 WAV, e.g. ffmpeg -i in.ogg -ar 16000 -ac 1 -f s16le out.pcm plus a 44-byte header, or by sending a voice message in a channel that feeds speechToText.

Troubleshooting: speech API key is unavailable (<REF>) means the Host has no credential under that name — configure the model connector or set apiKeyRef; cannot tell which provider serves model means two known providers are configured and the model family is not distinctive — set provider.

Configuration

fieldbackendmeaning
idbothprovider identity shown to the host (default: openai-compatible / local-command)
namebothhuman-readable label
locationbothcloud or host-local
languagesbothaccepted language hints (default [ru, en])
languagebothlanguage sent when the caller omits one
baseUrlapiOpenAI-compatible root, without the trailing slash
modelapi, execmodel name ({model} is available in args)
apiKeyRefapicredentials reference resolved through ctx.credentials
apiKeyEnvapienvironment variable with the key
apiKeyFileapifile containing the key
extraFieldsapiextra multipart fields
commandexecexecutable
argsexecargument list; {input}, {language}, {model} are substituted
stripTimestampsexecdrop leading [00:00.000 --> …] markers (default true)

The key is resolved in this order: apiKeyEnv, then apiKeyRef, then apiKeyFile. A local endpoint that ignores authentication needs none.

Development

npm test

Node 22+; no build step, the package ships as plain ESM.

License

MIT