- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
先展示下最终效果:
第一步:先安装ollama,并配置对应的开源大模型.
安装步骤可以查看上一篇博客:
async startStreaming(e) { if(e.ctrkey&&e.keyCode==13){ this.form.desc+='\n'; } document.getElementById("txt_suiwen").disabled="true"; // 如果已经有一个正在进行的流式请求,则中止它 if (this.controller) { this.controller.abort(); } setTimeout(()=>{ this.scrollToBottom(); },50); var mymsg=this.form.desc.trim(); if(mymsg.length>0){ this.form.desc=''; this.message.push({ user:this.username, msg:mymsg }) this.message.push({ user:'GPT', msg:'', dot:'' }); // 创建一个新的 AbortController 实例 this.controller = new AbortController(); const signal = this.controller.signal; this.arequestData.messages.push({role:"user",content:mymsg}); try { const response = await fetch('http://127.0.0.1:11434/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body:JSON.stringify(this.arequestData), signal }); if (!response.body) { this.message[this.message.length-1].msg='ReadableStream not yet supported in this browser.'; throw new Error('ReadableStream not yet supported in this browser.'); } const reader = response.body.getReader(); const decoder = new TextDecoder(); let result = ''; this.message[this.message.length-1].dot='⚪'; while (true) { const { done, value } = await reader.read(); if (done) { break; } result += decoder.decode(value, { stream: true }); // 处理流中的每一块数据,这里假设每块数据都是完整的 JSON 对象 const jsonChunks = result.split('\n').filter(line => line.trim()); //console.log(result) for (const chunk of jsonChunks) { try { const data = JSON.parse(chunk); //console.log(data.message.content) this.message[this.message.length-1].msg+=data.message.content; setTimeout(()=>{ this.scrollToBottom(); },50); } catch (e) { //this.message[this.message.length-1].msg=e; // 处理 JSON 解析错误 //console.error('Failed to parse JSON:', e); } } // 清空 result 以便处理下一块数据 result = ''; } } catch (error) { if (error.name === 'AbortError') { console.log('Stream aborted'); this.message[this.message.length-1].msg='Stream aborted'; } else { console.error('Streaming error:', error); this.message[this.message.length-1].msg='Stream error'+error; } } this.message[this.message.length-1].dot=''; this.arequestData.messages.push({ role: 'assistant',//this.message[this.message.length-1].user,//"GPT", content: this.message[this.message.length-1].msg }) setTimeout(()=>{ this.scrollToBottom(); },50); }else{ this.form.desc=''; } document.getElementById("txt_suiwen").disabled=""; document.getElementById("txt_suiwen").focus(); } }
。
<template> <el-row :gutter="12" class="demo-radius"> <div class="radius" :style="{ borderRadius: 'base' }"> <div class="messge" id="messgebox" ref="scrollDiv"> <ul> <li v-for="(item, index) in message" :key="index" style="list-style-type:none;"> <div v-if="item.user == username" class="mymsginfo" style="float:right"> <div> <el-avatar style="float: right;margin-right: 30px;background: #01bd7e;"> <!-- {{ item.user.substring(0, 2) }} --> <img :alt="item.user.substring(0, 2)" :src=userphoto /> </el-avatar> </div><div style="float: right;margin-right: 10px;margin-top:10px;width:80%;text-align: right;"> {{ item.msg }} </div> </div> <div v-else class="chatmsginfo" > <div> <el-avatar style="float: left;margin-right: 10px;"> {{ item.user }} </el-avatar> </div> <div style="float: left;margin-top:10px;width:80%;"> <img alt="loading" v-if="item.msg == ''" class="loading" src="../../assets/loading.gif"/> <MdPreview style="margin-top:-20px;" :autoFoldThreshold="9999" :editorId="id" :modelValue=" item.msg + item.dot " /> <!-- {{ item.msg }} --> </div> </div> </li> </ul> </div> <div class="inputmsg"> <el-form :model="form" > <el-form-item > <el-avatar style="float: left;background: #01bd7e;margin-bottom: -44px;margin-left: 4px;z-index: 999;width: 30px;height: 30px;"> <img alt="jin" :src=userphoto /> </el-avatar> <el-input id="txt_suiwen" :prefix-icon="userphoto" resize="none" autofocus="true" :autosize="{ minRows: 1, maxRows: 2 }" v-model="form.desc" placeholder="说说你想问点啥....按Enter键可直接发送" @keydown.enter.native.prevent="startStreaming($event)" type="textarea" /> </el-form-item> </el-form> </div> </div> </el-row> </template> <script setup> import { MdPreview, MdCatalog } from 'md-editor-v3'; import 'md-editor-v3/lib/preview.css'; const id = 'preview-only'; </script> <script> export default { data() { return { form: { desc: '' }, message:[], username:sessionStorage.name, userphoto:sessionStorage.photo, loadingtype:false, controller: null, arequestData : { model: "qwen2",//"llama3.1", messages: [] } } }, mounted() { }, methods: { scrollToBottom() { let elscroll=this.$refs["scrollDiv"]; elscroll.scrollTop = elscroll.scrollHeight+30 }, clearForm(formName){ this.form.desc=''; }, async startStreaming(e) { if(e.ctrkey&&e.keyCode==13){ this.form.desc+='\n'; } document.getElementById("txt_suiwen").disabled="true"; // 如果已经有一个正在进行的流式请求,则中止它 if (this.controller) { this.controller.abort(); } setTimeout(()=>{ this.scrollToBottom(); },50); var mymsg=this.form.desc.trim(); if(mymsg.length>0){ this.form.desc=''; this.message.push({ user:this.username, msg:mymsg }) this.message.push({ user:'GPT', msg:'', dot:'' }); // 创建一个新的 AbortController 实例 this.controller = new AbortController(); const signal = this.controller.signal; this.arequestData.messages.push({role:"user",content:mymsg}); try { const response = await fetch('http://127.0.0.1:11434/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body:JSON.stringify(this.arequestData), signal }); if (!response.body) { this.message[this.message.length-1].msg='ReadableStream not yet supported in this browser.'; throw new Error('ReadableStream not yet supported in this browser.'); } const reader = response.body.getReader(); const decoder = new TextDecoder(); let result = ''; this.message[this.message.length-1].dot='⚪'; while (true) { const { done, value } = await reader.read(); if (done) { break; } result += decoder.decode(value, { stream: true }); // 处理流中的每一块数据,这里假设每块数据都是完整的 JSON 对象 const jsonChunks = result.split('\n').filter(line => line.trim()); //console.log(result) for (const chunk of jsonChunks) { try { const data = JSON.parse(chunk); //console.log(data.message.content) this.message[this.message.length-1].msg+=data.message.content; setTimeout(()=>{ this.scrollToBottom(); },50); } catch (e) { //this.message[this.message.length-1].msg=e; // 处理 JSON 解析错误 //console.error('Failed to parse JSON:', e); } } // 清空 result 以便处理下一块数据 result = ''; } } catch (error) { if (error.name === 'AbortError') { console.log('Stream aborted'); this.message[this.message.length-1].msg='Stream aborted'; } else { console.error('Streaming error:', error); this.message[this.message.length-1].msg='Stream error'+error; } } this.message[this.message.length-1].dot=''; this.arequestData.messages.push({ role: 'assistant',//this.message[this.message.length-1].user,//"GPT", content: this.message[this.message.length-1].msg }) setTimeout(()=>{ this.scrollToBottom(); },50); }else{ this.form.desc=''; } document.getElementById("txt_suiwen").disabled=""; document.getElementById("txt_suiwen").focus(); } }, beforeDestroy() { // 组件销毁时中止流式请求 if (this.controller) { this.controller.abort(); } } } </script> <style scoped> .radius{ margin:0 auto; } .demo-radius .title { color: var(--el-text-color-regular); font-size: 18px; margin: 10px 0; } .demo-radius .value { color: var(--el-text-color-primary); font-size: 16px; margin: 10px 0; } .demo-radius .radius { min-height: 580px; height: 85vh; width: 70%; border: 1px solid var(--el-border-color); border-radius: 14px; margin-top: 10px; } .messge{ width:96%; height:84%; /* border:1px solid red; */ margin: 6px auto; overflow: hidden; overflow-y: auto; } .inputmsg{ width:96%; height:12%; /* border:1px solid blue; */ border-top:2px solid #ccc; margin: 4px auto; padding-top: 10px; } .mymsginfo{ width:100%; height:auto; min-height:50px; } ::-webkit-scrollbar {width: 6px;height: 5px; } ::-webkit-scrollbar-track {background-color: rgba(0, 0, 0, 0.2);border-radius: 10px; } ::-webkit-scrollbar-thumb {background-color: rgba(0, 0, 0, 0.5);border-radius: 10px; } ::-webkit-scrollbar-button {background-color: #7c2929;height: 0;width: 0px; } ::-webkit-scrollbar-corner {background-color: black; } </style> <style> .el-textarea__inner{ padding-left: 45px; padding-top: .75rem; padding-bottom: .75rem; } </style>
。
。
最后此篇关于vue通过ollama接口调用开源模型的文章就讲到这里了,如果你想了解更多关于vue通过ollama接口调用开源模型的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!