DSH · 社区 TUI 插件​

dsh-TUI 上手

本指南按「安装 → 装技能 → 启动 → 配置 → 授权 → 寻优参数配置」六个环节组织,并附「启用完全访问 / 免审批」说明。技能以文件复制(cp)方式安装;授权通过 Shift+Tab

  • @deepseek-harness-tui/dsh-tui
  • ccch1mneyyy/dsh-TUI
适用版本窗口 dsh:0.1.5-rc.1,dsh-TUI 插件:0.10.1
环境前提 Node ^22.19>=2423.x 不支持)· pnpm ≥ 10 · 真实交互 TTY
一句话心智 DSH 技能没有注册表文件、没有安装命令、也没有 lockfile——cp -R 复制目录即完成安装。
6

上手环节:安装 → 装技能 → 启动 → 配置 → 授权→ 寻优参数配置​

3

权限档位:默认 / 计划模式 / 完全访问

OVERVIEW · 主线

全流程六个环节

六个环节依次覆盖安装、装技能、启动、配置、寻优参数配置与授权;每个环节均提供验证方式。​

  1. 安装安装两个全局包

    sh
    npm i -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui

    以一条命令安装 dsh CLI 与 dsh-tui 插件两个全局包;pnpm 用于首次启动时初始化 profile。

  2. 安装技能以文件复制方式安装

    sh
    mkdir -p ~/.dsh/skills
    cp -R /path/to/my-skill ~/.dsh/skills/

    技能目录由宿主自动监听,无需重启,在下一次模型步骤中即生效。

  3. 启动首次启动自动创建 profile

    sh
    cd ~/your-project && dsh-tui

    在项目目录启动 dsh-tui;首次启动自动创建 profile,无需手动执行 dsh plugin add。

  4. 配置模型三种方式任选

    会话内通过 /provider 配置路由与密钥、/model 选择模型(首次配置推荐);或修改 profile 补丁;或设置环境变量。

  5. 启用完全访问关闭审批拦截

    会话内按 Shift+Tab 循环至「完全访问」——即时生效,但仅作用于当前会话;如需每次启动均默认启用,见第七章。

  6. 寻优参数采集生成提交 SKILL 的 JSON

    用采集台(model-oob-perf-optimize-params.html)一次性采齐部署拓扑、业务建模与寻优目标,实时输出结构化 JSON,直接提交给寻优 SKILL。打开采集台:寻优参数采集台

SECTION 01

一、前置条件

安装前需满足以下四项要求,缺任一项均无法正常运行。

要求说明
Node.js^22.19>=2423.x 不支持(与 dsh 本体一致)
pnpm≥ 10首次启动初始化 profile 时需要。pnpm 9 会导致启动后立即退回 shell 且几乎无报错(issue #60)
终端真实交互 TTY不能用管道(tee 之类)或重定向 stdout 启动
凭证DEEPSEEK_API_KEY用官方端点只需这一个;自建/代理端点再加 DEEPSEEK_BASE_URL

本机环境提醒:安装全局包与插件请在普通终端执行。受管(AI 托管)终端会拦截 pnpm 的 symlink 操作。

SECTION 02

二、安装

一条命令安装 dsh 与 dsh-tui 两个全局包。

sh
# 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,否则容易超出兼容区间。

SECTION 03

三、以文件复制方式安装技能

本章信息密度较高,且多处涉及易错操作,建议逐节阅读。

3.1核心认知:技能即目录,以 cp 方式安装

DSH 技能没有注册表文件、没有安装命令、也没有 lockfile。宿主每次扫描固定目录,看到 <name>/SKILL.md 即予以收录。因此:

sh
cp -R <技能目录> ~/.dsh/skills/     # 安装完成

无需 dsh plugin add,也无需重启(详见 3.5)。

3.2两个落点

落点路径生效范围优先级 rank
用户级(最常用)~/.dsh/skills/<name>/所有项目400
项目级<项目根>/.dsh/skills/<name>/仅该项目(可提交 git 共享团队)100
用户级(Claude 系共享)~/.agents/skills/<name>/所有项目500
项目级(Claude 系共享)<项目根>/.agents/skills/<name>/仅该项目200

3.3目录形态(发现深度仅一层)

text
<root>/<name>/SKILL.md      ← 目录形态(可带 references/ scripts/ assets/)
<root>/<name>.md            ← 平铺单文件形态

3.4三种复制场景

场景 1

直接获得一个技能目录

场景 2

获得 zip,解压后顶层即为技能目录

场景 3

压缩包内嵌套层级过深(典型:从代码托管平台「下载当前目录」,包内为 <repo>-<branch>-<路径…>/skills/<技能名>/

共同点

最终都必须使 ~/.dsh/skills/<name>/SKILL.md 直接可见

sh · 场景 1
mkdir -p ~/.dsh/skills
cp -R /path/to/my-skill ~/.dsh/skills/
# 结果:~/.dsh/skills/my-skill/SKILL.md
sh · 场景 2
unzip -q my-skill.zip -d ~/.dsh/skills/
# 结果:~/.dsh/skills/my-skill/SKILL.md
sh · 场景 3
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 源。

本工作区内的两个 zip 恰好各对应一种场景
  • model-oob-perf-optimize.zip场景 2(顶层即为技能目录,unzip -d ~/.dsh/skills/ 即可)
  • ling-main-skills-model-oob-perf-optimize.zip场景 3(包内为 <repo>-<branch>/skills/<技能名>/,需先 find 定位)

覆盖升级前必须先删除旧目录:这是 cp 方式最常见的错误:

sh
# 错误:目标目录已存在时会形成嵌套 ~/.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/

3.5安装后的确认方式与生效时机

验证步骤:

sh
# 1) 检查目录结构(必须直接看到 SKILL.md,中间不得再隔一层)
ls ~/.dsh/skills/my-skill/

# 2) 确认 frontmatter 包含 name 与 description
head -6 ~/.dsh/skills/my-skill/SKILL.md

回到会话中执行 /skills,在列表中查找该技能:

显示形态含义
/my-skilluser-invocable 为真,可直接在输入行键入 /my-skill 调用
my-skill(无斜杠)仅模型可调用(disable-model-invocation: true),只能由模型自动调用

/skills全量目录浏览器(所列为模型可见技能的完整集合);选中后按 Enter 仅将 /my-skill 填入输入行,不会代为执行。

生效时机

cp 属于外部文件变更,由宿主文件监视器捕获(深度 1),下一个模型步骤刷新技能目录,因此无需重启。如需立即生效,/restart 最为可靠。

改内容 vs 改目录:

改动是否触发刷新
新增 / 改名 / 删除技能目录、改 frontmatter触发
改技能正文(SKILL.md 内文)不触发目录刷新;但每次加载都会重新读取正文,下次使用即为最新内容
references/scripts/assets/ 下的文件不触发刷新(不影响目录结构)

3.6frontmatter 写错的后果:技能会被静默丢弃

DSH 仅识别 namedescription 两个必填字段,其余为可选。字段写错不会显示错误,仅表现为技能不再出现。以下为本机实测结果:

写法结果
namedescription丢弃(日志: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/falseyes/noon/off1/0(不分大小写)

排错方法:界面仅表现为技能不可见,具体原因需查看 DSH 日志。加 DSH_TUI_DEBUG=1 启动并观察 stderr,或检查 DSH 运行日志中是否存在 skill file ... ignored

一个最小可用模板:

markdown
---
name: my-skill
description: 一句话说清它做什么、什么时候该用(这句话决定模型会不会调用它)
---

# my-skill

(正文:执行步骤、约束、示例)

3.7同名技能会静默冲突

实测表明:当项目级与用户级存在同名技能时,两层均会被扫描(rank 100 与 400 各一份),最终由注册表层按“近层遮蔽远层”的规则裁决,仅生效其中一个,且无任何提示

因此应避免在不同层级放置同名技能;升级用户级技能前,须先确认项目中不存在同名副本。

SECTION 04

四、启动

进入项目目录启动 dsh-tui,首次启动自动创建 profile。

sh
# 进入项目目录后启动(启动目录即 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。

SECTION 05

五、配置模型

三种配置方式,按使用场景选择;首次配置推荐方式 A

A交互式向导(推荐)

进会话后依次:

命令作用
/provider添加 / 编辑 / 删除模型路由
/model切换模型(运行中被拒绝:回合中不可切换)
/effort调整推理等级,←/→/effort <档位>
/login · /balance查看凭证状态 · 查询官方账户余额

/provider 里三种添加方式:

  1. 内置 provider:从 catalog 中选择(deepseekopenaianthropic 等),仅需填写 API Key;可选覆盖 baseURL(用于代理网关)
  2. 自定义 API 端点:填写路由名 / Key / baseURL / 协议(openai-completionsopenai-responsesanthropic-messages);向导将以草稿凭据探测端点公布的模型供勾选
  3. 订阅账号登录(OAuth):使用 ChatGPT / Claude / Grok 等订阅账号登录,无需 API Key@deepseek-harness-tui/dsh-auth 已作为依赖随包安装)

向导写两个产物:

产物位置权限
provider 路由~/.dsh/settings.yamlllm-pi-ai.providers.<路由名>
API Key~/.dsh/.credentials.yaml,引用名 <路由名大写>_API_KEY0600

与 dsh web 的 Models 设置页互通(同一 settings section)。会话记录中密钥仅显示为 ••••••

B声明式:修改 profile 补丁

$DSH_HOME/profiles/dsh-tui/cordis.patch.yml(顶层为 YAML 数组):

yaml
- id: dsh-tui
  config:
    provider: deepseek-official
    model: deepseek-flash
    effort: max

四个注意点:

C最简方式:环境变量

sh
export DEEPSEEK_API_KEY=sk-xxxxxxxx
# 自建/代理端点:
export DEEPSEEK_BASE_URL=https://your-endpoint/v1

当进程环境已存在同名变量时,/provider 向导会跳过写入,运行时直接从环境解析(删除时亦不触碰环境变量)。适用于 CI 与临时试跑。

优先级:环境变量 > profile 补丁 > /settings/model 的持久化选择存储于 ~/.dsh-tui/model.jsoneffort 存储于 ~/.dsh-tui/effort.json

SECTION 06

六、使用寻优参数配置(model-oob-perf-optimize)

在 dsh-TUI 完成配置与授权之后,用采集台把昇腾推理性能自动寻优所需的参数一次性采齐,实时生成可直接提交给寻优 SKILL 的结构化 JSON。

这一步解决什么

model-oob-perf-optimize 的寻优 SKILL 需要一组严格结构化的输入(部署拓扑、业务建模、寻优目标、软硬件版本等)。手工拼 JSON 易漏字段、易错格式;采集台把这些字段做成表单,实时校验并输出可直接提交的 JSON,避免来回返工。

6.1打开配置

采集台是一个独立的单文件 HTML(model-oob-perf-optimize-params.html),无需后端、无需联网,双击或在浏览器打开即用。本指南在线版也附带同款入口:打开寻优参数采集台

定位提醒:采集台只负责“采集参数并生成 JSON”,真正的寻优执行发生在目标机(昇腾环境);采集台本身不要求运行在昇腾机器上。

6.2选择运行模式

模式确认方式适用
智能模式零确认,首条消息一次性解析全部字段,选择点采用默认策略大多数情况;请求数量等字段必填,缺失会标 [自动补全]
离线推理全部字段必须由人工填写,Agent 不自行决定目标机无 Agent 协助、需全人工导出配置包

6.3填写部署拓扑(Phase 0)

选择部署形态,决定后续哪些字段必填:

6.4填写业务建模(Phase 2)

描述压测负载,标 * 为必填:

字段说明
测试工具 *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 会提示并降为固定值。

6.5填写寻优需求(Phase 3)

指定模型与寻优目标:

6.6离线推理:全字段人工输入(仅离线模式)

切到“离线推理”后,采集台展开独立的“全字段人工输入”区,要求逐项手填:

6.7获取并提交结构化 JSON

右侧“实时输出”面板随表单即时更新:

提交示例(示意)
一键寻优(单机)

{
  "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,即可进入自动寻优流程。

SECTION 07

七、启用「完全访问」

授权工具自动执行,不再弹出审批提示。

先对齐术语

dsh-TUI 的三个权限档位中并不存在名为“自动模式”的档位。日常所说的“自动模式”即第三档「完全访问」:沙箱限制完全放开且审批关闭,工具调用不再弹出审批提示。

7.1三个权限档位的说明

默认(基础档)

sandboxworkspace-write
approvalask

可在工作区内读写;越界操作将弹出审批。

计划模式

sandboxread-only
approvalask

仅只读探索,不修改文件、不执行命令。

完全访问别称:自动模式

sandboxdanger-full-access
approvalnever

不受限读写,无审批拦截

7.2原理:为何切换档位后下次又恢复默认

模式状态不保存于任何配置文件,而是由会话日志折叠推导得出——plan/modesandbox/modeapproval/policy 三类会话事件,取最后一次生效的值。新会话不存在这些事件,因而回落到 modes 数组的第 0 项(基础档)

由此得到两条结论:

(附带效果:循环起点取自“日志推导出的档”而非存储索引,因此手动执行 /plan 不会导致 Shift+Tab 档位顺序错乱。)

7.3方式一:会话内切换(仅作用于当前会话)

操作说明
Shift+Tab循环切换档位,底部提示「模式 → 完全访问」
/permission打开权限预设选择器(沙箱模式与审批策略)
/permission danger-full-access直接切换至完全访问
/permission status查看当前预设

7.4方式二:设为每次启动的默认权限档位(长期使用推荐)

yaml
# $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

要点:

7.5方式三:环境变量(临时,不写入磁盘)

sh
DSH_PERMISSION_MODE=danger-full-access dsh-tui

非 Windows 平台以该变量覆盖沙箱策略。沙箱限制已完全放开后,不再出现需要提升权限的场景,审批自然不再弹出——适用于 CI 或一次性试跑。

7.6折中方案:保留边界、关闭审批

不采用完全放开,仅关闭审批:将 7.4 中的 auto 档替换为:

yaml
- id: auto
  label: 半自动
  sandbox: workspace-write     # 保留工作区边界
  approval: never              # 不再打断操作

7.7风险与平台差异

完全访问意味着模型可任意读写文件系统、执行命令,且无任何审批拦截。配合第三方插件风险较高,建议先在容器 / VM 或专门的测试目录中验证通过后再放开。

Windows 情况相反:dsh-tui 在 Windows 的 profile 默认就是 danger-full-access + 免审批,出厂即处于“自动档”,需主动收紧,注意安全风险。

证据来源

官方 docs/configuration.mdmodes 字段说明 + 源码 src/sessionModes.ts(三档原子与 DEFAULT_SESSION_MODES)+ src/dsh-adapter/channel/mode-actions.ts(模式由会话日志折叠推导)。

SECTION 08

八、速查表

集中整理全流程常用命令,供随时查阅。

sh · 全流程
# 安装
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 检查整体健康

常见错误与规避

1cp -R 覆盖已有技能,形成嵌套目录,技能消失

目标目录已存在时,cp -R src ~/.dsh/skills/ 会生成 ~/.dsh/skills/my-skill/my-skill/;因发现深度仅一层,技能将静默消失。升级前一律先执行 rm -rf ~/.dsh/skills/my-skill

2frontmatter 缺少 name 或 description,技能被丢弃且界面无提示

DSH 仅识别 namedescription 两个必填字段。字段写错不会显示错误,仅表现为技能不再出现;原因需在 DSH 日志中检索 skill file ... ignored

3修改 cordis.patch.yml 后使用 /reload 不生效,须 /restart

/reload 不会应用补丁;profile 补丁变更后一律执行 /restart 或退出重进。

4自定义 modes 时保留内置 full 档,原子相同,后一档成为死档

新增的自动档与内置 full 档原子完全相同,匹配时永远命中靠前的条目,因而重复的那一档在 Shift+Tab 循环中永远无法到达。修改 modes[0] 时应一并删除原 full 档。