前言¶
DSH 的内置插件 @deepseek-ai/dsh-session-log-deepseek 只处理走官方适配器的会话。如果你的模型渠道是 ollama-local、pi-ai 或任意 OpenAI 兼容端点,这段会话的日志永远不会被上传,官方收集端缺少这部分数据。
dsh-session-log-upload 就是要补这个缺口。它是第三方项目,维护者是 3418244301q-star,采用 MIT 许可证。它和内置插件共用同一个水位(watermark),因此两条路径共存、不重复。
这是什么¶
一句话:把由非官方渠道驱动的会话产生的规范会话日志,用你自己配置的 DeepSeek API 凭据,作为一次最小 chat 请求的顶层字段 dsh_session_log 发往 api.deepseek.com。
随日志上传的内容包含你的提问、模型回复、工具调用与工具返回、时间戳和会话标识。官方渠道的会话不由它上传,那部分仍交给内置插件。
它刻意选择了和内置插件相同的水位写法 session-log-deepseek/delivery-accepted,两条路径折叠同一个水位,谁先传谁推进,另一边自然跳过。代价是:属于官方窗口的那一段,只有内置插件能推水位,本插件推不动。
核心能力¶
只处理待传区间内出现过非官方 provider 的会话。判定依据是 request/header 事件的 data.header.config.provider。整段都是 deepseek-official 的会话交给内置插件。
上传方式不是直连 OTLP 收集端,而是借道一次最小 chat 请求,承载的仍是服务端本来就认识的字段 dsh_session_log,服务端不需要新增解析逻辑。这也是它与同类插件 yihefeikong-rgb/dsh-session-log-universal 的主要取舍:后者全量重传并各记一份水位,目标是覆盖面;本插件追求零重复。
触发档位三选一:manual 仅手动、deferred 收尾与空闲、realtime 每轮实时。默认 deferred 是为了不把每次 turn 都换成一次 HTTP 请求。deferred 档在 turn/end 后起 idleDelayMs 计时,期间有新事件就重置。
失败处理是至少一次语义:失败不写水位,会重试。单段超限只告警一次,水位不前移。全局限流超限后排队而非丢弃。
配置¶
cordis.patch.yml 里给出了默认值,enabled 默认 false,关着就是零网络活动。
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
false |
关着就零网络活动 |
mode |
deferred |
manual / deferred / realtime |
apiKeyRef |
DEEPSEEK_API_KEY |
走 ctx.credentials;取不到再退回同名环境变量 |
model |
deepseek-flash |
承载请求用的官方模型 |
maxBytes |
8388608 |
单段上限,与内置插件一致 |
idleDelayMs |
600000 |
deferred 档空闲判定 |
includeSeeded |
false |
是否也传 seeded 子会话(只传继承段之后) |
budget.maxRequestsPerHour |
60 |
全局限流,超限排队而非丢弃 |
retry.maxAttempts / baseDelayMs |
3 / 2000 |
指数退避重试 |
安装¶
README 没有给出写死的安装命令,只说它是 Host 插件,需要 dsh 的插件管理能力或 plugin_manager,安装到某个 profile。bundle 清单在 cordis.patch.yml,默认 enabled: false。
因此安装方式取决于你宿主的版本与插件管理方式。从 Release 拿包的话,每个 tag 的 Release 附 dsh-session-log-upload-X.Y.Z.tgz(npm pack 产物),可以直接 pnpm add <文件> 离线安装,旁边还有 SHA256SUMS-X.Y.Z.txt 可核对字节。
安装后它还带一个客户端注入部分,依赖 dsh-client-locale 和 dsh-client-ui-settings。宿主缺少这两个包时,设置行不会出现,且不报错。
版本要求:DSH 本体 dsh.engines.dsh: ">=0.2.1-rc.3",本机实测 0.2.1-rc.5;@deepseek-ai/schemastery 需要 ^3.18.4,用到 .volatile(),旧版会报 ...volatile is not a function。
有一个 semver 盲区值得注意:engines.dsh 写的是 >=0.2.1-rc.3,node-semver 只有在范围内存在相同 tuple 上的预发布比较符时才放行预发布版本。0.2.2-rc.1 因此会被排除。被排除不是报错,而是从市场的兼容筛选里静默消失。维护动作是每次 DSH 进新的预发布 minor,把 engines 改成覆盖该 tuple 的形式,例如:
"engines": { "dsh": ">=0.2.1-rc.3 <0.2.2-0 || >=0.2.2-rc.1" }
典型用法¶
启用入口在「设置 → 通用」。官方那行「在使用官方模型 API 时上传 Session Log」(order 90)下面新增一行 order 91:左边标题加说明,右边是模式下拉和一个开关。enabled 与 mode 都是 volatile,选完立即生效,不用重启。
启用有一道前置检查和一个风险确认:
- 点击开关时先查一次有没有可用的 API key,没有就取消启用,并在行里留一条「未检测到可用的 API Key」的提醒(带「重新检测」)。
- 有 key 时弹官方那个确认框(与「设置 → 权限」切「完全权限」同款组件),里面写明日志去向、不做脱敏、自动触发与合规责任,勾选「我已了解风险,并愿意继续」后才能点「启用上传」。关闭不需要确认。
部分档位的操作:
- 左侧文字区下方有「立即上传」按钮,只有档位选「仅手动」时可用,其它档位为灰色并给原因提示。点击后按顺序判定插件未开启 / 已有任务在跑 / 30 秒冷却 / 当前已是最新 / 未配置 key / 已上传 N 个会话,结果用一行内联文字显示,6 秒后自动消失。
manual档不注册定时器、不监听turn/end,零网络活动,启动扫描只打日志。realtime档每次turn/end入队,同会话重复入队合并。
启动后 5 秒扫一次活着的会话,补崩溃或强杀漏掉的收尾。卸载时清空队列与所有定时器。
适用场景与注意¶
适合已经在用非官方模型渠道、又想让这部分会话日志进入 DeepSeek 收集端、同时不希望与内置插件重复上报的开发者。
风险方面要逐条看清楚:
- 默认关闭,启用后才有网络活动;插件以自动化方式构造并触发请求,可能被官方或第三方服务认定为自动化请求,存在账户受限或服务条款风险。
- 不提供脱敏、合规审查、数据授权管理或内容过滤。上传前是否脱敏、是否取得授权、是否允许转发,全部由使用者自行负责。
- 依赖 DSH 官方 API 的当前行为,而该行为不是正式公开接口,可能随时变更、失效或被限制。
- 显式声明的失效场景包括:水位之后第一个请求走官方渠道且内置插件没在推水位时该会话会永久停摆;单条事件大于
maxBytes时一个请求都发不出去;API key 缺失或失效时完全不工作,且 401/403 不重试;会话已不活跃时启动扫描覆盖不到(非活会话没有Session对象,无法落水位)。 - 无法证明服务端真的入库,2xx 是唯一信号。
- 作者不对任何直接或间接损失承担责任,使用即表示你确认已阅读并同意相关条款、已取得必要授权、并自行承担合规与数据风险。
安装前应检查源码与许可证,并确认它依赖的内部契约在你当前的 DSH 核心版本上仍然成立。
结尾¶
这个插件的价值在于补齐而非替代:用与内置插件相同的水位和字段,把非官方渠道那段日志不重复地送回 DeepSeek。如果你要的是官方会话也留一份完整台账并接受重复,那属于另一类插件的取舍。
目录页:https://www.skillhub.cn/plugins/3418244301q-star/dsh-session-log-upload
GitHub:https://github.com/3418244301q-star/dsh-session-log-upload