首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >vite7.2-deepseek流式ai对话|vue3.5+vant4+katex+mermaid智能ai打字会话模板

vite7.2-deepseek流式ai对话|vue3.5+vant4+katex+mermaid智能ai打字会话模板

原创
作者头像
andy2018
发布2025-12-23 21:35:55
发布2025-12-23 21:35:55
1810
举报
文章被收录于专栏:h5h5

​喜迎2026原创新作vite7.2+vue3.5+deepseek-v3.2从0-1纯手搓流式输出ai会话模板。

vue3.5-deepseek支持浅色/深色模式、代码高亮/复制、katex公式/mermaid图表等功能。

使用技术

  • 开发工具:vscode
  • 技术框架:vite^7.2.4+vue^3.5.24+vue-router^4.6.4
  • 大模型框架:deepseek-v3.2 + openai
  • UI组件库:vant^4.9.21 (有赞vue3移动端组件库)
  • 状态管理:pinia^3.0.4
  • 高亮插件:highlight.js^11.11.1
  • markdown解析:markdown-it
  • katex公式:@mdit/plugin-katex^0.24.1

项目框架目录

使用最新前端框架vite7.2搭建项目模板,接入最新deepseek-v3.2聊天大模型。

环境变量配置.env

自己去申请一个api key,替换掉.env文件里面的key 即可丝滑体验流式对话功能。

代码语言:actionscript
复制
# title
VITE_APP_TITLE = 'Vue3-DeepSeek-Chat'

# port 默认http://localhost:5173/
VITE_PORT = 3001

# 运行时自动打开浏览器
VITE_OPEN = true

# 开启https
VITE_HTTPS = false

# 是否删除生产环境 console
VITE_DROP_CONSOLE = true

# DeepSeek API配置
VITE_DEEPSEEK_API_KEY = 替换为你的 API Key
VITE_DEEPSEEK_BASE_URL = https://api.deepseek.com

入口文件main.js

代码语言:actionscript
复制
import { createApp } from 'vue'
import './style.scss'
import App from './App.vue'

// 引入路由/状态管理
import Router from './router'
import Pinia from './pinia'

import Plugins from './plugins'

const app = createApp(App)

app
.use(Router)
.use(Pinia)
.use(Plugins)
.mount('#app')

项目通用布局

代码语言:actionscript
复制
<template>
  <div class="flexbox flex-col" style="height:100%;">
    <Toolbar :title="chatSession?.title" />

    <div class="v3ai__scrollview flex1">
      <!-- Chat对话 -->
      <div v-if="chatSession && !isEmpty(chatSession.data)" class="v3ai__chatbot" ref="scrollRef" @scroll="onScroll">
        <div class="v3ai__chatbot-sessions">
          ...
        </div>
        <!-- 滚动底部 -->
        <div class="v3ai__scrollbottom" :class="{'is-bottom': reachBottom}" @click="scrollToBottom"><i class="iconfont ai-arrD"></i></div>
      </div>
      <!-- 导语 -->
      <div v-else class="v3ai__chatbot-intro">
        <i class="logo iconfont ai-deepseek"></i>
        <h3 class="name"><span class="txt text-gradient">嗨~ Vue3-DeepSeek</span></h3>
        <p class="desc">你身边的智能小帮手,我可以帮你搜索、答疑、写作,请把你的任务交给我吧~</p>
        <div class="prompt">
          <p class="tip"><span>你可以这样问</span><span @click="refreshPrompt">换一换<i class="iconfont ai-shuaxin"></i></span></p>
          <ul class="list">
            <li v-for="(item,index) in promptList" :key="index">
              <div class="txt" @click="changePrompt(item.prompt)">{{item.emoji}} {{item.prompt}}</div>
            </li>
          </ul>
        </div>
      </div>
    </div>

    <!-- 编辑器 -->
    <ChatEditor ref="editorRef" :value="promptValue" :reachBottom="reachBottom" :scrollBottom="scrollToBottom" />
  </div>
</template>

vue3+markdown自定义katex公式/mermaid图表

代码语言:actionscript
复制
import { imgSize } from '@mdit/plugin-img-size' // 支持带尺寸图片
import { katex } from "@mdit/plugin-katex"; // 支持数学公式
import 'katex/dist/katex.min.css'
// 渲染mermaid图表
import { markdownItMermaidPlugin } from '@/components/markdown/plugins/mermaidPlugin'

markdown组件调用

代码语言:actionscript
复制
<Markdown
  :source="item.content"
  :html="true"
  :linkify="true"
  :typographer="true"
  :plugins="[
    imgSize,
    [katex, {delimiters: 'all'}],
    [markdownItMermaidPlugin, { ... }]
  ]"
  @copy="onCopy"
/>

封装mermaid图表解析插件

代码语言:actionscript
复制
export const markdownItMermaidPlugin = (md, options) => {
  const defaultFence = md.renderer.rules.fence
  md.renderer.rules.fence = (...args) => {
    const [tokens, idx] = args
    const token = tokens[idx]
    const lang = token.info.replace(/\[.*\]/, '').trim() || ''

    if(lang === 'mermaid') {
      const code = token.content.trim()
      const hash = generateHash(code)
      const uuid = `${hash}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`

      // 如果有缓存,加载缓存图表
      if(renderCache.has(hash)) {
        // console.log('加载缓存mermaid图表')
        return `
          ${ defaultFence(...args) }
          <div class="mermaid-container">${renderCache.get(hash)}</div>
        `
      }

      nextTickRender(uuid)

      return `
        ${ defaultFence(...args) }
        <div class="mermaid-container" id="${uuid}" data-mermaid-hash="${hash}" data-mermaid-code="${encodeURIComponent(code)}">
          <div class="mermaid-loading">📊Mermaid 图表加载中...</div>
        </div>
      `
    }

    return defaultFence(...args)
  }

  function nextTickRender(containerId) {
    // 如果容器存在,直接渲染
    if(document.getElementById(containerId)) {
      renderMermaidDiagram(containerId)
      return
    }
    // 使用MutationObserver监听DOM更新
    const observer = new MutationObserver((mutations, ob) => {
      const container = document.getElementById(containerId)
      if(container) {
        ob.disconnect()
        renderMermaidDiagram(containerId)
      }
    })
    observer.observe(document.body, {
      childList: true,
      subtree: true
    })
  }
  
  async function renderMermaidDiagram(containerId) {
    const container = document.getElementById(containerId)
    if (!container) {
      console.warn(`Mermaid container #${containerId} not found`)
      return
    }
  
    const code = decodeURIComponent(container.dataset.mermaidCode)
    const hash = container.dataset.mermaidHash

    if (!code) {
      return
    }

    // 检查 mermaid 是否可用
    if (typeof window.mermaid === 'undefined') {
      showError(container, 'Mermaid 库未加载!')
      return
    }
  
    try {
      // 配置 mermaid(如果还未配置)
      if (!window.mermaid.initialized) {
        window.mermaid.initialize({
          startOnLoad: false,
          theme: 'default',
          securityLevel: 'loose',
        })
        window.mermaid.initialized = true
      }
  
      let svg
  
      // 检查缓存
      if(renderCache.has(hash)) {
        svg = renderCache.get(hash)
      }else {
        const { isValid } = await verifyMermaid(code)

        if(!isValid) {
          showError(container, `<pre>渲染语法错误:\n${ code }\n</pre>`)
          return
        }

        // 使用唯一ID渲染(避免图表冲突)
        const {svg: renderedSvg} = await window.mermaid.render(`mermaid-${containerId}`, code)
        svg = renderedSvg
        renderCache.set(hash, svg)
      }

      // 更新容器内容
      container.innerHTML = svg
      container.removeAttribute('data-mermaid-hash')
      container.removeAttribute('data-mermaid-code')

      // 触发回调
      if(options?.reachBottom) {
        options?.onRender?.()
      }
    } catch (error) {
      console.error('Mermaid 渲染失败:', error)
      showError(container, `<pre>渲染图表时出错: \n ${error.message}\n</pre>`)
    }
  }
}

支持运行到网页pc端,以750px宽度显示页面。

vue3+deepseek实现多轮对话/流式输出

代码语言:actionscript
复制
const completion = await openai.chat.completions.create({
  // 单一会话
  /* messages: [
    {role: 'user', content: editorValue}
  ], */
  // 多轮会话
  messages: props.multiConversation ? historySession.value : [{role: 'user', content: editorValue}],
  model: 'deepseek-chat', // deepseek-chat对话模型 deepseek-reasoner推理模型
  stream: true, // 流式输出
  max_tokens: 8192, // 限制一次请求中模型生成 completion 的最大 token 数(默认使用 4096)
  temperature: 0.4, // 严谨采样 越低越严谨(默认1)
})

处理流式生成

代码语言:txt
复制
for await (const chunk of completion) {
  // 检查是否已终止
  if(chatState.aborted) break

  const content = chunk.choices[0]?.delta?.content
  if(content) {
    streamText += content
    // 限制更新频率:每100ms最多更新一次
    const now = Date.now()
    if(now - lastUpdate > 100) {
      lastUpdate = now
      requestAnimationFrame(() => {
        // ...
      })
    }
  }
  if(chunk.choices[0]?.finish_reason === 'stop') {
    // 确保最终内容完整更新
    ...
  }
}

Okay,以上就是vue3+deepseek实现流式输出ai对话模板的一些知识分享。感谢大家的阅读与支持!

electron38-vite7-vue3os电脑端os管理系统

最新版electron38-vite7-admin电脑端中后台管理系统

Electron38+Vite7+Pinia3+ElementPlus客户端聊天程序

基于tauri2.8+vite7+vue3+element-plus仿QQ/微信聊天应用

tauri2.9-vite7-vue3admin客户端后台系统管理Exe模板

最新原创uniapp-vue3-osadmin手机版后台管理系统

最新研发uniapp+vue3仿微信app聊天模板

最新原创flutter3.27+bitsdojo_window客户端聊天Exe

自研新版Flutter3.32仿微信app聊天|朋友圈模板

基于uni-app+vue3实战短视频+聊天+直播app商城

基于uniapp+deepseek+vue3跨平台ai流式对话

electron35+deepseek桌面端ai模板

vue3.5+deepseek网页版ai流式对话

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 [email protected] 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 [email protected] 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用技术
  • 项目框架目录
  • 环境变量配置.env
  • 入口文件main.js
  • 项目通用布局
  • vue3+markdown自定义katex公式/mermaid图表
  • vue3+deepseek实现多轮对话/流式输出
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档