回复断线后怎样恢复界面:游标、重复事件与用户取消

本文探讨SSE流式传输中断后如何正确恢复界面状态,强调以完整业务事件为单位推进游标,避免字节级续传导致的乱码或重复;区分断网、错误、拒绝和用户取消四类终止场景;指出服务端需持久化游标与内容原子提交,恢复失败应明确提示而非伪装续传;验收需覆盖半帧截断、重复事件、ID冲突等边界情况,确保内容一致性而非仅连接可用性。

在完整事件游标处恢复回复

网络断开时,界面可能已经显示三段文字,第四段只收到半个 JSON。重新连接若从头追加,会重复前三段;若从“已收到字节数”继续,又可能从中文字符或 JSON 中间开始。

恢复的单位应该是协议里已经完整验证并应用的业务事件。字节到了、SSE 帧结束了、业务事件已持久化,是三个不同阶段。应用游标也需要服务端保留相应日志,浏览器无法单方面发明续传能力。

先把四种停止分开

断网是连接状态未知;服务端错误是请求失败;拒绝是供应商或应用明确不接受该请求;用户取消是用户要求停止。它们不应都显示成“继续生成”。

用户取消后,客户端不得自动重连旧任务。取消请求是否让模型停算、是否产生费用,需要服务端确认与实际 usage,关闭 Reader 或连接不能证明这些结果。

游标、重放去重与取消分支

游标只跟随完整事件前进

下面自定义连续递增的 seq。真实 SSE 的 ID 本身不要求是数字;这里为了示范间隙检查,额外约定了业务序号。相同序号内容不同要报冲突,不能当普通重复吞掉。

保存为 resume.mjs,执行 node resume.mjs:

import assert from "node:assert/strict";

function session(snapshot = { cursor: 0, text: "", input: "", seen: [], cancelled: false }) {
  const s = structuredClone(snapshot);
  const seen = new Map(s.seen);
  return {
    apply(e) {
      if (s.cancelled) return "cancelled";
      if (!Number.isSafeInteger(e.seq) || e.seq < 1 || typeof e.text !== "string")
        throw new Error("invalid complete event");
      const payload = JSON.stringify({ text: e.text });
      if (seen.has(e.seq)) {
        if (seen.get(e.seq) !== payload) throw new Error("conflicting replay");
        return "duplicate";
      }
      if (e.seq !== s.cursor + 1) throw new Error("event gap");
      // 在此示例中,应用与游标更新是同步内存操作。
      s.text += e.text; seen.set(e.seq, payload); s.cursor = e.seq;
      return "applied";
    },
    edit(value) { s.input = value; },
    cancel() { s.cancelled = true; },
    snapshot() { return { ...s, seen: [...seen] }; }
  };
}
const a = session();
a.edit("用户尚未发送的输入");
a.apply({ seq: 1, text: "你好" });
const b = session(a.snapshot());
assert.equal(b.apply({ seq: 1, text: "你好" }), "duplicate");
assert.throws(() => b.apply({ seq: 1, text: "另一段" }), /conflicting/);
assert.throws(() => b.apply({ seq: 3, text: "间隙" }), /gap/);
b.apply({ seq: 2, text: ",继续" });
assert.equal(b.snapshot().text, "你好,继续");
assert.equal(b.snapshot().input, "用户尚未发送的输入");
b.cancel();
assert.equal(b.apply({ seq: 3, text: "迟到" }), "cancelled");
console.log("cursor/replay/cancel fixtures passed");

此例仅在内存保存日志。真实持久化需要把可见内容与游标作为同一提交单元;若先保存游标、后保存内容,中途崩溃会丢字。若先保存内容而游标未提交,又需要可重放、可去重的结构。长会话还需要快照和有界历史,不能让 seen 集合无限增长。

恢复失败不应伪装成续写

服务端可能不支持游标、日志已过期,或无法验证会话所有权。此时应返回明确状态,保留用户输入与已显示内容,提供“重新发起”操作,并说明可能得到不同内容、可能产生新的调用成本。

不要拿已显示文本拼接到新 prompt,自动发起新请求后还称“原任务续传”。这会改变上下文、供应商任务身份及计费边界。业务需要这样做时,应该作为新任务显示并让用户确认。

验收看内容一致性,不只看能否重连

离线夹具要覆盖:每个事件之间断线、半帧截断、重复事件、冲突 ID、游标过期、缺终态,以及取消后旧事件迟到。刷新页面后还要检查草稿和选区是否按产品约定保留。

本文没有实现 UTF-8/SSE 解析器;解析层的分片不变量应独立测试。也没有接真实模型或断网浏览器实验。已在 Node v26.3.0 验证的是完整业务事件的恢复规则;不能据此声称“无损续传、模型停算或费用退回”。

参考资料:AI SDK 流式协议,滚动文档;Streams 概念,滚动文档;Playwright 断言,滚动文档。采用前复核实际服务的游标与终态约定。

内容概要:本文基于Simulink仿真实现了一种针对电网电压不对称跌落问题的三相四桥臂动态电压恢复器(DVR)系统,重点研究其在不平衡电压扰动下的补偿控制策略。该模型采用三相四桥臂逆变器拓扑结构,能够有效处理三相电压的独立控制,克服传统三桥臂结构在不对称工况下的局限性。系统结合多准PR(Proportional Resonant)并联控制策略,实现对负载电压的高精度、快速动态补偿,尤其适用于不平衡负载及复杂电网环境。为进一步提升控制器性能,引入RIME等高效智能优化算法对PID参数进行整定,增强了系统的动态响应能力与鲁棒性。文档配套提供完整的仿真模型、参考文献及详细说明,便于理论分析与工程复现,是电能质量治理领域中DVR技术研究的重要实践参考。; 适合人群:具备电力电子、自动控制理论或电气工程相关背景,从事电能质量控制、微电网保护、DVR装置开发等方向的科研人员、高校研究生及电力系统工程技术人员。; 使用场景及目标:①深入研究三相四桥臂DVR在电压不对称跌落工况下的补偿特性与控制机理;②掌握多准PR控制器的设计方法及其在不平衡系统中的应用;③学习并实践RIME等新型优化算法在PID参数整定中的具体实现;④复现先进控制策略,开展不同控制方案的对比分析与性能评估。; 阅读建议:建议结合Simulink仿真模型与配套文档进行同步学习,重点关注四桥臂拓扑的工作原理、多准PR控制器的结构设计以及优化算法与控制系统的集成方式,建议动手调试参数并尝试替换优化算法以加深理解。
内容概要:本文研究了基于多目标哈里斯鹰算法(MOHHO)与模型预测控制(MPC)相结合的储能系统与风电场联合平抑功率波动的方法。针对风电出力的不确定性,构建了综合考虑平抑效果与储能损耗的多目标优化模型,并采用MOHHO算法对MPC控制器的权重参数进行优化求解,从而在保障电网功率稳定的同时延长储能设备使用寿命。研究涵盖了算法设计、控制策略构建及仿真验证全过程,详细阐述了MOHHO在多目标参数整定中的实现机制与MPC的滚动优化过程,结果表明该方法能有效降低风电波动对电网的冲击,提升系统运行的经济性与鲁棒性,适用于高比例可再生能源接入的电力系统调度场景。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、储能控制、智能优化算法或模型预测控制研究的研发人员及研究生。; 使用场景及目标:①解决风电功率剧烈波动引起的电网频率与电压不稳定问题;②优化储能系统的充放电策略以实现功率平滑输出并减少循环损耗;③掌握多目标智能优化算法在MPC参数整定中的应用方法;④学习基于Matlab的电力系统建模与仿真分析技术,深入理解预测控制与优化算法的协同机制。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注MOHHO算法的种群演化过程、Pareto最优解集的生成逻辑以及MPC控制器的预测时域与权重矩阵设计,通过调整风电波动场景与储能参数观察系统响应变化,全面掌握多目标优化与模型预测控制在实际工程中的集成应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值