Skip to content

三个小而横切的关注点共享这一页:安装者是谁(身份)、一个会话能携带哪些持久用户内容(附件),以及用户如何给产品打分(反馈)。它们都不是与 provider 之间的能力接口——每个都是拥有清晰所有权边界的独立包。

角色
@deepseek-ai/dsh-anonymous-user-id每个 harness 主目录共享的匿名 UUID v4
@deepseek-ai/dsh-attachment持久附件接口:ctx.attachments
@deepseek-ai/dsh-attachment-local附件的本地文件 provider
@deepseek-ai/dsh-message-feedback宿主拥有的、可编辑的按消息反馈 sidecar
@deepseek-ai/dsh-command-feedback仅记录日志的 feedback/record 事件与 /feedback 命令

身份:dsh-anonymous-user-id

getOrCreateAnonymousUserId() 返回一个随机生成的 UUID v4,其作用域限定为单个 harness 主目录,并作为一行裸文本 $DSH_HOME/.anonymous-user-id 持久化(当 DSH_HOME 未设置时为 ~/.dsh/.anonymous-user-id)。它 绝不 从主机名、网络地址、git remote 或任何其他可识别来源推导;删除该文件会在下次启动时重置身份,而相互独立的 harness 主目录拥有相互独立的身份。

该身份服务于三个消费者:

消费者用途
OpenTelemetry 后端将其作为 Resource user.id 上报
/feedback 确认将其回显,使用户能够关联对应记录
dsh-llm-deepseek将其作为 x-deepseek-harness-user-id 发送,使接收系统无需独立生成身份即可关联记录

读写都是同步的,因为启动时的遥测构建与直接命令执行都需要同一套 API;结果会按解析出的文件路径在进程生命周期内记忆化(memoized)。首个写入者使用排他式创建,并发下的落败者会采纳持久化出来的胜者;损坏的文件会被替换;持久化是尽力而为的,因此不可写的主目录仍会收到一个进程内 UUID。这个包是一个共享库,而非 Cordis 插件——消费者直接导入该函数。DSH_TELEMETRY_DISABLED 只停止遥测导出;它不会抑制直接反馈确认或 provider 的请求头。

附件:dsh-attachment

ctx.attachments 校验并原子式提交不可变的图片字节,然后返回一个可序列化的 ImageAttachmentRef。消费者绝不把浏览器路径、对象 URL、provider URL 或 base64 持久化进会话事件——ref 是唯一随事件流转的东西。取自 packages/attachment/attachment/README.md

  • validateImage 在不持久化的情况下执行同一套准入策略(未发送的编辑器图片仍是浏览器拥有的临时草稿)。
  • saveImage 在模型可见的会话事件发布之前提交每张已接受的图片;批处理写入者会先校验每一个成员,以免一个畸形成员把较早成员滞留为未被引用的对象。
  • readImage 会针对其记录的元数据校验内容寻址(content-addressed)对象;调用方可取消它,实现在后端与校验工作周围遵循取消。
  • 模型体验是间接的:与角色无关的核心 ImageBlock 与 provider 适配器会把持久引用解析为 provider 请求。添加一张图片会改变 provider 请求,因此会使受影响的 KV-cache 请求后缀失效。

本地 provider(dsh-attachment-local)把字节存储在 harness 主目录下。

反馈:两套系统,一条分界线

该仓库刻意拥有两套持久性不同的反馈机制:

1. dsh-message-feedback——可编辑、按消息的 sidecar。 宿主拥有的、针对一条最终确定消息的可编辑反馈。它注册 ctx.messageFeedback,在每个 Session 的一个存储域中持久化一条生命周期绑定的 sidecar 行,并发布宿主的 messageFeedback.list / messageFeedback.put / messageFeedback.delete 一元 Remote 契约(参见 API Gateway)。它与不可变的 Session 级 feedback/record 事件相互独立,并且不执行任何遥测交接。

配置:maxNoteBytes(必填的正整数)。备注必须包含至少一个非空白字符;被接受的文本按原样存储而非修剪。省略 note 意味着期望值没有备注,因此版本匹配的 put 会清除既有备注。备注校验先于 Session 查找。

2. dsh-command-feedback——不可变的日志事件。 与触发器无关的会话反馈,加上面向用户的 /feedback 采集。recordFeedback(session, text) 追加一个仅记录日志的 feedback/record 事件;该插件通过 ctx.commands 注册一个全局命令(参见 Interactions),因此每个组合进来的命令适配器都能发现它——随附的 Web 客户端无需模型回合即可执行它。

命令契约:/feedback <text> 会追加 feedback/record 并回执 Feedback recorded for session {sessionId}Anonymous user: {userId},以及会话共享披露;裸 /feedback 返回直接的使用错误,而纯空白输入被视为空。

关键源文件

仓库相对路径提供内容
packages/identity/anonymous-user-id/src/getOrCreateAnonymousUserId、文件存储契约
packages/attachment/attachment/src/ctx.attachmentsImageAttachmentRef、准入策略
packages/attachment/attachment-local/src/本地文件附件 provider
packages/feedback/message-feedback/src/ctx.messageFeedback、sidecar 持久化、Remote 契约
packages/feedback/command-feedback/src/recordFeedback/feedback 命令
.agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.mdsidecar 设计边界

延伸阅读

  • API Gateway —— messageFeedback.* 如何到达客户端
  • Interactions: 命令 —— /feedback 所依托的命令平面
  • DeepSeek Provider —— x-deepseek-harness-user-id 请求头
  • Storage & Persistence —— sidecar 背后的存储域
  • Repo: packages/identity/anonymous-user-id/README.mdpackages/attachment/attachment/README.mdpackages/feedback/*/README.md