两个很具体的场景

第一个。你在 agent 客户端里贴一段日志排查问题,日志里带着一行 DEEPSEEK_API_KEY=sk-...。问题解决了,那句话还躺在会话历史里。

下次你把会话截图发群里,或者导出一份记录,key 就跟着走了。

第二个。一个会话干了几小时,上下文越堆越长,快到窗口上限。以前的办法是开个新会话,代价是前面聊出来的结论一起丢掉。

这两个坑不算新。DeepSeek Harness(下称 dsh)在 10 月 14 日的 0.2.1-alpha.3 里给了官方解法,原话是:

支持识别已发送消息中的密钥和令牌,并默认脱敏按需查看。 极简模式支持读取图片和自动压缩长对话,Web 与桌面端可通过 /compact 指令手动压缩上下文。

我把本机那份升上去,两条都跑了一遍。

升级:一条命令,附一个小坑

本机原来装的是 0.1.6-alpha.2,npm 全局装的。升级就一行:

npm i -g @deepseek-ai/[email protected]

版本号要写全,因为 npm 上的标签现在是这样:

alpha:  0.2.1-alpha.3
latest: 0.2.0-rc.2
next:   0.2.0-rc.2

latest 指向的反而是更早的 0.2.0-rc.2。直接 npm i -g @deepseek-ai/dsh 拿不到最新版。

装的过程里 npm 12 会拦下五个包的安装脚本:

npm warn install-scripts 5 packages had install scripts blocked because they are not covered by allowScripts:
npm warn install-scripts   @deepseek-ai/[email protected] (postinstall: node scripts/ensure-spawn-helper.mjs)
npm warn install-scripts   [email protected] (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)
npm warn install-scripts   [email protected] (install: node scripts/prebuild.js || node-gyp rebuild; postinstall: node scripts/post-install.js)

这里面有原生模块。这次我没放行,装完照常跑,终端和文件读写都正常。稳妥起见,建议按 npm 给的那一行放行后再装:

npm i -g --allow-scripts=@deepseek-ai/dsh-subprocess-local,koffi,node-pty,@google/genai,protobufjs @deepseek-ai/[email protected]

还有个建议。我把配置目录指到了别处(DSH_HOME=/tmp/dsh-021a3),验新版的同时不动日常在用的配置和会话。

装完确认版本:

$ dsh --version
0.2.1-alpha.3

实测一:密钥脱敏

我在输入框里发了一条消息,塞两个假凭据,一个 sk- 开头,一个 ghp_ 开头的 GitHub 令牌。

发出去之后,这条消息在对话里显示成这样:

sk-12345 后面跟一串星号,ghp_AbCd 也一样,末尾是一个眼睛图标。开头这一小段保留,其余全打码。

点一下眼睛,第一个凭据完整显示出来,第二个仍然打着码。它不是整条解锁,是按条独立的。

这个打码在会话历史里一样生效,回头截图或者导出记录,都不会带出明文。

实测二:/compact 压上下文

这轮我用真实数字测。方法是往工作区里放一个大文件,让 agent 读进来把上下文撑起来,再手动压一次。

第一轮读的是一份 54 KB 的变更日志,读完底部读数到 3%。执行 /compact:

对话里出现一行 compact · Compacted 12 history items (~18538 tokens),占用回到 2%。

第二轮换一份 224 KB 的材料,占用冲到 9%,再压一次,这次压掉 16 条历史、约 60107 个 token,占用回到 3%。

一个动作省下 1.8 万到 6 万个 token。压的是历史消息,结论和状态留着,接着聊没问题。

官方另外说明,极简模式下长对话会自动压缩,不用你惦记这件事。手动 /compact 是给你在长会话里主动腾空间用的。

顺手发现:headless 的 key 从哪来变了

这一条写脚本、跑 CI 的人要留意。同一个新版,headless 模式不带 key 跑:

$ dsh headless "只回答两个字:收到"
dsh: MISSING_CREDENTIAL: llm-deepseek: no API key for provider route "deepseek-official";
store DEEPSEEK_API_KEY through the credentials service (the web Models page writes it),
or export DEEPSEEK_API_KEY in the launching environment

把 DEEPSEEK_API_KEY 放进环境变量再跑,正常回答「收到」。

官方把这条列在「其他变更」里:Web 端和桌面端优先用已保存的凭据,headless 默认改走环境变量和 .env,不再读取已保存的密钥。以前靠凭据服务跑 headless 的脚本,升上来会撞到上面那个报错。

从 0.2 到现在,五版改了什么

先把版本线拉直:

0.1.6-alpha.2(本机原来)→ 0.1.7-rc.2 → 0.2.0-rc.1(09-28)→ 0.2.0-rc.2(09-29)
→ 0.2.1-alpha.1(10-03)→ 0.2.1-alpha.2(10-09)→ 0.2.1-alpha.3(10-14)

从 0.2 这一版开始捋。

0.2.0-rc.1 是 0.2 系列的第一个候选版,汇总了自 0.1.7-rc.2 以来的主要变更。自动化任务改成由可选插件包提供,不再是内置能力。

用 DeepSeek 账号模型的会话,不用额外配 key 就能联网搜索。工具调度异常后对话能继续,但已经执行、结果未知的操作会提示先核实副作用,不盲目重试。

图片失效后自动重传续上请求。无标题的历史会话统一显示「未命名」。Windows 那边新增沙箱权限诊断技能,能做带备份的权限修复。

0.2.0-rc.2 把命令行揣进了桌面端的菜单栏,装 dsh 命令、管插件都不用另装 Node 或 pnpm。

模型选择器在模型多的时候支持搜索。第三方模型目录升到 pi-ai 0.87.1,部分旧模型 ID 被移除,已保存的选择可能要重选一次。

从图形入口启动时补上了登录 shell 环境,工具路径和代理这些配置会话能读到。实验性加了异步问答模式,需要手动开。

0.2.1-alpha.1 增加实验性的 Claude Code Mods 兼容层。官方说得直白:现阶段主要是验证 Mods API 的能力大致是 dsh 插件的一个子集,不追求完整兼容。

插件管理页多了「让 Agent 创建插件」入口,保留草稿进创造模式,发出需求才开始干。Web 支持 --public-url,能挂在反向代理的子路径下。新增开发者工具组合包,能看会话原始日志、做聊天分组和正文的双向定位。

这一版也有破坏性变更:移除运行时 invariant 插件和各包的 ./invariant 导出,输入区统计扩展拆成 activity 和 usage 两个注册 ID,依赖这些的扩展要跟着改。

0.2.1-alpha.2 加了两个实验性插件。一个是思考过程机器翻译,可选 Bing、Google 或付费 DeepSeek Flash;另一个是 Git Worktrees,让 Agent 自己创建并进入一个独立的 checkout。

插件有了记录自己会话状态的接口。全局指令能读共享 agents 目录里的 AGENTS.md,目录用 DSH_AGENTS_HOME 指定。新增 working_directory 工具,TypeScript 和 Python SDK 都能读和切会话的工作目录。

Official 插件列表里多了 Claude Code 和 Codex 组合包的按需安装入口。修复里有一条跟中文用户关系不小:本地 SenseVoice 语音识别开 VAD 后录音开头被截断、首字丢失的问题修好了。

0.2.1-alpha.3 就是前面实测的那一版。除了密钥脱敏和上下文压缩,还加了 Web 版本机 HTTP 访问时登录 DeepSeek 账号、极简模式读图、子智能体可选独立的 Agent Preset、PTC 的 Node 执行环境可选 in-memory 模式。

模型设置的提示更清楚了,会标出凭据来源和检测状态,API Key 支持按需显示。修复那边解决了几件糟心事:重启后部分会话无法继续、切到 DeepSeek 时因历史消息兼容导致请求失败、插件更新后仍跑旧代码、应用意外退出后未完成的任务被误认为已完成。

串起来看,0.2 这一段的主线挺清楚。插件体系在往万物皆插件走,兼容层、组合包、插件自己的状态都在补齐;凭据和上下文这两件最容易被忽略的安全与成本问题被摆上台面;Agent 的调度、委派和恢复能力在一点点加厚。

最后一句

密钥脱敏这种能力,做起来不难,难的是有人愿意承认「用户真的会把 key 贴进聊天框」。上下文压缩同理,长会话是常态,不是例外。

你日常在用的 agent 客户端,会话历史里现在存着几把明文密钥?评论区聊聊。