前置插件依赖(requires_plugins)
当一个插件需要另一个插件先装好才能工作时(典型:你的 ASR / MT 插件要靠另一个插件 提供
llama-server.exe这类推理运行时),在mod.json声明依赖。
声明
{
"id": "web.yourname.amd_hy_mt",
"type": "mt",
"requires_plugins": [
{
"id": "workshop.amd_llama",
"min_version": "1.0.0",
"reason": "提供 llama.cpp 运行时(llama-server.exe)"
}
]
}| 字段 | 必填 | 说明 |
|---|---|---|
id | 是 | 前置插件的 mod id;最多 8 条(超出丢弃) |
min_version | 否 | 要求的最低版本(semver) |
reason | 否 | 一句话说明为什么需要它(会显示给用户) |
简写:整条只写 id 时可写成字符串 —— "requires_plugins": ["workshop.amd_llama"]。
允许依赖官方 id(如
community.mt.haidass_143m),不受「保留段」规则限制。 重复 id 会去重。
宿主行为
| 时机 | 行为 |
|---|---|
| 启动扫描 | 依赖未就位(未安装 / 未启用 / 版本过低)→ 强制停用该插件(状态残留的兜底) |
| 启用开关 | 拒绝启用 + 浮层提示(含插件名、缺什么、怎么处理) |
| 选为 ASR/MT/TTS 引擎 | 拒绝(与启用同一道门禁) |
| 启动同传 | 就绪检查报 missing_dependency → 阻断 + 明确提示(不会只报"未找到 xxx 运行时") |
| 扩展工坊卡片 | 显示「需要前置插件:…」+ 一键 安装 / 启用 / 更新(只缺一个时) |
宿主不会自动安装前置插件(含代码的插件不允许静默安装)——用户点一下「安装」才会从当前渠道的 工坊下载。
怎么在前置插件的目录里取文件(重要)
❌ 不要硬编码兄弟目录名:从工坊安装时,目录名 = 插件 id (
<数据目录>/workshop/workshop.amd_llama),而你手放进extensions/的可能是下划线写法 (extensions/workshop_amd_llama)。按 id 查才两边都对。
from pathlib import Path
def _locate_llama_server(self):
# ✅ 推荐:宿主 API
dep_dir = self.host.plugin_dir("workshop.amd_llama") # 未安装返回 ""
if dep_dir:
exe = Path(dep_dir) / "llama" / "llama-server.exe"
if exe.exists():
return exe
# 备选:自己遍历(每项都带 source_path)
for m in self.host.list_installed_plugins():
if m.get("id") == "workshop.amd_llama":
exe = Path(m["source_path"]) / "llama" / "llama-server.exe"
if exe.exists():
return exe
return None配套建议:check_ready() 里找不到运行时就返回 (False, "model_not_ready", "需要先安装「llama 运行时」插件") —— 用户在启动前就能看到人话提示。
相关 API:host.plugin_dir(id) / host.has_plugin(id) / host.list_installed_plugins(type_filter), 见 会话与宿主状态。
与 requires_runtime 的关系
如果依赖的东西是几十 MB 的原生运行库,不要用「插件依赖插件」这条路,改用 宿主运行库(requires_runtime):宿主自带下载/校验/解压,插件只声明要哪个。
依赖链也生效:A requires_plugins B 且 B requires_runtime llama_runtime, 运行库没装时 A 同样被挡住,提示「需要前置插件:B 缺运行库:llama.cpp 运行库(未下载)」。
