DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-plugin-audiolib

y

dsh-plugin-audiolib

Manifest valid★ 3

Ambient soundtrack for DeepSeek Harness, driven by agent state. Streams 100k+ cleared tracks from AudioLib.ai — a track always finishes, so a state change never cuts one off.

UI (client)hasBundlePatch

dsh-plugin-audiolib — an ambient soundtrack for DeepSeek Harness, powered by AudioLib.ai

dsh-plugin-audiolib

English | 中文

npm ci license

An ambient soundtrack for DeepSeek Harness, driven by the agent's own state. Music comes from AudioLib.ai — 100,000+ fully-cleared tracks, one API call per track.

The agent already publishes everything needed as session events: a turn opens, work is happening; every turn closes, the room goes quiet. This plugin turns that stream into sound.

A track is never interrupted by a state change. Turns open and close far faster than a song lasts, so cutting mid-track reads as noise instead of feedback. The state you are in when a track ends decides what plays next. Only an explicit music_stop cuts playback, because silence requested is silence owed.

Install

If you installed DSH with npx @deepseek-ai/dsh web — no global install, the CLI lives inside the profile — then plain dsh is not on PATH; the shell answers command not found. Reach it through npx instead, and enable pnpm first: DSH manages profile plugins with pnpm and refuses without it.

corepack enable pnpm
npx @deepseek-ai/dsh plugin --profile web add dsh-plugin-audiolib

corepack ships with Node, so this adds no third-party global install, and corepack disable pnpm reverses it. Already have dsh on PATH some other way? dsh plugin --profile web add dsh-plugin-audiolib works the same.

Restart — npx @deepseek-ai/dsh web — then open Settings → Plugins → Plugin configuration and paste your key into the AudioLib soundtrack card. It goes to the DSH credential store (~/.dsh/.credentials.yaml, mode 600), never into a config file, and takes effect on the next track without a restart.

Get a key at audiolib.ai — the free tier is 300 requests/month.

The environment works too, if you prefer it:

export AUDIOLIB_API_KEY=alp_your_key

The card's library pickers are read-only for now: DSH serves only built-in plugins' settings sections to the browser (an allowlist in dsh-host-apiproxy, which its own comment marks as deferred work). Set the libraries in your profile's cordis.patch.yml until that lifts. The key control is unaffected — credentials are not namespace-gated.

Playback

Tracks stream: playback starts on the first buffered bytes, the way the AudioLib URL is meant to be consumed. That needs a player that reads a URL — mpv or ffplay, whichever is on PATH:

brew install mpv        # or: apt install mpv

Without one, the plugin falls back to macOS's built-in afplay, which only reads local files. It then downloads each track ahead of the moment it is needed — a working fallback, but it spends several megabytes per track and stalls when switching libraries mid-session. Install a streaming player.

Configure

Override the row in your profile's cordis.patch.yml:

- id: audiolib
  name: dsh-plugin-audiolib
  config:
    workingLibrary: audio.focus
    idleLibrary: audio.ambient
FieldDefaultMeaning
apiKeyRefAUDIOLIB_API_KEYName of the credential holding the key — a reference, never the key itself
baseUrlhttps://api.audiolib.ai/v1/audioAudio endpoint
ambienttrueLet session events drive the soundtrack
workingLibraryaudio.focusPlays while a turn is open; '' for silence
idleLibrary''Plays once every turn has closed; '' for silence
exposeToolstrueGive the model music_play / music_stop / music_status
playerCommand[]Player argv; empty auto-selects. {url} declares a streaming player, {file} a file-only one
requestTimeoutMs15000AudioLib request deadline

The catalog has 25 libraries — audio.focus, audio.ambient, audio.cinematic, audio.jazz, audio.classical, audio.sleep, audio.meditation, audio.workout, audio.electronic and more. Any id the API accepts works; the full list ships in src/libraries.ts and in music_play's description.

Tools

  • music_play(library) — the model scores its own work. Takes effect at the next seam; starts immediately when nothing is playing.
  • music_stop() — stops now and stays silent until music_play is called again.
  • music_status() — reports the playing track plus the AudioLib plan, remaining calls, and rate limit. Every audio response carries a quota snapshot, so this costs no API call.

Both are ordinary registrations on ctx.tools, so they are available in Code Mode as await tools.music_play({ library }) too.

music_play's choice lasts as long as the work does: when the last open turn closes, the soundtrack returns to idleLibrary. An explicitly chosen library scores the stretch of work it was chosen for.

When a request fails, transient causes — network, 5xx, timeout, rate limit — back off and retry indefinitely, so the music resumes on its own. A bad key, an exhausted period, a missing player, or an unreadable response pauses instead; music_status reports which, and a quota pause lifts by itself when the period rolls over.

How it works

PieceExtension point
Activity trackingctx.on('session/event') — turn/start / turn/end, counted per session
Model controlctx.tools.register() with raw JSON-Schema definitions
Teardownctx.effect() — unloading the plugin kills the player and removes every temporary file

The placeholder in playerCommand decides the playback mode. {url} hands the AudioLib URL straight to the player, which buffers as it plays — nothing is written to disk and a track begins as soon as its API call returns. {file} means the player cannot stream, so the plugin downloads each track to a private temporary directory first and removes it afterwards.

Either way the plugin fetches one track ahead: at load, so the first turn opens on the downbeat, and again when a track starts, so the seam has no gap. AudioLib calls are cheap, so a prefetch discarded by a state change costs nothing worth optimizing.

Develop

npm install
npm run build

Load a source checkout into a running harness without installing it:

# audiolib.overlay.yml
- insert:
    - id: audiolib
      name: '/absolute/path/to/dsh-plugin-audiolib/lib/index.js'
      config:
        workingLibrary: audio.focus
dsh web --patch ./audiolib.overlay.yml

License

MIT

Compatibility

DSH 0.2.1-alpha.5: failedDSH 0.2.1-rc.1: failedDSH 0.2.1-rc.2: failed

Versions

Latest versionPublishedSize
0.1.0——
0.2.0——

Comments

Loading…

Similar plugins

dsh-music-player

by hey-ruomei

DeepSeek Harness music player plugin: search and stream legal music from Audius in the web UI, controllable by agent tools.

Terminal & ClientsManifest valid

★ 0

MIT

TypeScript

Aug 19, 2026

dsh plugin --profile web add dsh-music-player

Audio cues for DeepSeek Harness: a short synthesized sound when an agent needs confirmation, finishes a turn or a background job, or fails, with five sound packs, per-event toggles and volume, and do-

Notifications & IntegrationsManifest valid

★ 0

dsh plugin --profile web add dsh-audio-cue

by xxxxxxxyu

DSH (DeepSeek Harness) web plugin: plays a sound when the agent finishes replying (turn/end). Sound, volume and on/off configurable in Settings.

Manifest valid

★ 3

↓ 64/wk

MIT

TypeScript

Aug 14, 2026

dsh plugin --profile web add dsh-notify-sound

by Goothe13-gugu

用于Deepseek Harness的插件,让你的大模型边思考边唱歌。A plugin for Deepseek Harness (DSH) to play music or audio when your LLM is thinking.

Tools & CapabilitiesManifest valid

★ 0

MIT

JavaScript

Sep 23, 2026

dsh plugin --profile web add dsh-audio-cue

DeepSeek Harness Web 本地音乐播放器插件:会话视图「音乐」标签页,flac/mp3 等常见格式,单曲/列表循环,macOS Music 风格 UI

UI & ExperienceManifest valid

★ 2

MIT

JavaScript

dsh plugin --profile web add @heshuren/dsh-music-player

by ruazero

DSH dynamic Cordis plugin: play a real Windows system sound when an agent task finishes — custom sound, 4 intensity levels, auto escalation for long tasks, temporary mute.

Manifest valid

★ 0

MIT

JavaScript

Aug 20, 2026

dsh plugin --profile web add dsh-task-chime