数据与隐私
一句话版:DSH 默认会上传会话遥测(可关),凭据与会话都存本机(0600 / zstd),匿名
user.id用于统计。本页讲清楚"什么出本机、谁能看到、怎么关"。
一、遥测(默认开启)
默认配置下会话遥测开启:
- 内容:会话日志的原始副本:用户/助手消息全文、工具参数与结果、系统提示词、本地
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。
二、匿名用户 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 压缩的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.com | LLM 调用(chat-completions + anthropic/v1) | 换 provider 可绕开 |
harness-telemetry.deepseeksvc.com | 会话遥测 | DSH_TELEMETRY_DISABLED=1 |
| 自定义 provider 端点 | 你配置的模型网关 | 配置层面控制 |
六、最佳实践
- 敏感项目使用前,评估遥测策略(或直接关)
- 注意第三方插件的网络行为(telegram/zotero 等有外发能力)
.anonymous-user-id删除即匿名重置,但不影响遥测开关- 会话日志默认 zstd 压缩;备份/分享前脱敏