← 博客

Agent 状态持久化:中断需用户确认场景

记录日期:2026-04-02

1. 问题背景

神秘人 Agent(shenmiren-agent)在「先提案、用户确认、再执行工具」路径下,用 文档库 存会话与待确认工具调用,用 RDB REST 执行 create_plan 等。该链路里曾先后出现:网关 401、HTTP 失败无结构化体、确认二次请求 读不回会话user_iddefault[工具成功]success: false 矛盾SSE TOOL_CALL_RESULTpayload 致前端严格校验失败2.7)、集成测/真机遇到的 上游 LLM 限流(如 2064,与 NoSQL 无关,2.8)可绑定客户端工具清空后 仍只依赖 服务端 pending + App 确认2.9)、persistence 图拓扑导致同轮偷跑写库 + 快照无 needs_confirmation 致 App 不弹确认2.10),以及执行侧 整句当 plan_title 入 RDB2.11,关联)。下文按 docs/开发记录博客/agents.md 博客格式(根因链 → 短期/长远方案 → 采纳 → 用例)记录,并与仓库 错误不可静默、多端一致要求对齐。

2. 问题列表

2.1 HTTP 失败无响应体与错误分层不清

根因

方案(每个问题不超过两个)

优点:可测、可对照官方 HTTP API。缺点:需梳理 RDB 调用分支。

优点:多端一致。缺点:工作量大,需分阶段。

采纳方案

补充用例

2.2 RDB 网关鉴权失败(401)

根因

方案

优点:成本低。缺点:密钥轮换要同步环境。

优点:身份一致。缺点:链路更长。

采纳方案

补充用例

2.3 会话文档库写入/读出异常(load_session found=False

根因

方案

优点:见效快。缺点:需拉镜像日志。

优点:假成功与解析漂移可根治。缺点:要验证多环境响应形态。

采纳方案

补充用例

2.4 用户 ID 为占位 default(网关 userId 未进工具层)

根因

方案

优点:与网关字段一致、可测。缺点:旧客户端若只发 user_id 将不再生效。

优点:更少分支。缺点:依赖平台演进。

采纳方案

补充用例

2.5 工具文案与 success 不一致([工具成功] + success: false

根因

方案

优点:立刻消除矛盾。缺点:仍依赖前缀+文本串联协议。

优点:可机读、可断言、与 L2/L3 同源。缺点:需 Agent 流式协议与 App 渲染同步改。

采纳方案

补充用例

2.6 确认结果前端 JSON.parse 失败

根因

方案

优点:兼容当前流式文本。缺点:协议松散、易碎。

优点:可机读、可断言、根除多段拼包。缺点:需 Agent 与 App 同步改。

采纳方案

补充用例

2.7 TOOL_CALL_RESULT SSE 缺 payload(前端报「须 schemaVersion=1、kind=…、displayText」)

现象与证据

根因

方案

优点:不 fork 整个 SDK、与当前 requirements 锁定版本对齐。缺点:上游修复后需删补丁,以免双维护。

采纳方案

补充用例

2.8 上游 LLM 限流(如 2064)与持久化排障边界

现象:集成测或真机偶发 RUN_ERROR,正文含 APIError ... (2064)「当前服务集群负载较高」 等;同一 threadId 多轮连续 send-message 时更易出现。

根因

实际采取

2.9 写操作确认路径与「客户端工具」空列表

现状client_tools.pyCLIENT_TOOLS 已为空;模型 仅绑定服务端工具 schema(由 App body.tools 传入)。show_toast / navigate_to_page 等不再作为可调用工具

与持久化的关系

2.10 待确认已写入 NoSQL 却同轮执行写库 + 前端不展示确认

产品侧完整叙事(含「未确认写库 / 无确认条 / 标题整句」及 agents.md 式小节结构):见《开发记录博客/经典ReAct Agent Loop.md》§8

现象(证据向)

根因(证据级链)

方案(每个问题不超过两个)

优点:改动面小、与 App/集成测契约一致。缺点:依赖「确认必须带 confirm + 标准 messages」的合同不破坏。

优点:拓扑自解释、减少并行歧义。缺点:要梳理所有 persistence 入边场景。

采纳方案

补充用例

2.11(关联)执行侧 plan_title 与用户整句不一致

说明:与 NoSQL 会话字段无直接关系,但用户在同一类链路里反馈「库中标题为整句口令」。根因:模型把 plan_title 填成整句,原 enrich_create_plan_calls_from_messages 在已有 plan_title不再改写采纳:在 execute_toolscreate_plannormalize_plan_title_for_createagent/tool_calls_util.py);用例见 tests/test_plan_title_normalize.py

3. 小结

参考shenmiren-agent/README.mdshenmiren-agent/tests/TESTCASES.mddocs/开发记录博客/agents.md(博客结构)、根目录 AGENTS.md(协作规则)、.agents/skills/http-api-cloudbase/SKILL.md