希望支持 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 容器中 }
  • 思源笔记

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

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

    25120 引用 • 103566 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 那恐怕有点难哦,vscode 有块级 diff 和冲突解决。思源连同步冲突 diff 和解决都没有很完善。

  • 其他回帖
  • 如何自己喂数据训练?

  • zxkmm 1 赞同

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

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

    2 回复
  • WaveF via macOS

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

    1 回复
    2 操作
    WaveF 在 2025-02-13 10:49:20 更新了该回帖
    WaveF 在 2025-02-13 10:48:39 更新了该回帖
  • 查看全部回帖

推荐标签 标签

  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 2 关注
  • 思源笔记

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

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

    25120 引用 • 103566 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 490 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • OneNote
    1 引用 • 3 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 344 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 642 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • 生活

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

    230 引用 • 1454 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 222 关注
  • 印象笔记
    3 引用 • 16 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 442 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 575 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 413 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 55 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    267 引用 • 666 回帖
  • Vditor

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

    367 引用 • 1842 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 762 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 516 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 494 关注