CH 04 · 认识 Web UI
本章目标
上一章装好 dsh、填了 Key、选了工作区、跑通第一条任务。这一章停下来把界面看明白:每块区域是什么、设置面板里藏了哪些开关、权限三档各能干什么、轨迹视图怎么读。看完你会发现,CH 02 说的"每次运行可追溯"就摆在界面左上角——一个标签的事。
界面分区:先认个脸
这是我跑完第一个任务后截的全景界面,图上圈注了主要分区:

各块职责:
| 区域 | 干什么 | 说明 |
|---|---|---|
| 左侧 | 工作区列表 | 一个工作区一个项目目录,选工作区就是在这里挑(点开列表选一个,或"⊕ 新会话"新建);底部是设置按钮 |
| 中间 | 会话区 | 你发消息、Agent 干活、结果展示都在这;顶部是 对话 / 轨迹 两个标签 |
| 底部 | 输入区 | 发送按钮左侧是上下文占用圆环;再往左是模型、权限选型;下方是统计条 |
设置面板:左下角那个齿轮
界面左下角是设置。打开后左侧是功能分类——通用设置 / 模型 / 插件 / Agent 预设:

先看通用设置页:语言、外观、繁忙时回车键行为都在这,还有两块重要的——权限(选择新会话的默认权限模式,我这里是 Workspace Write)和 Agent 预设(当前"标准模式")。这里的 Agent 预设,就是 CH 02 说的四种运行模式(标准 / 代码 / 极简 / 创造)——在这里选的是"以后新建的会话默认用哪套插件组合"。注意下边那句说明:"对此后新建的会话生效。运行中的会话保持它开始时的预设。"——通用设置里的默认项只对新建会话生效,这条规则后面会反复碰到。
再看设置 → 模型:DeepSeek 卡片上填 API 密钥(填过就显示已配置),底下还能添加提供方(接 Anthropic、OpenAI 这类现成目录)和添加自定义提供方(接你自己的网关、本地模型,要填 Provider ID、API 地址、协议、密钥和至少一个模型)。改完模型路由立即生效,不用重启服务。密钥是只写的:保存后页面只显示脱敏描述符,明文只落在本地 $DSH_HOME/.credentials.yaml——就是 CH 03 说的那个路径。
权限三档:它到底能动你电脑哪些地方
这是 dsh 最该提前搞懂的东西。官方把这套文件沙箱定义成三种模式:
对照你界面里输入框左侧那个权限选型(选工作区后弹出的面板里):

三档大白话:
| 权限 | 能做什么 | 什么时候用 |
|---|---|---|
read-only | 只能读,一个字都改不了 | 只读分析、代码审查、纯问答 |
workspace-write(默认) | 工作区 + 系统临时区可写,工作区外动一下先弹窗问你 | 日常干活,绝大多数情况 |
danger-full-access | 全盘读写,无边界 | 系统维护这类确实要全局动的时候,切换前会二次确认 |
官方语义再补一句:workspace-write 的写入边界是"工作区根目录 + 后端承诺的临时区域";read-only 连写入都拒绝;danger-full-access 直接绕过隔离。注意权限只管文件系统效果——网络和进程可见性不在这套定义里。
日常认准默认的 workspace-write 就行,先上手熟悉,真遇到要全局动的情况再考虑第三档。
切换分两种情况,别混:
- 只想当前这个会话临时换个权限:在输入框里敲
/permission,选一个档位,只对当前会话生效。 - 想改默认值(以后新建的会话都用它):走设置 → 通用 → 权限改,只对之后新建的会话生效,正在跑的会话不动。
模型与推理等级
模型选择器里能看到已配置的模型(你填 Key 后自动就有了 DeepSeek 那几个)。有一条官方明确的规则:在模型选择器里选的模型,是给新会话当默认的;已经发过请求的会话会保留它开始时用的模型,不会跟着默认变(会话会记录自己的模型,改默认不会悄悄重写历史请求)。
所以想让不同会话用不同模型(日常轻活用 flash、难活切 pro/更强模型),直接开新会话就行,各会话互不干扰。
推理等级是另一个旋钮,DeepSeek 官方有四个档位:
| 档位 | 特点 |
|---|---|
off | 关闭思考,最快最省 |
low | 少思考,简单问答够用 |
high(默认) | 深度推理,复杂任务更准,也慢一点、贵一点 |
max | 最高强度,最难的活才用 |
日常默认 high 就行,嫌慢再往下调。每个档位到底影响什么、怎么改,CH 06 专门展开。模型变更同样是下次请求就生效,不用重启。
轨迹:CH 02 说的"可追溯"就藏在这里
还记得 CH 02 那句"每次运行可追溯"吗?看界面左上角——对话 / 轨迹两个标签并排,点轨迹,这一轮 Agent 的完整运行记录摊在你面前。看这张实测图:

怎么看这张图:
- 中间是一列时间线,ASSISTANT(思考/说话)和 TOOL(工具调用)交替出现,从上到下就是 Agent 实际干活的顺序。
- 每条 TOOL 行:左边是工具名(
pwsh/read/web_search),右边是实际发的参数和返回的关键结果。 - 点任意一条 TOOL,右侧面板展开这一步的详情:Summary(摘要)/ Payload(实际参数)/ Result(返回结果)/ Schema(这个工具的说明)/ Timing(耗时),还有 Status(Completed)和 Hierarchy。
- 顶部有 Duration / Turns / Calls 概览,还有搜索框可以按关键词搜步骤。
我这次任务里就能看到它真实踩坑的过程:先读配置、读文件,想用 pwsh 直接拉官方文档时 SSL 连接失败,它自己说了句"Outbound HTTPS from pwsh is blocked",然后改用 web_search 继续查——这些波折全记在轨迹里,这就是"可追溯"。
底部统计条是同一件事的另一面:
| 指标 | 含义 |
|---|---|
| 轮数 · 步数 | 这轮对话 Agent 一共干了多少步 |
| LLM 耗时 / 工具调用耗时 | 花在"想"和"做"上的时间 |
| 首 token 均耗时 · tok/s | 出字速度 |
| 缓存命中 | 输入 token 里命中上下文缓存的比例(见下) |
| 输入 / 输出 tok | 这轮喂给模型、模型吐出的 token 量 |
上下文缓存:命中率为什么能那么高
统计条里的"缓存命中"不是 dsh 自己的功能,背后是 DeepSeek API 的上下文硬盘缓存。官方做法:把预计会重复使用的内容缓存在分布式硬盘阵列里,下次输入里出现重复部分,直接从缓存读、不重新计算——既降延迟又降成本。
缓存命中的输入 token 计费比未命中便宜得多。拿 deepseek-v4-flash 举例,官方当前定价:缓存命中输入约 0.1 元/百万 token,缓存未命中输入约 1.5~3 元/百万 token(分空闲/高峰时段)——命中缓存的那部分输入,成本只有未命中的零头。
为什么一个会话里命中率会那么高?因为同一会话每一步的输入,都包含前面的系统提示、工具定义和已发生的对话——这些是稳定的重复前缀。第一次调用没有缓存可命中,但从第二次调用起,前面那段就被缓存了。我这次任务输入 160K token、命中率很高,等于只有一小部分按未命中全价算。这也是为什么 Agent 任务尽量在同一个会话里做完——长会话越往后越省。
上下文占用圆环
输入区发送按钮左侧那个圆形的指示器,显示的是当前会话上下文窗口的占用比例。看实测:

上图圆环显示"上下文已用 2%"——会话刚开,几乎没占。上下文窗口是有限的,Agent 跑长任务会把对话历史、工具结果越攒越多,圆环就是让你直观看到还剩多少空间。等它快满了,你有三个选择:开新会话、让 Agent 收尾总结,或者直接在输入框敲 /compact——它会把当前对话的关键信息整理成一份更紧凑的摘要,接下来 AI 带着这份摘要继续干活,等于给会话"减减肥",不用从头再来。
把第一次任务跑完整
官方 README 给的入门示例任务是这句:
Summarize this repository and identify its main packages.
翻译过来就是你上一章跑的那句:总结一下 DeepSeek harness 这个仓库,指出它的主要模块。所以你已经跑过官方示例了。
跑的时候留意界面怎么"摊开"过程:Agent 先注入上下文、规划,然后调用工具(读文件、跑命令、查资料),每一步都可见;需要审批的动作弹窗问你。跑完切到轨迹标签回放一遍,再对照统计条看数字——第一次任务通常输入很大(我这次 160K token),但缓存命中高,实际成本很低。
这一章你学到了什么
能自己完成下面几条,就算过关:
- [ ] 能说出 Web UI 界面各区域(左侧 / 中间 / 底部)是什么,以及在哪选工作区
- [ ] 知道设置面板的分类(通用设置 / 模型 / 插件 / Agent 预设),且"默认项只对新会话生效"
- [ ] 能说清权限三档
read-only/workspace-write/danger-full-access的区别,以及为什么日常用第二档 - [ ] 知道
/permission是当前会话临时换权限,设置 → 通用 → 权限 才是改默认值 - [ ] 知道模型选择器选的是新会话默认,已跑过的会话保留原模型
- [ ] 会读轨迹视图:ASSISTANT / TOOL 时间线 + 右侧详情面板 + 统计条
- [ ] 能解释"缓存命中"是什么,以及为什么长会话命中率会高
