dsh-web-speech-input
leozou320-ai
Voice-to-text for the DeepSeek Harness Web UI — live, editable, never auto-sends. | DeepSeek Harness 网页语音输入
AtropinolTT/dsh-guide-dog
Guide Dog for DSH — MiniMax multimodal plugin: image/video/music/speech generation & vision tools, hard-metric voice mode (host event-driven auto TTS, session-safe playback), voice input (mic → faster-whisper → composer), recorder page, two-layer settings.
PROJECT TOPICS
PROJECT README
A dynamic Cordis plugin that gives DeepSeek Harness multimodal superpowers through the mmx CLI (MiniMax):
guide_dog_vision / guide_dog_inspect)
describes images, so a model with no native vision input (e.g. DeepSeek) can
still review frontend designs, figures, screenshots, and generated images.image-01), video (MiniMax-H3 / Hailuo),
speech (MiniMax TTS), music (music-3.0), text (MiniMax-M3), and web search./guide-dog/media/<file> and rendered inline in the conversation tool cards
(<img>, <audio controls>, <video controls>), plus a Guide Dog
settings page with auth status, a speak tester, and a recent-media gallery.guide_dog_speak reuses your existing
audio-conversation and
speech-mmx skill pipelines
(text transform, CJK auto-detect, per-language voices, host playback),
and falls back to raw mmx speech synthesize when the skill scripts are absent.guide-dog-vision, order 110) tells the agent to auto-invoke the inspection
tools for any job needing visual checks, especially when the active model
cannot see images.| File | Purpose |
|---|---|
plugin-host.js |
Host half (tools, RPC, media route, prompt section) |
plugin-client.js |
Client half (tool cards + settings page) |
plugin-source.js |
Both halves concatenated for re-deployment |
README.md |
This file |
Create the plugin (host + client halves in ONE package):
cordis_define plugin.kind=new, idPrefix=gdog
code.host=<plugin-host.js> code.client=<plugin-client.js>
cordis_run <pluginId> <packageId> run
Approve the Client-half activation in the web UI (single check mark). The Host half (tools, route, prompt section) activates with it.
Verify: the model's tool list contains guide_dog_*, and the Settings →
Guide Dog page shows the mmx auth status.
After a harness restart the plugin is gone (dynamic plugins are process-local);
re-run the two commands above to restore it. plugin-source.js exists so you
can re-deploy without hunting through session history.
| Tool | Args | Returns |
|---|---|---|
guide_dog_speak |
text*, voice (auto), speed, language, playOnHost |
{ok, url, voice, bytes} mp3 |
guide_dog_image |
prompt*, aspectRatio, n, width, height, seed, promptOptimizer, watermark |
{ok, urls[], files[]} |
guide_dog_video |
prompt*, model (MiniMax-H3 default), image, subjectImage, duration, ratio |
{ok, url, taskId} mp4 (polls until done) |
guide_dog_vision |
image*, prompt |
{ok, answer} VLM description |
guide_dog_inspect |
image*, focus (general/frontend/figure/screenshot/ocr), prompt |
{ok, answer, focus} structured review |
guide_dog_voices |
language |
{ok, voices[]} |
guide_dog_music |
prompt*, lyrics, instrumental, vocals, genre, mood, model |
{ok, url} mp3 |
guide_dog_text |
message*, system, model, maxTokens, temperature |
{ok, text} |
guide_dog_search |
q* |
{ok, results[]} (max 10) |
* required
While the plugin runs, a system-prompt section instructs the agent:
guide_dog_inspect (structured) or guide_dog_vision (general) on the
produced image file before finalizing — never claim to have seen an image it
has not inspected./guide-dog/media/<file>; the agent
must include the returned url fields so the user can preview.guide_dog_speak.Example visual-check flow on DeepSeek:
1. (agent) create figure/screenshot file, e.g. chart.png
2. (agent) guide_dog_inspect { image: "chart.png", focus: "figure" }
→ structured review of axes/labels/readability/encoding
3. (agent) iterate the figure, re-inspect, then finalize with the url
4. (user) previews chart.png in the web UI card
<workspaceRoot>/.guide-dog/media (inside the session
workspace, so the workspace-write sandbox allows mmx to write there;
no permission escalation needed)./guide-dog/media with:jpg/jpeg/png/gif/webp/mp3/wav/m4a/ogg/mp4/webm),Accept-Ranges: bytes with real byte-range responses (video seeking),.index.json keeps metadata (prompt, voice, ts, kind) for the
settings gallery (guide-dog/list-media RPC). A corrupt index is rebuilt
from the directory.guide_dog_speak honors the exact pipeline of your two skills:
~/.agents/skills/audio-conversation/scripts/transform.py — markdown/code/URL
stripping (falls back to a built-in JS transform when absent).English_Trustworthy_Man / Chinese (Mandarin)_Gentle_Youth), same as the
skill env contract. Explicit voice overrides; language boosts accents.~/.agents/skills/speech-mmx/scripts/mmx_tts.py speak --input … --out …
(falls back to mmx speech synthesize).playOnHost: true the host
speakers play it too — one file at a time (previous playback is terminated
first), mirroring the skill's latest-only rule.Env vars of the skills that still apply when set in the dsh process
environment: AUDIO_CONVERSATION_VOICE(_EN/_ZH), AUDIO_CONVERSATION_SPEED,
AUDIO_CONVERSATION_DIR, AUDIO_CONVERSATION_NO_PLAY, AUDIO_CONVERSATION_KEEP_FILES,
TTS_GEN. Turn files keep the turn-NNN.mp3 naming convention.
Settings → Guide Dog (id guide-dog):
mmx auth status result with the key masked (sk-c…xxxx); never
logged in full.guide-dog/voices), plays the
mp3 in the browser.| Method | Args | Returns |
|---|---|---|
guide-dog/speak |
{text, voice?, speed?, language?, playOnHost?} |
{ok, url, file, voice, bytes} |
guide-dog/list-media |
{limit?} |
[{name, kind, prompt, voice, ts, bytes, url}] |
guide-dog/auth-status |
— | {ok, method, source, keyMasked} |
guide-dog/voices |
{language?} |
{ok, voices[]} |
~/.mmx/config.json); the
plugin never reads or forwards it.subprocess service (players must outlive the
sandbox's --die-with-parent bwrap profile); each new playback terminates the
previous one.mmx not found / auth missing — tool returns {ok:false, error}; the
settings page shows the auth problem. Fix: npm install -g mmx-cli and
mmx auth login --api-key sk-… (or export MINIMAX_API_KEY=…).denied: true; keep media inside
the workspace (the plugin already does).MiniMax-H3 returns "TokenPlan 或 Credit 暂不支持 MiniMax-H3 系列模型" —
the account's MiniMax plan does not include the H3 model family. Use
model: "MiniMax-Hailuo-2.3" (legacy V1) or upgrade the plan. The plugin
surfaces the API error verbatim, so this is visible in the tool result.duration or different
model.--quiet changes per-command JSON shapes: speech voices prints a flat
array of voice-id strings, text chat prints only the reply content (so the
plugin runs text chat without --quiet), while auth status / search query
keep their objects.video generate --async always prints {taskId} (raw stdout write).content.url; the plugin downloads it with
curl. Legacy V1 tasks return file_id, downloaded via
mmx video download --file-id.image generate --out-dir, music generate --out,
speech synthesize --out, video download --out) may print nothing
parseable; the plugin treats exit 0 as success and verifies the file via
fs.stat.CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。