大肥鱼 Session 状态联动
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,而不是把敏感参数复制到置顶窗口。
动画状态机需要优先级
角色同时存在三层状态:
- Agent 主状态:思考、工作、等待、成功、错误;
- 角色微动作:眨眼、观察、轻晃;
- 用户交互:摸头、戳、拖动、喂食。
主状态持续到真实事件变化;微动作只能插入允许的空档;交互短暂覆盖画面,但结束后读取当前主状态。拖动过程中发生错误,松手后应显示错误,而不是回到拖动前的思考状态。
派活时如何选择 Session
气泡输入应按可解释规则路由:
- 用户手动固定的 Session;
- 当前前台 DSH 页面对应的 Session;
- 正在等待用户输入的 Session;
- 最近由用户明确交互的 Session;
- 否则要求用户选择或创建。
“最近活动”不能作为唯一规则,因为后台高频工具事件可能抢走目标。发送前显示名称、工作区和权限模式;发送后提供打开 Session 的入口。
断线与恢复
Client 断开 Host 时不要保留“正在工作”造成假状态。可以显示离线并逐步降级到静态角色。重新连接后请求完整快照,而不是只等待下一条增量事件。
Host 重启时,应从 DSH 当前 Session 状态重建聚合结果。角色动画状态不是业务真相,不需要把每一帧持久化。
回归测试
至少覆盖:
- 单 Session 的完整 Turn;
- 工具失败后继续重试并最终成功;
- 两个 Session 同时运行;
- Sub-agent 完成但父 Session 仍工作;
- 等待批准时另一个任务成功;
- 用户拖动期间状态变化;
- Client 重载和 Host 重启;
- Session 删除、迁移或工作区失效;
- 减少动态模式。
完整工程顺序见搭建自己的大肥鱼,权限与派活限制见大肥鱼权限边界。