网页刷新后续接任务,后端要保留同一会话,客户端要重建该会话的显示。再发送一次旧提示词会产生新的输入,不能作为恢复方案。对于从零开发的多步 Web 助手,首先要决定会话接入、事件重放和持久化由现有后端提供,还是复用已有会话服务。
Tansr @tansr/serve 是嵌入自己 Node.js 服务的会话引擎,提供多会话 REST、SSE、有限事件重放及历史读取;服务端需满足 Node.js ≥22.19,用户登录、业务工具、页面与部署仍由产品实现。它不等于完整业务网关,也不表示模型和数据都留在本地。会话服务说明
假设正在开发一个网页采购助手。用户要求查询三种设备库存,按交付时间给建议,暂不下单。已显示一种库存、另一查询仍在进行时刷新,页面应回到同一条任务,保留已有结果,确认当前运行状态,再接收后续事件。这是设计示例,不是客户案例。
恢复涉及三类状态:会话上下文、客户端显示、业务系统记录。会话与历史告诉页面已经讨论了什么;元信息及终局事件告诉页面当前是否仍在执行;查询、下单等真实结果由业务系统判断。SSE 断开不直接等于失败,也不保证任务永远继续,服务端治理可能中止没有订阅者的任务。
恢复对话不会撤销已经下达的订单。将“讨论采购方案”和“确认下单”分开,才不会让刷新或重连成为重复业务操作的入口。
现有 Node.js 后端如果已经提供会话请求、身份映射、事件转发和恢复机制,可以嵌入 @tansr/sdk 复用智能体运行链。SDK 的上下文能力不会自动替应用搭好浏览器接入协议。SDK 接入位置
从零建立多个客户端共用的助手后端时,Serve 可接手 REST/SSE 协议、序号、重放和历史读取,应用据此恢复原任务、追赶缺失事件及重建显示。模型负责理解和生成,库存及订单能力仍由应用的业务工具提供。采用理由落在这部分可复用的服务端机制,不能推导成无需开发或未经测量的性能优势。
新集成使用统一 /api 调用面,@tansr/serve 自 0.13.0 起提供该门面。旧 /v2 是内部适配入口,单运维方 /v1 不应直接用作多用户产品后端。接入前核对 /api/manifest 里的实际装配。统一调用面
情况 | 客户端应做什么 | 必要前提 |
|---|---|---|
短暂 SSE 断线 | 以最后已消费帧序号设置 | 视图与消费位置仍一致,所需事件在重放窗口内 |
收到 | 弃旧投影,读取会话元信息和历史,从 | 服务端记录可读取,不能忽略缺失事件 |
冷启动只有会话编号,或目标 | 以 | 显式接存储,当前身份有权访问 |
短断线时,例如页面已经处理到序号 42 的库存结果,就继续接 42 之后的事件,不重发采购提示词。客户端游标应对应已消费事件;只保存游标却丢掉原视图时,先以历史重建显示。恢复链与事件语义
内核事件的 seq 与帧 id 一致;控制帧也带 id,一起管理消费游标,不能假定每个 data 顶层都有 seq。无 id 的 gap 不推进游标。
/api 默认兼容原帧。请求携 tansr-event-envelope: unified-v1 且响应回响同名头时,事件 data 才改为统一包络,eventId 对应帧 id,原事件在 raw。客户端按实际协商结果解析,不能混用两种包络,也不能在没有回响时假定协商成功。
重放缓冲有限。gap 帧不带 id,不能当普通事件更新游标;配置慢消费者 drop-oldest 时,它还可能在连接仍然存在时出现。重建时读取 GET /api/sessions/:id 与 GET /api/sessions/:id/history,以历史响应中的 lastSeq 为锚。历史和水位同刻一致,不能用旧页面游标拼新历史;接口若分页,要取回显示所需历史,不能把第一页当完整记录。
活动会话的恢复请求按 attach 返回,休眠记录则重新装配。判断休眠用 live,不能用 lastSeq === 0。存储按执行轮提交,崩溃中正在运行的轮不保证保留,因此不能承诺服务重启后从模型输出的任意一个字接着执行。冷恢复限制
首先要显式接线会话存储;未接存储时,跨重启恢复,统一 /api 错误的 detail.domainCode 为 resume_unavailable。页面保留旧消息只能改善显示,不能替代服务端上下文。宿主也要接好 drain 停机收尾,正常停止时给执行轮和提交留出收口机会。存储前提、停机流程
其次是访问身份。authenticate 从产品的可信登录态得到 endUserId,各会话端点校验归属;sessionId 是记录标识,不是身份凭据。切换用户后要重新核对任务并移除不属于当前用户的显示缓存。应用密钥留服务端,不能为方便重连而下发浏览器。鉴权分工
多副本部署时,同一会话要回到所属副本。官方文件存储方案采用副本私有存储,不应把同一目录交给多个副本共写。刷新后请求落错副本而返回记录不存在时,要先检查路由,不能一律新建会话来掩盖问题。这些是 Serve 的部署约束,不能因部署在某家云上就自动消失。多副本方案
认证失败、归属拒绝、记录不存在、存储损坏须分别处理。统一 /api 错误信封的旧领域错误名在 detail.domainCode;读取历史失败时不能显示“已恢复”,更不能静默改成空白任务。错误约定
POST /api/sessions/:id/messages 返回 202 accepted 说明输入被接纳,不说明任务完成。已接纳而页面断线,应恢复原会话查看结果;提交结果未知时,先查会话和业务记录,再决定是否重试。没有在页面看到回答,不代表业务工具没有执行。
需要多步任务且希望复用统一恢复协议时,Serve 提供了具体接手的服务端责任。已有成熟会话及恢复后端,可继续嵌 SDK;只做一次摘要或固定生成,现有模型 API 可能更合适。用同一条只读采购任务验证断线去重、gap 重建、重启恢复已提交轮和跨用户拒绝,再按部署资料确认存储及路由,才能让刷新回到真实任务状态。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。