本指南按「安装 → 装技能 → 启动 → 配置 → 授权 → 寻优参数采集」六个环节组织,并附「启用完全访问 / 免审批」说明。技能以文件复制(cp)方式安装;授权通过 Shift+Tab。
0.10.1 的 peerDependencies 上界为 dsh 0.1.5-rc.1,与 npm 上 dsh 的 latest 恰好对齐。
^22.19 或 >=24(23.x 不支持)· pnpm ≥ 10 · 真实交互 TTY
cp -R 复制目录即完成安装。
上手环节:安装 → 装技能 → 启动 → 配置 → 授权
权限档位:默认 / 计划模式 / 完全访问
六个环节依次覆盖安装、装技能、启动、配置、寻优参数采集与授权;每个环节均提供验证方式。
安装安装两个全局包
npm i -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui
以一条命令安装 dsh CLI 与 dsh-tui 插件两个全局包;pnpm 用于首次启动时初始化 profile。
安装技能以文件复制方式安装
mkdir -p ~/.dsh/skills
cp -R /path/to/my-skill ~/.dsh/skills/
技能目录由宿主自动监听,无需重启,在下一次模型步骤中即生效。
启动首次启动自动创建 profile
cd ~/your-project && dsh-tui
在项目目录启动 dsh-tui;首次启动自动创建 profile,无需手动执行 dsh plugin add。
配置模型三种方式任选
会话内通过 /provider 配置路由与密钥、/model 选择模型(首次配置推荐);或修改 profile 补丁;或设置环境变量。
启用完全访问关闭审批拦截
会话内按 Shift+Tab 循环至「完全访问」——即时生效,但仅作用于当前会话;如需每次启动均默认启用,见第七章。
寻优参数采集生成提交 SKILL 的 JSON
用采集台(model-oob-perf-optimize-params.html)一次性采齐部署拓扑、业务建模与寻优目标,实时输出结构化 JSON,直接提交给寻优 SKILL。打开采集台:寻优参数采集台。
安装前需满足以下四项要求,缺任一项均无法正常运行。
| 项 | 要求 | 说明 |
|---|---|---|
| Node.js | ^22.19 或 >=24 | 23.x 不支持(与 dsh 本体一致) |
| pnpm | ≥ 10 | 首次启动初始化 profile 时需要。pnpm 9 会导致启动后立即退回 shell 且几乎无报错(issue #60) |
| 终端 | 真实交互 TTY | 不能用管道(tee 之类)或重定向 stdout 启动 |
| 凭证 | DEEPSEEK_API_KEY | 用官方端点只需这一个;自建/代理端点再加 DEEPSEEK_BASE_URL |
本机环境提醒:安装全局包与插件请在普通终端执行。受管(AI 托管)终端会拦截 pnpm 的 symlink 操作。
一条命令安装 dsh 与 dsh-tui 两个全局包。
# 1) 安装官方 CLI 与 TUI 插件(一条命令安装两个全局包)
npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui
# 2) 安装 pnpm(若尚未安装;首次启动用于初始化 profile)
npm install -g pnpm
# 或:corepack enable pnpm
版本兼容窗口:本插件 0.10.1 的 peerDependencies 上界为 dsh 0.1.5-rc.1,与 npm 上 dsh 的 latest 恰好对齐。升级 dsh 前应先行升级 dsh-tui,否则容易超出兼容区间。
本章信息密度较高,且多处涉及易错操作,建议逐节阅读。
DSH 技能没有注册表文件、没有安装命令、也没有 lockfile。宿主每次扫描固定目录,看到 <name>/SKILL.md 即予以收录。因此:
cp -R <技能目录> ~/.dsh/skills/ # 安装完成
无需 dsh plugin add,也无需重启(详见 3.5)。
| 落点 | 路径 | 生效范围 | 优先级 rank |
|---|---|---|---|
| 用户级(最常用) | ~/.dsh/skills/<name>/ | 所有项目 | 400 |
| 项目级 | <项目根>/.dsh/skills/<name>/ | 仅该项目(可提交 git 共享团队) | 100 |
| 用户级(Claude 系共享) | ~/.agents/skills/<name>/ | 所有项目 | 500 |
| 项目级(Claude 系共享) | <项目根>/.agents/skills/<name>/ | 仅该项目 | 200 |
<项目根> 即最近的含 .git 的祖先目录;若无 .git,则回退至当前 cwd。~/.dsh/skills 下的 .system 子目录会被忽略。<root>/<name>/SKILL.md ← 目录形态(可带 references/ scripts/ assets/)
<root>/<name>.md ← 平铺单文件形态
<name> 建议采用 kebab-case,即 /skills 中显示的名称。<root>/a/b/SKILL.md 不会被收录。这一点直接决定 cp 命令的写法(见下文)。直接获得一个技能目录
获得 zip,解压后顶层即为技能目录
压缩包内嵌套层级过深(典型:从代码托管平台「下载当前目录」,包内为 <repo>-<branch>-<路径…>/skills/<技能名>/)
最终都必须使 ~/.dsh/skills/<name>/SKILL.md 直接可见
mkdir -p ~/.dsh/skills
cp -R /path/to/my-skill ~/.dsh/skills/
# 结果:~/.dsh/skills/my-skill/SKILL.md
unzip -q my-skill.zip -d ~/.dsh/skills/
# 结果:~/.dsh/skills/my-skill/SKILL.md
unzip -q pkg.zip -d /tmp/pkg
find /tmp/pkg -name SKILL.md # 定位包含 SKILL.md 的目录
cp -R /tmp/pkg/some-repo-main-skills/my-skill ~/.dsh/skills/
find 输出中,取 SKILL.md 所在的目录(而非其父级或更高层目录)作为 cp 源。
model-oob-perf-optimize.zip → 场景 2(顶层即为技能目录,unzip -d ~/.dsh/skills/ 即可)ling-main-skills-model-oob-perf-optimize.zip → 场景 3(包内为 <repo>-<branch>/skills/<技能名>/,需先 find 定位)覆盖升级前必须先删除旧目录:这是 cp 方式最常见的错误:
# 错误:目标目录已存在时会形成嵌套 ~/.dsh/skills/my-skill/my-skill/SKILL.md,技能直接消失
cp -R /path/to/my-skill ~/.dsh/skills/
# 正确:
rm -rf ~/.dsh/skills/my-skill && cp -R /path/to/my-skill ~/.dsh/skills/
验证步骤:
# 1) 检查目录结构(必须直接看到 SKILL.md,中间不得再隔一层)
ls ~/.dsh/skills/my-skill/
# 2) 确认 frontmatter 包含 name 与 description
head -6 ~/.dsh/skills/my-skill/SKILL.md
3)回到会话中执行 /skills,在列表中查找该技能:
| 显示形态 | 含义 |
|---|---|
/my-skill | user-invocable 为真,可直接在输入行键入 /my-skill 调用 |
my-skill(无斜杠) | 仅模型可调用(disable-model-invocation: true),只能由模型自动调用 |
/skills 是全量目录浏览器(所列为模型可见技能的完整集合);选中后按 Enter 仅将 /my-skill 填入输入行,不会代为执行。
cp 属于外部文件变更,由宿主文件监视器捕获(深度 1),下一个模型步骤刷新技能目录,因此无需重启。如需立即生效,/restart 最为可靠。
改内容 vs 改目录:
| 改动 | 是否触发刷新 |
|---|---|
| 新增 / 改名 / 删除技能目录、改 frontmatter | 触发 |
改技能正文(SKILL.md 内文) | 不触发目录刷新;但每次加载都会重新读取正文,下次使用即为最新内容 |
改 references/、scripts/、assets/ 下的文件 | 不触发刷新(不影响目录结构) |
DSH 仅识别 name 与 description 两个必填字段,其余为可选。字段写错不会显示错误,仅表现为技能不再出现。以下为本机实测结果:
| 写法 | 结果 |
|---|---|
缺 name 或 description | 丢弃(日志:frontmatter requires name and description) |
| 完全没有 frontmatter | 丢弃(日志:missing YAML frontmatter) |
user-invocable: yesplease | 丢弃(日志:field "user-invocable" must be a boolean) |
user-invocable: yes / disable-model-invocation: no | 正常收录 |
| 合法布尔写法 | true/false、yes/no、on/off、1/0(不分大小写) |
排错方法:界面仅表现为技能不可见,具体原因需查看 DSH 日志。加 DSH_TUI_DEBUG=1 启动并观察 stderr,或检查 DSH 运行日志中是否存在 skill file ... ignored。
一个最小可用模板:
---
name: my-skill
description: 一句话说清它做什么、什么时候该用(这句话决定模型会不会调用它)
---
# my-skill
(正文:执行步骤、约束、示例)
实测表明:当项目级与用户级存在同名技能时,两层均会被扫描(rank 100 与 400 各一份),最终由注册表层按“近层遮蔽远层”的规则裁决,仅生效其中一个,且无任何提示。
因此应避免在不同层级放置同名技能;升级用户级技能前,须先确认项目中不存在同名副本。
进入项目目录启动 dsh-tui,首次启动自动创建 profile。
# 进入项目目录后启动(启动目录即 Agent 的默认工作区)
cd ~/your-project
dsh-tui
启动时自动执行等价于 dsh plugin --profile dsh-tui add @deepseek-harness-tui/dsh-tui,在 ~/.dsh/profiles/dsh-tui/ 创建 profile 并写入 cordis.patch.yml。因此不需要预先手动执行 dsh plugin add。
三个等价入口:
| 命令 | 说明 |
|---|---|
dsh-tui | 标准命令 |
dst | 短别名 |
dsh --profile dsh-tui | 长写法(等价) |
验证:dsh-tui --version 应有版本输出;进入会话后 /doctor 不应出现 FAIL;/status 应能显示 provider / model / cwd。
三种配置方式,按使用场景选择;首次配置推荐方式 A。
进会话后依次:
| 命令 | 作用 |
|---|---|
/provider | 添加 / 编辑 / 删除模型路由 |
/model | 切换模型(运行中被拒绝:回合中不可切换) |
/effort | 调整推理等级,←/→ 或 /effort <档位> |
/login · /balance | 查看凭证状态 · 查询官方账户余额 |
/provider 里三种添加方式:
deepseek、openai、anthropic 等),仅需填写 API Key;可选覆盖 baseURL(用于代理网关)openai-completions、openai-responses、anthropic-messages);向导将以草稿凭据探测端点公布的模型供勾选@deepseek-harness-tui/dsh-auth 已作为依赖随包安装)向导写两个产物:
| 产物 | 位置 | 权限 |
|---|---|---|
| provider 路由 | ~/.dsh/settings.yaml → llm-pi-ai.providers.<路由名> | — |
| API Key | ~/.dsh/.credentials.yaml,引用名 <路由名大写>_API_KEY | 0600 |
与 dsh web 的 Models 设置页互通(同一 settings section)。会话记录中密钥仅显示为 ••••••。
$DSH_HOME/profiles/dsh-tui/cordis.patch.yml(顶层为 YAML 数组):
- id: dsh-tui
config:
provider: deepseek-official
model: deepseek-flash
effort: max
四个注意点:
config 为整块替换而非深合并:所修改字段所在的 config 块将被整段覆盖,原依赖 base 继承的其他字段需一并重写。provider 与 model 必须同时配置才构成显式路由;只写一个不生效。/restart 或退出重进);/reload 不会应用补丁。cwd: !!js process.cwd():这会把工作区固定于启动子目录(issue #96)。默认解析为启动目录所在的 git worktree 根,通常无需处理。export DEEPSEEK_API_KEY=sk-xxxxxxxx
# 自建/代理端点:
export DEEPSEEK_BASE_URL=https://your-endpoint/v1
当进程环境已存在同名变量时,/provider 向导会跳过写入,运行时直接从环境解析(删除时亦不触碰环境变量)。适用于 CI 与临时试跑。
优先级:环境变量 > profile 补丁 > /settings。/model 的持久化选择存储于 ~/.dsh-tui/model.json;effort 存储于 ~/.dsh-tui/effort.json。
在 dsh-TUI 完成配置与授权之后,用采集台把昇腾推理性能自动寻优所需的参数一次性采齐,实时生成可直接提交给寻优 SKILL 的结构化 JSON。
model-oob-perf-optimize 的寻优 SKILL 需要一组严格结构化的输入(部署拓扑、业务建模、寻优目标、软硬件版本等)。手工拼 JSON 易漏字段、易错格式;采集台把这些字段做成表单,实时校验并输出可直接提交的 JSON,避免来回返工。
采集台是一个独立的单文件 HTML(model-oob-perf-optimize-params.html),无需后端、无需联网,双击或在浏览器打开即用。本指南在线版也附带同款入口:打开寻优参数采集台。
定位提醒:采集台只负责“采集参数并生成 JSON”,真正的寻优执行发生在目标机(昇腾环境);采集台本身不要求运行在昇腾机器上。
| 模式 | 确认方式 | 适用 |
|---|---|---|
| 智能模式 | 零确认,首条消息一次性解析全部字段,选择点采用默认策略 | 大多数情况;请求数量等字段必填,缺失会标 [自动补全] |
| 离线推理 | 全部字段必须由人工填写,Agent 不自行决定 | 目标机无 Agent 协助、需全人工导出配置包 |
选择部署形态,决定后续哪些字段必填:
描述压测负载,标 * 为必填:
| 字段 | 说明 |
|---|---|
| 测试工具 * | evalscope / vllm_benchmark / ais_bench,采集台会归一化为标准名(如 evalscope → evalscopeperf) |
| 并发数 * | 映射为 CONCURRENCY |
| 输入 / 输出长度 * | 支持固定值(4096)或范围(4096~8192) |
| 请求数量 *(智能模式) | 智能模式必填,缺失会标 [自动补全];离线模式可留空由公式推算 |
| 测试数据集 | 默认 random;Prefix 命中率 > 0 时仅 random 支持前缀构造 |
| 测试 / 服务寻优变量 | 格式 --参数 默认值=$[min~max](连续)/ $[min~max+step](步长)/ $[v1,v2,...](枚举);留空走甩手模式由 SKILL 推导 |
| Prefix cache 命中率 | 固定常量 0~1,不参与寻优;影响测试集构造与 KV 预算推导 |
ais_bench 限制:其 input_len / output_len 不支持寻优,若填写范围,SKILL 会提示并降为固定值。
指定模型与寻优目标:
切到“离线推理”后,采集台展开独立的“全字段人工输入”区,要求逐项手填:
右侧“实时输出”面板随表单即时更新:
一键寻优(单机)
{
"mode": "智能模式",
"topology": "单机标准",
"business_modeling": { "tool": "evalscope", "concurrency": "64", "input_len": "4096", "output_len": "1024" },
"optimization_requirement": { "weight_path": "/mnt/weight/llama-7b", "goal": "吞吐优先" }
}
把复制到的 JSON(或触发指令)直接提交给 model-oob-perf-optimize SKILL,即可进入自动寻优流程。
授权工具自动执行,不再弹出审批提示。
dsh-TUI 的三个权限档位中并不存在名为“自动模式”的档位。日常所说的“自动模式”即第三档「完全访问」:沙箱限制完全放开且审批关闭,工具调用不再弹出审批提示。
默认(基础档)
workspace-writeask可在工作区内读写;越界操作将弹出审批。
计划模式
read-onlyask仅只读探索,不修改文件、不执行命令。
完全访问别称:自动模式
danger-full-accessnever不受限读写,无审批拦截。
模式状态不保存于任何配置文件,而是由会话日志折叠推导得出——plan/mode、sandbox/mode、approval/policy 三类会话事件,取最后一次生效的值。新会话不存在这些事件,因而回落到 modes 数组的第 0 项(基础档)。
由此得到两条结论:
/permission 仅对当前会话生效,切换会话即恢复基础档;(附带效果:循环起点取自“日志推导出的档”而非存储索引,因此手动执行 /plan 不会导致 Shift+Tab 档位顺序错乱。)
| 操作 | 说明 |
|---|---|
| Shift+Tab | 循环切换档位,底部提示「模式 → 完全访问」 |
/permission | 打开权限预设选择器(沙箱模式与审批策略) |
/permission danger-full-access | 直接切换至完全访问 |
/permission status | 查看当前预设 |
# $DSH_HOME/profiles/dsh-tui/cordis.patch.yml
- id: dsh-tui
config:
provider: deepseek-official # config 为整块替换,原有字段需一并写全
model: deepseek-flash
modes:
- id: auto # 置于首位 = 启动即生效该档位
label: 自动
sandbox: danger-full-access
approval: never
- id: default
plan: false
sandbox: workspace-write
approval: ask
- id: plan
plan: true
sandbox: read-only
approval: ask
要点:
full 档:它与新增的 auto 档原子完全相同,匹配时永远命中靠前的条目,导致后一档在循环中成为死档(Shift+Tab 永远无法到达)。plan / sandbox / approval / permission;permission 可与 plan 并用,但与 sandbox、approval 互斥;未声明任何原子的条目将被丢弃。/restart 生效;/reload 不应用补丁。DSH_PERMISSION_MODE=danger-full-access dsh-tui
非 Windows 平台以该变量覆盖沙箱策略。沙箱限制已完全放开后,不再出现需要提升权限的场景,审批自然不再弹出——适用于 CI 或一次性试跑。
不采用完全放开,仅关闭审批:将 7.4 中的 auto 档替换为:
- id: auto
label: 半自动
sandbox: workspace-write # 保留工作区边界
approval: never # 不再打断操作
完全访问意味着模型可任意读写文件系统、执行命令,且无任何审批拦截。配合第三方插件风险较高,建议先在容器 / VM 或专门的测试目录中验证通过后再放开。
Windows 情况相反:dsh-tui 在 Windows 的 profile 默认就是 danger-full-access + 免审批,出厂即处于“自动档”,需主动收紧,注意安全风险。
官方 docs/configuration.md 的 modes 字段说明 + 源码 src/sessionModes.ts(三档原子与 DEFAULT_SESSION_MODES)+ src/dsh-adapter/channel/mode-actions.ts(模式由会话日志折叠推导)。
集中整理全流程常用命令,供随时查阅。
# 安装
npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui
npm install -g pnpm # ≥10
cd ~/your-project && dsh-tui
# 配置模型(会话内)
/provider # 添加路由与 API Key
/model # 选择模型
/effort # 调整推理等级
/login /balance # 凭证 / 余额查询
# 配置模型(环境变量,最简方式)
export DEEPSEEK_API_KEY=sk-xxx
export DEEPSEEK_BASE_URL=https://your-endpoint/v1 # 可选
# 权限:授权工具自动执行、不再弹出审批提示(见第七章)
Shift+Tab # 会话内循环切换档位,直至完全访问
/permission danger-full-access # 或直接指定权限预设
DSH_PERMISSION_MODE=danger-full-access dsh-tui # 临时生效(不写入磁盘)
# 永久默认:修改 cordis.patch.yml 的 modes[0](数组第一项即基础档位)
# 安装技能(以文件复制方式)
mkdir -p ~/.dsh/skills
cp -R /path/to/my-skill ~/.dsh/skills/ # 首次
rm -rf ~/.dsh/skills/my-skill && cp -R /path/to/my-skill ~/.dsh/skills/ # 升级
# 验证
ls ~/.dsh/skills/my-skill/ # 须直接看到 SKILL.md
head -6 ~/.dsh/skills/my-skill/SKILL.md # 须包含 name 与 description
# 会话内:通过 /skills 查找名称,/doctor 检查整体健康
目标目录已存在时,cp -R src ~/.dsh/skills/ 会生成 ~/.dsh/skills/my-skill/my-skill/;因发现深度仅一层,技能将静默消失。升级前一律先执行 rm -rf ~/.dsh/skills/my-skill。
DSH 仅识别 name 与 description 两个必填字段。字段写错不会显示错误,仅表现为技能不再出现;原因需在 DSH 日志中检索 skill file ... ignored。
/reload 不会应用补丁;profile 补丁变更后一律执行 /restart 或退出重进。
新增的自动档与内置 full 档原子完全相同,匹配时永远命中靠前的条目,因而重复的那一档在 Shift+Tab 循环中永远无法到达。修改 modes[0] 时应一并删除原 full 档。