前言¶
在 DeepSeek Harness(DSH)里,模型获取 API 密钥的常见做法是让用户把密钥粘贴到聊天中。这会把密钥写入会话日志、对话记录、所有后续请求以及任何导出的会话里,安全风险高。
dsh-secret-form 用一次性 Web 表单替换了直接粘贴。模型调用 secret_create 得到链接,用户在浏览器或手机打开表单,输入后保存;插件再将值写入凭证存储或文件;模型随后用 secret_result 获取状态与长度,但永远不会拿到明文值。
插件说明¶
- 名称:dsh-secret-form
- 维护者:unera
- 分类:admin-security
- 定位:提供一次性密钥链接,让模型获取密钥时不再把值暴露在会话记录中
- 仓库:https://github.com/unera/dsh-secret-form
插件声明 inject: ['tools', 'webServer'],依赖 Web GUI 服务,并在代理表面注册四个工具。
安装与启用¶
安装方式从 npm 或 GitHub 仓库选择。安装后通过 profile patch 挂载:
从 npm 安装¶
dsh plugin --profile <profile> add @dr-co/dsh-secret-form
从 GitHub 安装¶
# 指定版本标签
dsh plugin --profile <profile> add "git+https://github.com/unera/dsh-secret-form.git#v0.1.0"
# 指定 commit
dsh plugin --profile <profile> add "git+https://github.com/unera/dsh-secret-form.git#<sha>"
# 本地开发
dsh plugin --profile <profile> add file:$PWD/dsh-secret-form
挂载配置(YAML):
- id: secret-form
name: '@dr-co/dsh-secret-form'
config:
routePrefix: /secret
defaultTtlSeconds: 300
defaultLocale: en
publicUrl: https://dsh.example.org
参数说明:
- routePrefix:默认 /secret,必须以 / 开头
- defaultTtlSeconds:默认 300 秒,范围 30..3600
- defaultLocale:默认 en,支持 en|ru|de|fr|es|pt|zh|ja
- publicUrl:可选,用于代理后场景,否则返回监听器原点
四个工具¶
secret_create¶
创建一次性密钥表单,返回链接。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| ref | string | 是 | 目标引用:凭证引用如 OPENAI_API_KEY;文件目标为文件路径 |
| label | string | 是 | 表单标题,2~5 个词 |
| kind | ‘single’ | ‘multi’ | 是 | 单行输入或多行文本域 |
| description | string | 否 | 标题下的一句说明,最多 300 字符 |
| save | object | 否 | 默认 { "kind": "credentials" };文件目标为 { "kind": "file", "path": "…" } |
| ttlSeconds | integer | 否 | 默认 300,被限制在 30..3600 |
| allowEmpty | boolean | 否 | 默认 false,为 true 时允许空提交,报告为 empty |
| expect | string | 否 | 正则表达式文本,结果携带 matchesExpect 字段 |
| data | object | 否 | 最多 1 KB 的元数据,在工具结果中原样返回,页面不渲染 |
返回:{ uuid, url, expiresAt, data }。url 为绝对地址,由 Web 服务器的 getOrigin() 加上 routePrefix 与 43 字符令牌组成。
secret_result¶
查询表单状态,获取结果摘要。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| uuid | string | 是 | secret_create 返回的 uuid |
| waitSeconds | integer | 否 | 0..30,默认 0。大于 0 时等待状态从 pending 变为非 pending 后返回 |
返回:{ status, data, ref, label }。一旦有值提交,还会包含 length、lines、trimmed 以及 matchesExpect。status 可为:pending、saved、empty、cancelled、expired。提交的值不会出现在结果中。
secret_list¶
列出当前进程创建的所有表单,按创建时间倒序。
返回示例:
[
{
"uuid": "…",
"ref": "OPENAI_API_KEY",
"label": "OpenAI key",
"status": "saved",
"createdAt": "2026-10-21T12:28:30.263Z",
"expiresAt": "2026-10-21T12:33:30.263Z",
"data": {}
}
]
secret_cancel¶
取消未完成的表单。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| uuid | string | 是 | secret_create 返回的 uuid |
已完成的表单保持其当前状态。
Web 表面¶
路由与行为:
| 路由 | 方法 | 请求体 | 结果 |
|---|---|---|---|
<prefix>/<token> |
GET / HEAD | — | 表单或结果页 |
<prefix>/<token> |
POST | application/x-www-form-urlencoded,含 value、action(save 或 cancel)、隐藏字段 lang |
结果页 |
响应安全头:Cache-Control: no-store、Referrer-Policy: no-referrer、X-Content-Type-Options: nosniff、X-Frame-Options: DENY,以及 CSP:
Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline';
script-src 'unsafe-inline'; form-action 'self'; base-uri 'none'
表单页面语言:支持 en、ru、de、fr、es、pt、zh、ja。优先级:链接上的 ?lang=... > 浏览器 Accept-Language > defaultLocale。提交时保留用户起始语言,结果页使用相同语言。
结果页文案:
- 已保存
- 未存储(空提交)
- 已取消
- 链接已使用
- 链接已过期
- 链接无法识别
值的保存位置¶
凭证(默认)。通过 ctx.credentials.set(ref, value) 写入凭证存储,与适配器读取 apiKeyEnv 的来源一致,便于下次请求使用。
文件。在 save 中指定 { "kind": "file", "path": "…" }。扩展名决定格式(.yaml、.yml、.json、.env),其他扩展在创建表单时被拒绝,不会自动推断。
适用场景与注意¶
- 适合需要将密钥等敏感信息从会话中剥离的场景,如 API 密钥、认证令牌等。
- 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证(MIT)。
- 建议在生产环境使用代理或反向代理,并通过
publicUrl指明公网地址。
小结¶
dsh-secret-form 为 DeepSeek Harness 提供了一次性密钥链接机制,把密钥从会话记录中移除,只传递状态与长度信息。安装简单,配置项明确,适合需要严格管控敏感输入的开发场景。
目录页:https://www.skillhub.cn/plugins/unera/dsh-secret-form
GitHub:https://github.com/unera/dsh-secret-form