DSH
DeepSeek Harness(DSH)是一个编程 Agent,Web 服务在服务端保存会话、历史与执行状态。
这一页说明怎么接 DSH 的 Web 远程协议:建连接、建会话、审批与追问卡片、会话级事件,以及这个协议要注意的地方。请求与事件的字段见 DSH 协议参考。
结论
- 适配器自带连接
createDshConnection:DSH 的流复用在一条 WebSocket(api/remote.mux)上,审批与追问是后端反过来等客户端回答的请求,能力函数不用接入方写。地址与鉴权由连接选项决定。 - 整个应用一个连接、一个适配器实例;ChatKit 的 sessionId 就是 DSH 的会话 id。
- 审批与追问挂在工具片段上,用工具渲染器画卡片,按钮调
connection.respond。 - 只支持请求流模式;不支持续接。
建连接
浏览器直连时,DSH 服务要允许跨域与 WebSocket;生产环境建议走自己的服务转发并校验登录态,地址前缀写进 BASE。
会话与界面
会话目录由应用维护:创建后把 sessionId 存进自己的目录,交给 SessionList 与 useChatSessions。切到一个会话时,useChatSessions 经适配器取历史;往上翻时按页取更早的轮次。
审批与追问
状态依次是 pending(等待回答)→ answering(已调用 respond,等后端确认)→ answered。回答没送达时 respond 抛错、状态退回 pending,可以重试;按钮在非 pending 时置灰即可。等待回答时这一轮的阶段是 awaiting-external。这一轮结束时仍在等待的请求标为 cancelled。审批被后端撤回(如别的客户端先做了决定)时也标为 cancelled,之后收到后端的结论再改成 answered。
- 工具渲染器的参数里没有会话 id,卡片里用
useCurrentSession().session?.id取。 - 只有这个会话有轮次在读时,连接才认领审批与追问请求;否则交给其他客户端(如 DSH 自己的界面)。
- 刷新后,已回答的追问从工具的参数与结果还原;还在等待的追问从会话投影还原,只有
callId,回答时连接改用userQuestions/answer。审批的请求编号不进历史,刷新后审批不能再回答。
会话级事件
标题、待办、用量这类内容不在消息里。connection.listen(sessionId, listener) 收到这个会话的全部原始内容,用它驱动插槽:
连接断开时监听先收到 { kind: 'connection', status: 'disconnected' },连接自动重新订阅后收到 reconnected。断线期间的事件不补发,像上面这样在 reconnected 时补拉一次状态。
业务内容
本轮内的事件也可以在 transformOutput 里转成 data 片段显示在回答里。刷新加载历史时,适配器把历史回放成同形的会话事件逐条交给它,同一段逻辑在刷新后也能重建业务内容;流式帧与请求只在实时里有。哪些事件属于某一轮、怎么拿,见协议参考的没有内置处理的事件。
每一轮的额外参数(模型、模式…)用 transformInput 加到 session/prompt 的请求里,返回完整请求体。
输入怎么放进请求
输入里带了不支持的附件时不发请求,这一轮以 UNSUPPORTED_ATTACHMENT 失败。
错误
已知限制
- 只支持请求流模式:同一会话里由其他客户端发起的轮次不实时显示,刷新后从历史出现。
- 不支持续接:断线后这一轮标记连接中断,由会话层经历史确认结果。
- 插话的用户消息实时显示在回答之后,刷新后按历史排在回答之前。
- 历史不保留只在流式帧里出现过、没有落盘的内容,以及审批的请求编号。