Bundle
dsh-llm-multimodal
DSH 插件:提供文本 / 图像 / 视频 / 语音 / 音乐 五个生成工具,模型从 llm-pi-ai 自动发现,含 Settings UI (llm-multimodal namespace)。
- Source
- xiaokaizhou
- License
- MIT
- Updated
- Updated yesterday
Readme
# dsh-llm-multimodal
[](./README.md) [](./README.en.md) [](https://www.npmjs.com/package/dsh-llm-multimodal)
> **DSH 插件:在聊天中提供图像/视频/语音/音乐生成工具,基于 OpenAI 兼容 API。**
`generate_image` / `generate_video` / `generate_tts` / `generate_music` 四个多模态工具会自动从 `llm-pi-ai` 设置中识别可用模型:模型 id 包含 image / flux / dall / imagen / sdxl / realesrgan / juggernaut / photoreal / video / sora / seedance / kling / veo / runway / pika / wan / ltx / cogvideox / seedvr / musetalk / lipsync / tts / speech / voice / minimax / voxcpm / cosyvoice / music / song / lyric 等关键词时,工具即可使用。
## 安装
```bash
# 进入 DSH web profile
cd ~/.dsh/profiles/web
# 方式一(推荐):dsh 官方命令(自动写入 bundles 与 cordis.patch.yml)
dsh plugin --profile web add xiaokaizhou/dsh-llm-multimodal
# 方式二:pnpm 直装(需手动补一步,见下方说明)
pnpm add xiaokaizhou/dsh-llm-multimodal
```
`package.json` 位于 DSH profile 根目录:
- 默认路径:`~/.dsh/profiles/web/package.json`(macOS / Linux)
- Windows:`%USERPROFILE%\.dsh\profiles\web\package.json`
- 自定义路径:`$DSH_HOME/profiles/web/package.json`
- 如有多个 profile,对应路径为 `~/.dsh/profiles/<profile-name>/package.json`
方式二手动补全:在上面的 `package.json` 中添加:
```json
"dsh": {
"profile": {
"bundles": [
"dsh-llm-multimodal"
]
}
}
```
源码修改后需重启 `dsh web`。
## 支持模型
### 图像生成
支持任何 OpenAI 兼容的 `/images/generations` 端点,已适配:
DALL-E / Flux / Imagen / Midjourney / SDXL / Kandinsky
### 视频生成
支持 OpenAI Sora 风格 `/videos/generations` 与 Agnes 风格 `/videos`,已适配:
Sora / Seedance / Kling / Veo / Runway / Pika / Hunyuan Video / CogVideo
## 配置说明
1. 在「设置 > 模型」中添加一个 provider,`baseURL` 指向你的 API 网关
2. 在模型 id 中包含 image / video 关键词,插件会自动识别
3. 设置 `apiKeyEnv` 环境变量,或在 provider 配置中直接填写 apiKey
4. 重启 `dsh web`
示例 `llm-pi-ai` 配置结构:
```yaml
llm-pi-ai:
providers:
- id: openai
baseURL: https://api.openai.com/v1
apiKeyEnv: OPENAI_API_KEY
models:
- id: gpt-image-1
name: GPT Image
- id: agnes
baseURL: https://api.agnes.ai/v1
apiKeyEnv: AGNES_API_KEY
models:
- id: agnes-video-2.5
name: Agnes Video
```
## 使用方式
在 DSH 对话中直接调用工具:
- 生成图像:描述你想要的画面,助手会调用 `generate_image`
- 生成视频:描述你想要的视频内容,助手会调用 `generate_video`
工具会自动从配置中发现可用模型,无需额外参数。
### 语音合成与音色克隆
- 生成语音:`generate_tts`(文本 → 语音)与 `generate_music`(音乐/BGM/音效,共用 OpenAI 兼容 `/audio/speech` 端点)
- **模型按模态分离**:`generate_tts` 只用 TTS 类模型(id 含 `tts/speech/voice/minimax/voxcpm/cosyvoice`);`generate_music` 只用 music 类模型(id 含 `music/song/lyric`)。TTS 模型不会服务于 music,反之亦然
- **OpenAI 协议**:4 个多模态工具(image / video / tts / music)走 OpenAI 兼容端点;provider 默认 `apiProtocol: openai`;显式配置为其他协议(如 `claude`)时工具会在调用前拒绝并给出可操作提示。`generate_text` 不在此列,它走 harness 的 LlmRuntime(`ctx.llm.prepareCall`),由 harness 内部多协议路由处理
- 预设音色:`voice` 参数填 MiniMax 预设 id(如 `female-shaonv` / `male-qn-jingying`),或直接填已克隆的 voice_id
- 角色专属音色(克隆):传 `clone_audio`(参考音频:本地路径 / `file://` / http(s) URL / `data:audio` base64)+ `voice_name`(建议用角色名)
- 首次调用自动执行「上传音频 → 注册 voice_id → 用克隆音色朗读」
- 后续相同 `voice_name` 调用直接复用已克隆音色(持久化在 `~/.dsh/llm-multimodal-voices.json`),零额外网络开销
- 可选 `clone_voice_id` 自定义 voice_id;`output_format` 支持 `mp3` / `wav` / `pcm` / `aac` / `flac` / `opus`
- 需要 provider 支持 MiniMax 兼容的 `files/upload` + `voice_clone` 接口
## 限制
- 当前版本自动 provider 配置界面已暂停;工具通过 `llm-pi-ai` 设置自动发现模型
- 视频生成采用轮询,最长等待约 5 分钟
- 需要 provider 支持 OpenAI 兼容接口
## 打赏支持
若这个插件帮到了你,欢迎用下面的二维码请我喝杯咖啡。
<table>
<tr>
<td align="center">
<img src="https://raw.githubusercontent.com/xiaokaizhou/dsh-llm-multimodal/main/.github/wechat-pay.jpg" width="180" alt="WeChat Pay"><br>
<strong>微信支付</strong>
</td>
<td align="center">
<img src="https://raw.githubusercontent.com/xiaokaizhou/dsh-llm-multimodal/main/.github/alipay.jpg" width="180" alt="Alipay"><br>
<strong>支付宝</strong>
</td>
</tr>
</table>
## License
MIT
Install
dsh plugin --profile web add github:xiaokaizhou/dsh-llm-multimodal
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-llm-multimodal from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.