当前位置: 首页 > news >正文

Ai对话框sse

    // 创建一个全局的AbortController实例,用于控制本次SSE请求
let controller = null;
// 一个标志,记录是否是用户主动中止
let isUserAbort = ref(false);
// 发起SSE聊天请求的函数
const startSSEChat = async (userInput) => {
  // 每次发起新请求前,先取消可能存在的旧请求
  if (controller) {
    controller.abort();
  }
  // 创建新的控制器
  controller = new AbortController();
  const signal = controller.signal;
  // 重置状态
  isUserAbort.value = false;
  currentAiReply.value = true;
  changeButton();
  try {
    const response = await fetch('/api/chat-stream', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ query: userInput }),
      signal: signal // 关键!传入中止信号
    });
    // 处理流式响应...
    const reader = response.body.getReader();
    const decoder = new TextDecoder();
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      const chunk = decoder.decode(value);
      //  根据后端返回的标签信息,显示不同的内容
      if (isUserAbort.value) {
        reader.cancel(); // 取消读取器
        break;
      }
    }
  } catch (error) {
    if (error.name === 'AbortError') {
      console.log('请求已被用户中止');
    } else {
      console.error('请求出错:', error);
    }
  } finally {
    currentAiReply.value = false;
    changeButton();
  }
};
 
// 用户点击“停止”按钮时触发的函数
const handleStop = () => {
  isUserAbort.value = true;
  if (controller) {
    controller.abort(); // 关键!执行中止操作
  }
  // 紧接着,调用上报“终止状态”的后端接口
  reportStopToBackend();
};
http://www.jsqmd.com/news/684105/

相关文章:

  • 别再被torch.cuda.is_available()=False坑了!保姆级排查手册(附CUDA 10.2 + PyTorch 1.10.1配置)
  • Docker农业配置必须关闭的7个默认参数(附实测对比数据:CPU占用下降62%,启动延迟压缩至1.8s)
  • STM32 串口通信 (UART) 全栈底层复习指南
  • .NET命名之谜:它与C#纠缠年的关系揭秘
  • CSS如何处理旧版浏览器的浮动兼容性_利用zoom-1触发hasLayout清除css浮动
  • ReadCat技术架构深度解析:模块化设计下的现代桌面阅读器实现
  • 从OOSEM到MagicGrid:一文理清主流MBSE方法论,帮你找到最适合自己项目的建模路线图
  • 别再死记硬背快捷键了!用这5个Blender 4.0实战案例,让你彻底理解建模逻辑
  • 拓展中国剩余定理
  • 【NLP实践指南】从BERT的last_hidden_state到pooler_output:如何为不同任务精准选择语义向量
  • 2025届最火的六大AI写作方案推荐榜单
  • 别再手动改Hosts了!用SwitchHosts一键管理多环境,开发效率翻倍(附Git同步配置)
  • 从GitHub到百度云:手把手教你备份和整理吴恩达机器学习全套资源(笔记+代码+视频)
  • 从Slab到内存池:深入拆解Linux内核如何高效管理‘碎片化’小内存(以task_struct为例)
  • 别再只会写黑框框了!用EGE给C语言课设做个带登录界面的图形化系统(附完整源码)
  • 从挂科边缘到高分飘过:我的华科矩阵论自救笔记(附GitHub超全资料)
  • 2026年小红书被朱雀AIGC检测?去i迹+嘎嘎降3步降到15%
  • 从游戏碰撞检测到地图围栏:用Shapely玩转Python几何运算的3个实战项目
  • 别再手动对齐了!用Creo的骨架模型做装配,效率提升不止一点点
  • git提交总结
  • 基于yolov5-v11和deepsort的行人跌倒检测系统 GUI部分使用pyqt5,YOLOv5-v11 + DeepSORT + PyQt5跌倒检测识别系统
  • .NET 11原生AI推理性能翻倍实录:绕开5大Runtime陷阱、3类Tensor内存泄漏与2种JIT编译失效场景
  • 3步实战指南:从零到精通Tesseract OCR识别技术
  • 苹果高层变动:库克卸任 CEO 转任董事长,功绩与争议并存
  • Transformer跨界搞目标检测?拆解Grounding DINO里那些让模型‘听懂人话’的关键模块
  • CN3702 5A 双节锂电池充电管理集成电路
  • 一个让我彻底放弃传统IoT的“AI老六”
  • claude code 安装及 国内大模型接入指南
  • CH34X-MPHSI Master总线扩展实战:SPI设备即插即用与驱动无缝迁移
  • 每日一Go-55、分布式 ID 生成(雪花算法 / Segment / Redis / DB)