跳到主要内容
路径文档

数据与隐私

一句话版:源码版默认以 FEEDBACK_ONLY 在用户提交反馈时分享会话遥测;DeepSeek 请求默认附带插件包名/版本,额外 Session 日志上传默认关闭。三个开关彼此独立。

一、遥测(默认反馈门控)​

官方源码 packages/bundle/base/cordis.patch.yml 默认 FEEDBACK_ONLY,由 DSH_TELEMETRY_MODE 覆盖。普通对话不会持续导出 OTel 日志;提交 /feedback 时分享相应日志后缀:

  • 内容:会话日志的原始副本:用户/助手消息全文、工具参数与结果、系统提示词、本地 session.cwd 路径
  • 节奏:批量导出(scheduledDelayMillis 等由 OTel SDK processor 配置,可调)
  • 端点:部署层缺省 https://harness-telemetry.deepseeksvc.com/v1/logs(可用 DSH_TELEMETRY_OTLP_URL 覆盖;OTel 里 exporter.url 必填无默认)
  • 身份:匿名 user.id(见下)

三种模式​

session-telemetry-otel 的 mode 决定遥测 seam 跟随会话事件、只在记录反馈时回放、还是保持本地:

mode上报什么
FULL显式选择后,每个投影 record(含 lifecycle ops)立即交给 OTel SDK
FEEDBACK_ONLY出厂组合默认。每个 feedback/record 回放、投影、redact 该事件前的日志后缀;之后 record 等下一个 feedback,没有就留本地
DISABLED不构造任何 pipeline,无 record 出进程;feedback 留在本地会话日志

上传模式(FULL / FEEDBACK_ONLY)都要求 exporter.url(无默认、必须能解析为 http(s));DISABLED 下 exporter 可省略、被忽略。三种模式共享同一个 sharing 披露(full / feedback-only / disabled),/feedback 确认据此报告会话如何被共享。

exporter 配置​

# 部署层组合里按 id 覆盖(见 配置)
- id: session-telemetry-otel
name: '@deepseek-ai/dsh-session-telemetry-otel'
config:
mode: FULL
shutdownTimeoutMillis: 3000 # 可选,DSH 外层关闭截止,默认 3000ms
exporter: # 原样传给 OTLP/HTTP log exporter
url: https://collector.example.com/v1/logs
headers:
authorization: !!js `Bearer ${process.env.OTLP_TOKEN}`
processor: {} # 可选,原样传给 BatchLogRecordProcessor

exporter 与 processor 都整块透传给 SDK:headers、timeoutMillis、compression、keepAlive 等到达 exporter;批量、导出节奏(scheduledDelayMillis)、重试、队列上限、持续失败下的丢失策略都是 SDK 行为,经 processor 调。字段映射:time → timestamp/observedTimestamp,severity → severityNumber/severityText(INFO 9 / WARN 13 / ERROR 17),body → 结构化日志体,attributes 原样;接收端按 (session.id, event.seq) 去重并可按严重度告警。

seam 不带 redaction 规则:没有 session-telemetry/record 监听器时,上传的是原始捕获副本。跨信任边界部署需自挂 redaction 规则(见 会话系统)。FULL 在 append 时 redact;FEEDBACK_ONLY 不保留遥测副本,记录 feedback 时用当前挂载的规则 redact。

关闭遥测​

export DSH_TELEMETRY_DISABLED=1 # 任意非空值,包括 0 / false

重启 dsh 生效,关闭不影响任何功能。也可用 OTel 的 mode: DISABLED。

DeepSeek 请求的两类新增元数据​

插件 / 配置默认含义
plugin-package-inventory-deepseek.enabledtrue官方 DeepSeek 请求的 dsh_plugin_packages 字段携带活动插件包名与版本
session-log-deepseek.enabledfalse显式启用后通过 dsh_session_log 发送规范会话日志的增量后缀

它们是 API 请求元数据,不是 OTel 导出,也不计入模型输入 token。停用 OTel 不会同时移除这些字段。以出厂行 id 关闭两项:

- id: plugin-package-inventory-deepseek
config:
enabled: false
- id: session-log-deepseek
config:
enabled: false

通过 dsh web --patch ./privacy.yml 加载上面的 overlay;用 --dump-config 检查有效组合。依据:packages/llm/plugin-package-inventory-deepseek/src/index.ts 与 packages/session/session-log-deepseek/src/index.ts 的 Config。

二、匿名用户 ID(.anonymous-user-id)​

  • 文件:~/.dsh/.anonymous-user-id,内容是一个随机 UUID
  • 生成规则:不从主机名、网卡、git remote 等可识别来源派生:纯随机
  • 删除该文件即重置身份(下次启动生成新 UUID)

同一个 id 在三处出现,让接收端无需自建身份即可关联:

用途形式
遥测OTel Resource 的 user.id,用于聚合统计与问题定位
反馈确认/feedback 确认文本里带同一值
DeepSeek 请求dsh-llm-deepseek 以 x-deepseek-harness-user-id 请求头发送

两点容易误解:

  • DSH_TELEMETRY_DISABLED 只停遥测导出,不影响反馈确认与 DeepSeek 请求头——关遥测不等于关身份关联
  • id 只作为 HTTP transport metadata 到达 DeepSeek,不进请求体、prompt、模型可见内容

进程内按文件路径 memoize 到进程生命周期;首次写用独占创建,并发失败方采用已持久化的胜者;写不进去(如 home 不可写)时退回进程本地 UUID,不阻塞遥测或反馈。

三、会话数据​

  • 所有会话日志在本机 ~/.dsh/sessions/(默认 zstd 压缩,当前 generation 为 session.v3.jsonl.zstd、旧会话保留 session.jsonl.zstd,两级 --<cwd>--/<id>/ 目录),含对话、工具调用、工作目录路径
  • 会话持久化在本地,删除目录即清除

想直接 head/jq 明文?配 compression: 'none' 或先 zstdcat(见 会话系统)。

四、凭据​

文件内容权限
~/.dsh/.credentials.yaml托管结构化凭据0600(0700 目录)
~/.dsh/.env环境层兜底权限自管

别把凭据 commit 进仓库;托管的 .credentials.yaml 由 DSH 原子落盘 0600,.env 是普通环境层、权限自负。

五、网络出口清单​

目标用途可否关闭
api.deepseek.comLLM 调用(chat-completions + anthropic/v1)换 provider 可绕开
harness-telemetry.deepseeksvc.com会话遥测DSH_TELEMETRY_DISABLED=1
自定义 provider 端点你配置的模型网关配置层面控制

六、最佳实践​

  1. 敏感项目使用前,评估遥测策略(或直接关)
  2. 注意第三方插件的网络行为(telegram/zotero 等有外发能力)
  3. .anonymous-user-id 删除即匿名重置,但不影响遥测开关
  4. 会话日志默认 zstd 压缩;备份/分享前脱敏

下一步​