launchmaniac/dsh-media-tools ↗★ 0
@launchmaniac/dsh-media-tools
OpenRouter image, video, and speech generation as dsh tools, shipped as an out-of-tree profile bundle
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:launchmaniac/dsh-media-tools说明文档
阅读完整 README ↗Configuration
Three places, in increasing precedence.
1. Per call, in the conversation. generate_image takes an optional model, so you can say "generate a logo with recraft/recraft-v4-vector" and it applies to that call only.
2. $DSH_HOME/settings.yaml under a media-tools key. This is the live one — a change takes effect on the next tool call, with no restart:
media-tools:
imageModel: black-forest-labs/flux.2-pro
The Settings dialog's Open configuration file button reaches this file. The bundle registers its schema through installSettingsSection, so the values are validated on write. It does not yet appear as a card in Settings → Plugins: that needs a browser half declared with dsh.client, and the build preset for client bundles is not published outside the harness monorepo.
3. Your profile's cordis.patch.yml — the deployment default everything else layers over:
- id: media-tools
name: "@launchmaniac/dsh-media-tools"
config:
imageModel: bytedance-seed/seedream-4.5
videoModel: bytedance/seedance-2.5
# A voice-requiring model must be given one, or every call 400s.
speechModel: google/gemini-3.1-flash-tts-preview
speechVoice: Kore
outputDir: ./media
videoTimeoutMs: 900000
| Key | Default | Meaning |
|---|---|---|
apiKeyEnv | OPENROUTER_API_KEY | Environment variable holding the key |
baseURL | https://openrouter.ai/api/v1 | API root |
attributionTitle | deepseek-harness | Sent as X-Title |
attributionUrl | — | Sent as HTTP-Referer |
imageModel | bytedance-seed/seedream-4.5 | Used by generate_image |
videoModel | bytedance/seedance-2.5 | Used by generate_video |
speechModel | fish-audio/s2.1-pro | Used by generate_speech |
speechVoice | — | Default voice, overridable per call |
transcribeModel | openai/whisper-1 | Used by transcribe_audio; deepgram/nova-3 and openai/gpt-4o-transcribe also work |
maxTranscribeBytes | 26214400 | Largest audio file sent for transcription |
outputDir | ./media | Where artifacts are written. Relative paths resolve against the session's working directory, so each workspace keeps its own; an absolute path pools everything in one place |
revealImages | false | Open each generated image in the desktop viewer |
requestTimeoutMs | 120000 | Per-HTTP-request budget |
videoPollIntervalMs | 5000 | Delay between video job polls |
videoTimeoutMs | 900000 | Total wait for one video job |
A patch replaces a row's entire config value rather than merging keys, so an override must restate every key it needs.