dsh-tri-model
把多个厂商的模型接进同一条流水线:规划 → 执行 → 审查 → 自动返工。地址、密钥、协议、模型与层级全部在 DSH 设置里改,改完下一次调用就生效。
这是一个 DSH 原生插件(bundle),不是 MCP 连接器:Host 半边注册四个工具,Client 半边在设置面板里画一整页。
流水线:规划 → 执行 → 审查 → 返工
在设置面板里配,四个工具 + /tri 直接用
装上
# 从 npm
dsh plugin --profile desktop add dsh-tri-model
# 或者指向本地目录(改代码时用,node_modules 里会是软链)
dsh plugin --profile desktop add "file:D:\path\to\tri-model"
--profile 换成你自己的 profile 名(桌面版是 desktop)。装完会标 restart-required,重启 DSH 后生效。
在哪配置
设置 → 多模型协同(排在「插件」之后)。三段:
| 段 | 干什么 |
|---|
| 端点 | 地址 + 协议(openai / anthropic / gemini)+ 密钥 + 可选路径覆盖 |
| 模型 | 显示名、真实模型名、挂哪个端点、能力上限(caps) |
| 层级 | 顺序、类型(plan / execute / review / judge / route / custom)、用哪个模型、返工门禁 |
| 全局 | 返工轮数上限、单次超时 |
密钥只写进 DSH 凭据库(引用名形如 tri-model.<端点 id>),设置文件里不留明文。想让某个端点用环境变量,给端点加 envKey 即可。
配端点和模型时的几个省事设计:
- 点「+ 添加端点」先选供应商(17 个预设:火山方舟的两套入口、DeepSeek 官方、智谱 GLM、Moonshot、阿里百炼、硅基流动、百度千帆、OpenAI、Anthropic、Gemini、xAI、Mistral、Groq、OpenRouter、本地 Ollama、自建/其他),地址、协议、路径覆盖一次填好,密钥引用也跟着生成。
- 「真实模型名」是一个可输入的下拉:框里直接打字照样生效,点右侧
▾ 或聚焦输入框会列出这家供应商常用的模型 ID(deepseek-v4.1-flash、kimi-k3.1-pro 这种小写带版本号的写法),选一条就填进去,省得记 ID。内置候选只放实际调通过的 ID(目前只有火山方舟 plan 入口那一套),别的供应商不靠猜——直接发 /tri-models 问它要。
- 卡片默认折叠,一行摘要就够看:名称、协议、地址、密钥是否已配(端点);名称、挂的端点、能力标记(模型);序号、类型、用哪个模型、返工门禁(层级)。点标题展开改字段,段头有「展开全部 / 收起全部」。
- 下拉里选模型/端点时会带上显示名(
Kimi K3.1 Pro · kimi-pro),两个同类模型不会混。
- 标识(
id)跟着名称自动生成(DeepSeek 官方 → deepseek,重名自动加后缀),手改过就不再跟随。
- 删端点或模型时,如果还有下层在引用它,会先提示「N 个模型在用」,确认后才删——避免删完流水线静默断掉。
四个工具
| 工具 | 用途 |
|---|
tri_run | 按配置的层级跑一次协同,返回成品 + 逐层过程 |
tri_review | 只审不改:PASS/FAIL + 分数 + 问题清单 |
tri_config | 读写配置(show / validate / set-endpoint / add-model / add-layer / move-layer …) |
tri_doctor | 对每个模型发一条最小请求,报延迟、协议与降级情况 |
/tri 命令
在输入框里打 /tri,空格后面写任务:
/tri 给 tri-model 写一段 200 字的项目简介,面向不熟悉 DSH 的读者
命令把这条任务作为一条用户消息排进当前会话,由主 agent 调 tri_run 跑一遍。结果是一轮正常的对话:有工具卡(带计时、可中途取消),成品与「### 过程」逐层展开,留在上下文里可以继续追问。配置改动立刻影响下一次 /tri。
/tri-doctor 命令
改完密钥想确认通不通,不用翻设置页:
/tri-doctor
逐个模型发一条最小请求,把延迟表(✓ 模型 · 协议 · 毫秒 · 回包)贴进当前会话;后面跟一个模型 id 就只测那个。等价于让 agent 调 tri_doctor。
/tri-models 命令
模型 ID 别靠记忆。直接问服务商:
/tri-models # 所有端点
/tri-models ark-plan # 只看某个端点
插件用该端点的密钥请求它的 /models 接口(OpenAI 兼容、Anthropic、Gemini 各自走对应的路径与鉴权),把拿到的 ID 列表贴进会话,上限 200 条。端点没有 /models(比如火山方舟的 Coding Plan 入口)会如实报 404,这时按服务商文档填 ID;401/403 则说明密钥和端点对不上。
协议
protocol 与 baseUrl、apiKey 同级,不是默认值:
| 取值 | 接口 | 鉴权 |
|---|
openai(默认) | /chat/completions | Authorization: Bearer |
anthropic | /v1/messages | x-api-key + anthropic-version |
gemini | /models/{model}:generateContent | x-goog-api-key |
优先级:模型级 > 端点级 > openai。请求形状、响应解析、错误文案的差异全部关在 lib/protocols.js 里,引擎只看到统一的 {content, reasoning, finish, usage}。
目录
index.js Host 半边:Config、四个工具、密钥解析
client.js Client 半边:设置页(settings.section)
lib/config.js Config schema(schemastery)+ 默认流水线
lib/engine.js 调用、按报错降级、分段审查、流水线与返工
lib/ops.js tri_config 的动作 → SettingsPathOp
lib/protocols.js 三种协议的请求/响应适配
cordis.patch.yml Loader 行(id: tri-model)
locale/{zh,en}.json
lib/protocols.js 与 CodeBuddy 版 tri-model-plugin/mcp/protocols.mjs 同源;两边一起改比较省事。
已知边界
- 协议只覆盖三家;Bedrock、Vertex 这类「同一家、不同壳」的入口要各加一个分支。
- 层级目前严格顺序执行,没有扇出/并行。
- 审查层解析 JSON 时,模型不听话就按「文本里找 PASS/FAIL」兜底。
- 请求是一次性返回(
stream: false):跑的过程中只有工具卡在计时,没有逐字输出;一层慢就整条慢(settings.timeoutMs 控制单次上限)。
- 设置面板里没有「测试连接」按钮:浏览器的请求会被 CORS 挡住,宿主的 RPC 也只对编译期生成的 remote 开放,手写插件注册不了。面板底部因此常驻一行提示「保存后发
/tri-doctor」,连通性用 /tri-doctor 或 tri_doctor 验证。