DSH 大肥鱼状态联动:Session、Tool Call 与动画状态机

作者
DeepSeekAgent.io 编辑部
发布
更新

让大肥鱼跟随 DSH 工作,难点不是播放动画,而是把多个 Session、并行工具、短暂错误和用户审批压缩成一个稳定、可信的角色状态。没有聚合规则时,桌宠会在“思考”“工作”“完成”之间频繁闪烁,甚至在任务仍运行时误报空闲。

不要从界面文字猜状态

状态源应是 DSH Host 的结构化事件,而不是聊天 DOM、按钮文字、模型输出关键词或定时猜测。结构化事件可以提供:

  • Session 身份与生命周期;
  • Turn 开始、流式生成与结束;
  • Tool Call 开始、结果和错误;
  • 等待用户输入或批准;
  • Todo、步骤或上游提供的进度;
  • 当前工具类别与持续时间。

角色永远不应把模型在回答里提到“测试通过”误认为真实测试成功。

先做事件归一化

不同工具不需要各自占一个顶层状态。Host 可以把它们归类:

事件归一化状态角色反馈
Turn 已开始、尚无工具THINKING思考动作与低频气泡
文件、Shell、搜索等工具执行WORKING按工具类别选择动作
需要审批或追问WAITING明显但不持续闪烁的提醒
Turn 正常完成SUCCESS短暂庆祝后回到聚合状态
工具失败、Turn 错误ERROR错误脉冲与可打开的详情
没有活动任务IDLE呼吸与微动作

SUCCESS 和 ERROR 是脉冲,不是长期真相。播放几秒后,应重新计算所有活动 Session,而不是直接回到空闲。

多 Session 应按提醒价值排序

一个用户可能同时运行多个任务。大肥鱼只能显示一个主动作时,可以使用以下优先级:

需要用户输入
> 阻塞或失败
> 已完成待查看
> 正在执行工具
> 正在思考
> 空闲

主气泡显示当前最高优先级 Session,其余活动任务折叠成 +N。允许用户固定某个 Session;固定对象结束或消失后,再回到自动选择。

不要每收到一条流式事件就更换主 Session。给选择结果一个短暂稳定窗口,可以避免两个并行任务抢夺角色。

工具动作只使用类别,不泄露内容

角色可以区分 Shell、代码编辑、搜索、浏览器、测试和文件读取,但默认不应在桌面气泡展示完整命令、文件路径、搜索词或页面标题。

推荐只显示:

  • “正在运行命令”;
  • “正在修改文件”;
  • “正在搜索资料”;
  • “正在运行测试”;
  • “等待你的确认”。

需要详情时,让用户点击气泡打开原 Session,而不是把敏感参数复制到置顶窗口。

动画状态机需要优先级

角色同时存在三层状态:

  1. Agent 主状态:思考、工作、等待、成功、错误;
  2. 角色微动作:眨眼、观察、轻晃;
  3. 用户交互:摸头、戳、拖动、喂食。

主状态持续到真实事件变化;微动作只能插入允许的空档;交互短暂覆盖画面,但结束后读取当前主状态。拖动过程中发生错误,松手后应显示错误,而不是回到拖动前的思考状态。

派活时如何选择 Session

气泡输入应按可解释规则路由:

  1. 用户手动固定的 Session;
  2. 当前前台 DSH 页面对应的 Session;
  3. 正在等待用户输入的 Session;
  4. 最近由用户明确交互的 Session;
  5. 否则要求用户选择或创建。

“最近活动”不能作为唯一规则,因为后台高频工具事件可能抢走目标。发送前显示名称、工作区和权限模式;发送后提供打开 Session 的入口。

断线与恢复

Client 断开 Host 时不要保留“正在工作”造成假状态。可以显示离线并逐步降级到静态角色。重新连接后请求完整快照,而不是只等待下一条增量事件。

Host 重启时,应从 DSH 当前 Session 状态重建聚合结果。角色动画状态不是业务真相,不需要把每一帧持久化。

回归测试

至少覆盖:

  • 单 Session 的完整 Turn;
  • 工具失败后继续重试并最终成功;
  • 两个 Session 同时运行;
  • Sub-agent 完成但父 Session 仍工作;
  • 等待批准时另一个任务成功;
  • 用户拖动期间状态变化;
  • Client 重载和 Host 重启;
  • Session 删除、迁移或工作区失效;
  • 减少动态模式。

完整工程顺序见搭建自己的大肥鱼,权限与派活限制见大肥鱼权限边界。

参考资料