希望支持 Ollama 本地模型的流式输出

目前要等待 AI 输出完再显示,阻塞太久了体验很差。下面是简单的流式输出答案的代码(真实可用,仅供参考),我没开发过思源插件,也不知道官方 API 是否支持对接 AI 输出,但我觉得这个可能由官方支持比较靠谱,衷心希望官方考虑下...

async function main() { // 定义可用模型列表 const modelList = [ 'deepseek-r1:14b', 'qwen2.5' ]; // 创建 petite-vue 应用 createApp({ model: modelList[0], question: 'strawberry里有几个r', // 默认问题 output: null, // 输出内容,初始为 null history: [], // 聊天记录 // 定义异步聊天函数 async chat(question, container) { // 如果输入为空,则不执行操作 if (question === '') return // 清空输入框内容 this.question = '' // 将新问题和空的答案添加到聊天记录中 this.history.push({ question, answer: '' }) let action = this.history[this.history.length - 1] // Ollama 的 API 地址 const apiUrl = "http://localhost:11434/api/generate" // 选定的模型名称 const modelName = this.model // 发送请求到 API const resp = await fetch(apiUrl, { method: "POST", // 请求方法为 POST headers: { "Content-Type": "application/json" // 请求头内容类型为 JSON }, body: JSON.stringify({ model: modelName, // 指定使用的模型 prompt: question // 发送的问题内容 }) }) // 获取响应体的读取器,用于逐步读取流式内容 const reader = resp.body.getReader() // 创建文本解码器,将二进制数据解码为文本 const textDecoder = new TextDecoder("utf-8") // 配置 Showdown 转换器的选项 const options = { parseImgDimensions: true, /* 支持定义图片尺寸 */ tables: true, /* 启用表格语法 */ strikethrough: true, /* 启用删除线 */ tasklists: true, /* 启用待办列表 */ emoji: true, /* 启用 emoji 表情 */ splitAdjacentBlockquotes: true, /* 分离相邻的引用块 */ moreStyling: true, /* 启用更多样式支持 */ } // 使用 Showdown 转换器将答案从 Markdown 转为 HTML const converter = new showdown.Converter(options) // 循环读取 API 返回的流式内容 while (1) { const { done, value } = await reader.read() // 读取一段内容 if (done) { // 针对deepseek的思考部分 if (action.answer.includes('</think>')) { const arr = action.answer.split('</think>') const think = arr[0] + '</think>' const answer = arr[1] action.answer = think + converter.makeHtml(answer) } else { action.answer = converter.makeHtml(action.answer) } log(action.answer) log('=== END ===') // 打印结束标志 break // 退出循环 } // 解码流式内容为字符串 const answer = textDecoder.decode(value).trim() // 将流式内容按行分割并逐行处理 const arr = answer.split('\n').map(item => { log(item) // 打印每行内容 try { // 尝试将 JSON 字符串解析为对象,并返回响应内容 const obj = JSON.parse(item.trim()) return obj.response } catch (err) { // 如果解析失败,返回空字符串 return '' } }) // 将解析的内容添加到当前问题的答案中 action.answer += arr.join('') } } }).mount('#app') // 将应用挂载到页面上的 #app 容器中 }
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25850 引用 • 107034 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 如果你愿意的话,插件也可以实现,单独做一套,不用官方的就行。不需要 API

  • 其他回帖
  • WaveF via macOS

    明白了,我是做 UI 设计的,目前这种屏蔽用户操作在设计实际上有强弱之分,直接用一个进度条遮挡整个编辑器实际上属于强打断,它表现的并不只是视觉上好不好看,而是会强制打断用户思路,就好比在影院看电影时突然中途插入全屏广告。不管怎样,我也只是提个建议或者探讨,如果不希望在流式输出期间用户在编辑器本体操作,那是否可以用单独的窗口/webworker 来处理,编辑器本体只是有一个占位符块,等独立窗口完成流式输出后再把内容填充到主编辑器,这样是不是更可行?不过如果没有 AI 相关的 API 那也只能等官方了

    1 回复
    2 操作
    WaveF 在 2025-02-13 10:49:20 更新了该回帖
    WaveF 在 2025-02-13 10:48:39 更新了该回帖
  • 如何自己喂数据训练?

  • zxkmm 1 赞同

    难点不是流式输出本身,是让编辑器上有流式输出。

    另外这个并不是阻塞,只是简单的屏蔽用户操作。即使实现了流式输出也需要屏蔽用户操作,只是视觉上更好看。

    2 回复
  • 查看全部回帖

推荐标签 标签

  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 4 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 488 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    371 引用 • 1856 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 648 关注
  • CodeMirror
    2 引用 • 17 回帖 • 164 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25850 引用 • 107033 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 655 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 519 关注
  • RemNote
    2 引用 • 16 回帖 • 19 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 794 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 125 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    98 引用 • 903 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 92 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1432 回帖 • 1 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    180 引用 • 3878 回帖
  • Access
    1 引用 • 3 回帖 • 4 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖 • 2 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖