第 22-1 篇:chat.html——前端如何消费 SSE
上一篇21-3《内嵌 HTMLgen_embedded_web.py 怎么把页面塞进二进制》下一篇22-2《/admin API状态、配置、加载、转换》源码精读篇本文为源码/方法论精读无独立实测文中数字均引述仓库 docs 的板端实测记录一句话导读chat.html 前端如何消费 SSE服务端会发、前端怎么收——为何不用只读的 EventSource而用 fetch 加 ReadableStream 逐行切事件发送前又怎样借 admin 状态卡住未加载模型。关键词chat.html、SSE、ReadableStream、EventSource、admin API服务端 SSE 会发了20-3前端/chat页面怎么收这篇读src/serve/chat.html的流式消费代码——它没用EventSource那是 GET-only而是fetchReadableStream逐行读。顺带看它如何用/admin/api/status在发送前卡住模型没加载就不许发。1. 知识点POST 流式为什么不能用 EventSourceEventSource是浏览器原生 SSE 客户端但它只支持 GET——而/v1/chat/completions要 POST JSON。所以前端只能用fetch拿到响应流后自己按 SSE 格式切事件fetch(url, {method:POST, body: json}) → resp.body.getReader() // ReadableStream → 按 \n\n 切出每个事件 → 剥掉 data: 前缀 → JSON.parse → 追加到文本框这套手搓 SSE 消费和引擎手搓 SSE 生产vllm_http.c是对称的生产端不引库、消费端也不引库两端加起来 ~100 行。这正是零依赖风格的完整闭环——依赖是双向省掉的。2. 对应代码chat.html 的流式函数chat.html的关键锚点/* 162 行附近发送前查引擎状态 */ const s await fetch(/admin/api/status).then(r r.json()); // 模型没加载(load_state!2)就不许发 /* 397 行请求体带上 stream 开关 */ stream: $(p_stream).value 1 /* 447 行起流式主循环 streamRequest */ async function streamRequest(bodyObj, aiText, t0, onRaw){ const resp await fetch(/v1/chat/completions, { ... }); // POST const reader resp.body.getReader(); // ReadableStream // 边读边切 data: 事件逐段 append统计 genCount / 计算 tok/s 显示 }值得注意的两个工程点打字机效果的实现onRaw逐段回调把原文追加进文本框——页面上一个字一个字出现不是 CSS 动画是 SSE 每 50ms 一个 token 的真实节奏与 20-3 实测一致状态先行发送按钮的可用性由/admin/api/status的load_state决定162–170 行——前端先问模型加载了吗这比发了再等 400体验好一个数量级也说明 22-2 的 admin API 不是后端自嗨前端真在消费它。3. 改动后果前端把 SSE 当 JSON 读会怎样把streamRequest里逐事件切分改成等全部读完再 JSON.parse新手常犯后果实测可推演、也可在浏览器 DevTools 复现改前请求发出 ~130ms 后文本框开始出字角色帧先到随后逐 token 追加 改后整个请求期间文本框空白生成完才一次性出现整段——打字机效果消失 且请求超时风险上升长回答要等全部 decode 完才落盘到响应体这个改动后果不需要跑代码就能理解SSE 的全部价值在时间分布上消费端一旦缓冲生产端的逐 token 就白做了。在 DevTools 的 Network 面板看EventStream类型的响应体是逐块到达、还是攒包是最直接的验证。4. 学员调试任务A 档浏览器 板端 serve打开http://板IP:8801/chatDevTools → Network → 发一条流式消息点开该请求看响应体是否逐块增长EventStream 视图在streamRequest里加一行console.log(performance.now(), chunk)观察每个 chunk 的时间戳应 ~50ms 一跳把p_stream切到一次性 JSON对比 Network 面板里响应体一次性到达与流式的差异。B 档纯读源码读chat.html145–200 与 400–490回答① 为什么用getReader()手动切事件而不是resp.text()提示后者要等流结束②genCount/streamT0148–149 行被用来算什么、对用户体验有什么意义③ 若模型在流式中途被卸载auto_unload前端会看到什么、代码里有没有处理预期输出一张 DevTools 抓到的 SSE 分块时间轴截图 对你板子首字延迟与逐字节奏的读数。收尾本篇源码点名chat.html状态门 162–170、streamRequest 447 起开源仓库Kestrel-LLM (Gitee)AGPL-3.0-or-later 或商业许可二选一下篇预告前端偷偷调的那些/admin/api/*服务端到底给了什么22-2 逐个拆状态/配置/加载/转换四组接口的返回结构。

相关新闻

2026年API聚合平台评选指南:国产企业级代表与国际平台深度对比

2026年API聚合平台评选指南:国产企业级代表与国际平台深度对比

在AI大模型快速迭代的2026年,个人开发者与企业都要回答同一个问题:API聚合服务选国际平台还是国产平台?本文以词元之河与OpenRouter为主要样本,辅以云卷API等国产轻量选项,从性能、模型覆盖、国内访问便利性与计费模式…

2026/9/29 21:42:00 阅读更多 →
避坑指南:找北京开发网站公司前必懂的5个设计规范

避坑指南:找北京开发网站公司前必懂的5个设计规范

避坑指南:找北京开发网站公司前必懂的5个设计规范 模板网站太丑,改起来还费劲,这种痛谁懂?很多老板为了省那几千块,图省事直接套个现成的模板,结果上线后客户看着不专业,自己看着也闹心。更坑的是,想改个颜色或换个布局,根本找不到地方下手,最后只…

2026/9/29 1:16:24 阅读更多 →
AI竟然一天写了个AI漫剧工具:用TaoToken统一Key打通OpenSpec+FastAPI全流程

AI竟然一天写了个AI漫剧工具:用TaoToken统一Key打通OpenSpec+FastAPI全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 3:15:44 阅读更多 →

最新新闻

C++ STL:list 底层结构、模拟实现与 vector 对比

C++ STL:list 底层结构、模拟实现与 vector 对比

1. list 的介绍 list 是 STL 中非常重要的序列式容器之一,它可以在常数时间 O(1) 内在任意位置进行插入和删除元素。 list 的底层结构是带头结点的双向循环链表: 每个节点包含一个数据域 data、一个前驱指针 prev 和一个后继指针 next;头结…

2026/9/30 9:27:26 阅读更多 →
多人Vibe Coding秒变灾难?泳道隔离机制与Git预检脚本:团队多Agent协作防撞车实战

多人Vibe Coding秒变灾难?泳道隔离机制与Git预检脚本:团队多Agent协作防撞车实战

文章目录1. 团队协作的公地悲剧:为什么多 Agent 协同秒变合并灾难?1.1. 一行代码引发的惨案:公共基础配置被静默覆写1.2. 为什么 AI 偏爱跨目录越权?概率模型的边界盲区2. 崩溃现场还原:Git Merge 冲突爆炸与 CI 构建流…

2026/9/30 9:27:26 阅读更多 →
大模型长任务总是半途跑题?基于外置状态机与量化风格卡的长链路Agent编排实战

大模型长任务总是半途跑题?基于外置状态机与量化风格卡的长链路Agent编排实战

文章目录1. 长链路编排的达摩克利斯之剑:AI 为什么总是“半途而废”?1.1. 模式一:主旨漂移与长上下文遗忘1.2. 模式二:跳步偷工减料与幻觉伪造1.3. 模式三:风格塌房与空洞 AI 味泛滥2. 崩溃现场还原:长对话…

2026/9/30 9:27:26 阅读更多 →
C#字符串解析为键值对:从Split到状态机与Span性能优化

C#字符串解析为键值对:从Split到状态机与Span性能优化

日常写上位机、对接第三方接口或者处理配置文件时,字符串转键值对几乎是躲不开的基础操作。无论是读PLC点位表、解析HTTP查询串,还是把摄像头参数、设备回传的报文转成Dictionary,本质上都是在做同一件事:把一段有规律的文本拆成k…

2026/9/30 9:27:26 阅读更多 →
员工更衣室储物柜选购指南,采购前先看完,避开很多隐形坑

员工更衣室储物柜选购指南,采购前先看完,避开很多隐形坑

更衣室储物柜看着只是简单的收纳家具,但选不好,后续会出现生锈、柜门变形、空间不够用等各类问题。很多采购只盯着价格,忽略环境、使用习惯这些细节,等到柜子装好,才发现各种不方便。下面整理一份实用的选购要点&#…

2026/9/30 9:27:26 阅读更多 →
2026年Java后端学习路线重排:底层原理到工程化实战

2026年Java后端学习路线重排:底层原理到工程化实战

每年到了换季的时候,后台总有人问我同一个问题:Java后端这条路到2026年还值不值得走,学习路线该怎么排。我先给结论,再给理由。值得走,但路线必须改。Java后端学习路线这件事,从2018年到现在,表…

2026/9/30 9:26:25 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →