用 dsh-answer-pet 给 DeepSeek Harness 网页界面加上回答状态宠物

前言

DeepSeek Harness(dsh)是 DeepSeek AI 开源的智能体运行时,官方仓库把架构概括成一句话:一切皆插件。模型适配器、工具、会话日志、Agent 循环和界面都可以替换,不必改框架源码。社区里还有一份独立的插件目录站点(deepseek-harness-plugin.com),用来检索带 dsh-plugin 话题的仓库。它和 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。

在 Web 界面里跑智能体时,常见的情况是:模型已经开始思考、正在吐字,或者正在调 grepread 一类工具,页面上却只剩一条流式文本。开了多个会话以后,更难一眼看出哪一轮还在跑、卡在哪一步、输出了多少 token。会话事件其实都在 session/event 里,缺的是一层面向人的进度展示。

dsh-answer-pet 做的就是这件事:在 DSH Web 页面角落放一只宠物,用动画对应开始处理、思考、输出、工具调用和完成;旁边的状态卡汇总 token、速率、耗时,并列出最近的模型轨迹。

这是什么

dsh-answer-pet 是一款 会话与消息 类插件,由 Nanki-nn 维护,许可证 MIT,主要语言 JavaScript。GitHub 仓库是 Nanki-nn/dsh-answer-pet。本文核对时,package.json 版本为 0.6.0,声明自己是 DeepSeek Harness 的 Web bundle 插件(dsh.client.platformweb)。

它把两件事拆开:

  • 核心层:按会话维护进度、模型轨迹和状态卡。
  • 主题层:声明式 PetTheme v1 负责宠物 SVG、局部动画、宽高比和阶段文案。

默认主题是蓝鲸(blue-whale)。仓库 README 还内置橘猫示例主题(orange-cat),以及高相似度银渐层猫主题(silver-shaded-cat)。社区目录页收录时的简介仍写「蓝鲸 + 橘猫」;银渐层猫是 2026-08-16 写入主分支的,以 GitHub README 和 package.json 为准。

它解决的不是「再养一只会走动的桌面宠物」,而是回答进行中的可观测性:当前阶段、输出速度、工具有没有失败。社区里另有 dsh-petdsh-desktop-pet 等宠物插件,定位不同,不要混用安装说明。

核心功能

回答阶段与宠物动画

插件监听会话事件,把原始事件归一成主题能理解的阶段。README 给出的对应关系如下:

阶段 来源事件 主题接口 状态卡进度
空闲 无运行会话 idle 不显示运行会话卡与数量
开始处理 turn/start turn 2%
思考 step/start think 5% → 10%
输出 assistant/chunk stream 10% → 90%,按 token 填充
工具 tool/call tool 冻结当前进度并显示工具名
完成 turn/end done 100%

进度不是模型接口返回的「完成百分比」。计算规则在 README 里写得很明确:优先用 assistant/chunkusage;流式期间按文本长度估算;有 maxTokens 时按 outputTokens / maxTokens 填充,没有则用饱和曲线,避免进度长期停在某一格。同一回合内进度单调不减。输出速率用 EMA 平滑。真实 token usage 到达后会覆盖流式估算值。

宠物外观跟阶段走。蓝鲸保留喷水、摆尾、眨眼和完成表情;橘猫有摆尾、抬爪、说话和完成表情;银渐层猫是去背景紧裁切原画,再加上呼吸、眨眼、摇摆、说话、抬爪和完成跳跃。单击宠物只触发主题定义的一次眨眼,不会换位置。

多会话状态卡

每个正在运行的会话对应一张独立卡片,纵向排列。卡片结构固定为四块:

  1. 标题行:运行状态圆点、会话标题、进度百分比。
  2. 统计行:当前阶段、输出 token、token/s、已运行时间。
  3. 轨迹时间线:最近的模型动作、工具调用、状态和耗时。
  4. 进度条:同一回合内平滑、单调填充;模型输出时显示流动效果。

没有运行会话时,不显示状态卡,也不显示数量按钮。状态卡可以折叠;折叠后,只有仍有运行会话时,才会在宠物下方出现数量按钮,点一下重新展开。空闲时不显示数字 0,这是预期行为。

宠物可以拖拽,位置写在浏览器 localStorage。恢复默认位置时,README 给出的做法是在当前 DSH Web 页面执行:

localStorage.removeItem('answer-pet:pos')
location.reload()

同时恢复状态卡展开状态:

localStorage.removeItem('answer-pet:bar')
location.reload()

模型执行轨迹

每张运行会话卡会展示最近的模型动作,例如 README 中的示例:

分析任务 · 步骤 1                  1s
推理与规划                         3s
调用 grep · SessionEvent           2s
组织回答                           5s

时间线圆点含义:

  • 蓝色呼吸圆点:当前正在执行。
  • 绿色圆点:动作或工具调用已完成。
  • 红色圆点:工具调用失败。

可识别的轨迹包括:开始处理请求、进入模型步骤并分析任务、生成 reasoning 时显示「推理与规划」、生成正文时显示「组织回答」、原生 tool/call / tool/result,以及 run_code 内部的 tool/code-dispatch-start / tool/code-dispatch 嵌套调用。

为避免面板过高,宿主最多保存最近 6 条,卡片显示最近 4 条。每个运行会话独立维护自己的轨迹。数据来源是 Node 侧监听 session/event,再通过轮询 /answer-pet/state 和 SSE /answer-pet/events 推到浏览器;阶段切换即时刷新,流式数据平滑更新。

工具摘要与隐私边界

工具轨迹始终显示实际工具名,例如 readgreppwshweb_search。参数区域只从白名单字段提取短摘要:

  • description
  • query
  • pattern
  • file_path
  • path
  • url

插件不会在轨迹面板里展示完整 Shell 命令、完整工具参数或原始 JSON;摘要会压缩空白并限制长度。PetTheme 文档也写明:主题拿不到原始 session/event,也拿不到完整工具参数。

PetTheme v1

主题和核心解耦。当前版本只加载随插件构建、通过契约校验的可信内置主题,不会:

  • 从 URL 下载主题
  • 扫描并执行第三方 JavaScript
  • 把未经清理的用户 SVG 注入 DSH 页面
  • 向主题暴露原始会话事件或完整工具参数

普通主题禁止外部图片。银渐层猫是例外:它显式声明 trustedRaster: true,运行时只允许一张构建时注入的 data:image/png;base64,...,仍然拒绝外部 URL。这个能力不对配置项或第三方动态主题开放。未知主题 id 会回退到蓝鲸。

开发自己的内置主题,仓库提供 PetTheme v1 开发指南。流程是复制橘猫主题文件、改 id / SVG / CSS / 文案、登记到 BUILTIN_THEME_IDS 和构建脚本,再跑测试与 npm run build:client。主题必须覆盖 idleturnthinkstreamtooldoneerror 七个阶段;CSS 必须限定在自己的 data-ap-theme 作用域。

安装与启用

社区目录页给出的安装命令是:

dsh plugin add github:Nanki-nn/dsh-answer-pet

仓库 README 额外要求装到 Web profile,因为客户端只声明了 platform: web

dsh plugin --profile web add github:Nanki-nn/dsh-answer-pet

安装后停止并重新启动当前的 dsh web 进程,再刷新原来的 Web 页面。单独再开一个 Web 服务,不会更新当前已经打开的页面。升级时重复执行同一条安装命令即可。

README 特别写了:模型轨迹和主题配置都由插件的 Node half 提供;从旧版本升到 0.6.0 后必须重启 dsh web,只刷新浏览器不会加载新的配置 schema。能看到宠物但没有模型轨迹,通常也是这个原因。

目录页提示:如需可复现安装,请固定 commit 哈希。本文核对时,仓库 main 最新提交为 a0827d41c3f8f9177622c460a99f1aeeb8034b8d(2026-08-16),写法如下:

dsh plugin add github:Nanki-nn/dsh-answer-pet#a0827d41c3f8f9177622c460a99f1aeeb8034b8d

插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前请检查源代码仓库和许可证。

典型用法

切换主题与外观

settings.yamlanswer-pet 段配置。仓库给出的完整示例如下:

answer-pet:
  theme: blue-whale # blue-whale / orange-cat / silver-shaded-cat
  size: 96          # 宠物高度 px(48–200)
  corner: br        # 停靠角:br / bl / tr / tl
  opacity: 1        # 透明度(0.2–1)
  pollMs: 800       # /state 轮询间隔
  showBar: true     # 显示会话进度卡
  showBubble: true  # 显示状态气泡

源码里的默认值与上表一致:主题 blue-whale,高度 96px,停靠右下角,透明度 1,轮询 800ms,进度卡和气泡都打开。pollMs 允许范围是 200–5000。

主题更新会在下一次配置刷新时挂载。如果改完 theme 仍显示蓝鲸,先确认 id 写对了;未知或无效 id 会回退到蓝鲸。升级插件后还需要重启 dsh web,让新的 settings schema 生效。

只想看银渐层猫时:

answer-pet:
  theme: silver-shaded-cat

看一次完整回合

  1. 确认宠物出现在设定的停靠角(默认右下)。
  2. 在某个会话里发出请求。宠物切到思考 / 输出动画,状态卡从约 2% 起跳。
  3. 模型开始吐字后,统计行出现输出 token 和 token/s,进度按 token 向 90% 推进。
  4. 发生工具调用时,进度冻结,气泡或轨迹里出现工具名;失败则轨迹圆点变红。
  5. turn/end 后进度到 100%,宠物切换完成表情。
  6. 多个会话同时跑时,每张卡独立更新。不需要看卡时把状态卡收起,只留数量按钮。

本地开发(可选)

仓库提供的开发命令:

npm install
npm test
node scripts/build-client.mjs
node scripts/build-client.mjs --check

客户端 bundle 改完刷新页面即可;Node half 改完必须重启 dsh web

适用场景与注意事项

适合这些情况:

  • 主要在 DSH Web 里使用智能体,想看当前回合卡在思考、输出还是工具。
  • 同时开多个会话,需要按会话分开看进度和轨迹。
  • 关心输出 token、速率和耗时,但不想翻原始事件日志。
  • 想换一只内置宠物,或者按 PetTheme v1 给项目提交新的内置主题。

需要注意:

  • 只覆盖 Web profilepackage.json 把客户端平台写成 web,装到 headless 不会出现这只宠物。
  • 进度是估算值。多数模型接口不提供「回答完成百分比」;有 usage 时会校正,没有时用阶段和饱和曲线。
  • 轨迹有长度上限,不是完整审计日志。宿主留 6 条,界面展示 4 条;完整命令和原始参数故意不展示。
  • 主题不能从网上下载。当前只接受构建进插件的可信主题,不能把任意 SVG 或远程图片配进 settings.yaml
  • 安装后必须重启 dsh web。尤其是升级到带新 schema 的版本之后,只刷新浏览器不够。
  • 权限与许可证。插件以当前 dsh 进程权限运行,许可证为 MIT。安装前自己看源码;社区目录不是 DeepSeek 官方应用商店。

小结

dsh-answer-pet 把 DSH Web 里本来就有的会话事件,收成一只角落宠物和一组可折叠状态卡:阶段动画、token 统计、多会话进度,以及带隐私裁剪的模型 / 工具轨迹。外观由 PetTheme v1 声明,默认蓝鲸,另有橘猫和银渐层猫。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-answer-pet/

GitHub:https://github.com/Nanki-nn/dsh-answer-pet

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜