首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Tauri2+Vue3.5+DeepSeek实战客户端Ai流式对话exe应用

基于Tauri2+Vue3.5+DeepSeek实战客户端Ai流式对话exe应用

原创
作者头像
andy2018
修改2025-06-19 08:12:16
修改2025-06-19 08:12:16
2400
举报
文章被收录于专栏:h5h5

2025又一跨平台AI原创力作:tauri2+vite6+deepseek从0-1搭建桌面端ai聊天问答系统。

tauri2-vue3-winbot桌面端ai对话支持侧边栏收缩/展开、上下文多轮对话、代码高亮、本地存储会话、图片100%宽度渲染、在线图片预览、网络链接跳转、表格功能

tauri2-deepseek采用无边框圆角窗口、自定义导航条设计,自定义托盘图标。

技术栈

  • 编辑器:VScode
  • 技术框架:vite^6.3.5+vue^3.5.15+vue-router^4.5.1
  • Ai大模型框架:DeepSeek-V3-0324 + OpenAI
  • 跨平台框架:tauri^2.5.0
  • UI组件库:arco-design^2.57.0 (字节桌面端组件库)
  • 状态管理:pinia^3.0.3
  • 本地缓存:pinia-plugin-persistedstate^4.3.0
  • 高亮插件:highlight.js^11.11.1
  • markdown插件:markdown-it

项目框架结构

基于tauri2+vue3搭建跨平台模板,整合接入deepseek聊天大模型。

项目环境变量.env

代码语言:actionscript
复制
# 项目名称
VITE_APPNAME = 'Tauri2-DeepSeek'

# 运行端口
VITE_PORT = 1420

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

项目入口main.js

代码语言:actionscript
复制
/**
 * 渲染页面入口main.js
 * @author andy
 */

import { createApp } from "vue"
import App from "./App.vue"
import './style.scss'

// 引入插件配置
import Plugins from './plugins'

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

createApp(App)
.use(Plugins)
.use(Router)
.use(Pinia)
.mount("#app");

项目结构模板

代码语言:actionscript
复制
<script setup>
  import { appState } from '@/pinia/modules/app'

  import Titlebar from '@/layouts/components/titlebar/index.vue'
  import Sidebar from '@/layouts/components/sidebar/index.vue'

  const appstate = appState()
</script>

<template>
  <div class="vu__chatbot">
    <div class="vu__container" :style="{'--themeSkin': appstate.config.skin}">
      <div class="vu__layout flexbox flex-col">
        <!-- 导航栏 -->
        <Titlebar />

        <div class="vu__layout-body flex1 flexbox">
          <!-- 侧边栏 -->
          <Sidebar />

          <!-- 主面板 -->
          <div class="vu__layout-main flex1">
            <router-view v-slot="{ Component, route }">
              <keep-alive>
                <component :is="Component" :key="route.path" />
              </keep-alive>
            </router-view>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

tauri2配置

代码语言:actionscript
复制
{
  "$schema": "https://schema.tauri.app/config/2",
  "productName": "tauri2-deepseek",
  "version": "0.1.0",
  "identifier": "com.tauri2-deepseek.app",
  "build": {
    "beforeDevCommand": "yarn dev",
    "devUrl": "http://localhost:1420",
    "beforeBuildCommand": "yarn build",
    "frontendDist": "../dist"
  },
  "app": {
    "windows": [
      {
        "title": "tauri2-deepseek",
        "width": 960,
        "height": 620,
        "center": true,
        "decorations": false,
        "transparent": true,
        "shadow": false,
        "visible": false
      }
    ],
    "security": {
      "csp": null
    },
    "withGlobalTauri": false
  },
  "bundle": {
    "active": true,
    "targets": "all",
    "icon": [
      "icons/32x32.png",
      "icons/128x128.png",
      "icons/128x128@2x.png",
      "icons/icon.icns",
      "icons/icon.ico"
    ]
  }
}

自定义ai编辑框

代码语言:actionscript
复制
<template>
  <div class="v3ai__footbar flexbox flex-col">
    <!-- 技能栏 -->
    <div v-if="skillbar" class="v3ai__skills flexbox flex-alignc">
      <div class="item" v-for="(item, index) in skills" :key="index" @click="handleSkill(item)">
        <i class="iconfont" :class="item.icon"></i><span class="text">{{item.text}}</span>
      </div>
    </div>
    <!-- 编辑栏 -->
    <div class="v3ai__inputbox flexbox flex-col">
      <div class="v3ai__editor flexbox">
        <a-textarea v-model="editorText" :auto-size="autoSize" placeholder="想问点什么..." spellcheck="false" @input="handleInput" />
      </div>
      <!-- 操作栏 -->
      <div class="v3ai__tools flexbox flex-alignc">
        <div class="option flex1 flexbox">
          <div class="btn" @click="isDeep =! isDeep"><i class="iconfont ai-deepthink"></i> 深度思考 <span class="fs-12">(R1)</span></div>
          <div class="btn" @click="isNetwork =! isNetwork"><i class="iconfont ai-network"></i> 联网</div>
        </div>
        <a-dropdown trigger="hover" :show-arrow="false" position="lb" :content-style="{'min-width': '250px'}">
          <a-button shape="circle"><icon-attachment size="18" /></a-button>
          <template #content>
            <a-dgroup>
              <template #title><div style="margin-bottom: 5px;">从网盘添加</div></template>
              <a-doption value="wx"><icon-more /> 选择网盘文件</a-doption>
            </a-dgroup>
            <a-dgroup>
              <template #title><div style="margin-bottom: 5px;">从本地添加</div></template>
              <a-doption value="wx"><icon-apps /> 上传文件</a-doption>
              <a-dsubmenu trigger="hover" position="rb" :popup-translate="[8, 8]" value="option-1">
                <template #default><icon-apps /> 上传代码</template>
                <template #content>
                  <a-doption value="pyq"><icon-apps /> 代码文件</a-doption>
                  <a-doption value="qq"><icon-apps /> 代码文件夹</a-doption>
                  <a-doption value="qq"><icon-apps /> GitHub仓库</a-doption>
                </template>
              </a-dsubmenu>
            </a-dgroup>
          </template>
        </a-dropdown>
        <a-dropdown :show-arrow="false" position="top" :popup-translate="[-5, -5]" :content-style="{'min-width': '150px'}">
          <a-button shape="circle"><icon-plus size="18" /></a-button>
          <template #content>
            <a-doption value="image"><icon-file-image /> 图片</a-doption>
            <a-doption value="file"><icon-file /> 本地文件</a-doption>
            <a-doption value="pdf"><icon-file-pdf /> PDF文档分析</a-doption>
            <a-doption value="page"><icon-cloud /> 网页总结</a-doption>
          </template>
        </a-dropdown>
        <a-divider direction="vertical" style="margin: 0 7px;" />
        <a-button class="submit" type="primary" shape="circle" @click="handleSubmit">
          <icon-send v-if="!sessionstate.loading" size="20" />
          <icon-loading v-else size="18" />
        </a-button>
      </div>
    </div>
  </div>
</template>

tauri2-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',
  stream: false, // 非流式输出
  max_tokens: 8192, // 限制一次请求中模型生成 completion 的最大 token 数(默认使用 4096)
  temperature: 0.4, // 严谨采样 越低越严谨(默认1)
})

for循环fen分段返回流结果。

代码语言:actionscript
复制
// 使用数组存储chunk内容,提高拼接效率
let chunks = []
let lastUpdate = 0

// 处理流式输出
for await (const chunk of completion) {
  const content = chunk.choices[0]?.delta?.content || ''
  if(content) {
    chunks.push(content)
    // 限制更新频率:每100ms最多更新一次
    const now = Date.now()
    if (now - lastUpdate > 100) {
      sessionstate.updateSession(botKey, {content: chunks.join('')})
      lastUpdate = now
      // 滚动最底部
      if (sessionstate.reachBottom) {
        props.scrollBottom()
      }
    }
  }
  if(chunk.choices[0]?.finish_reason === 'stop') {
    sessionstate.loading = false
    // 确保最终内容完整更新
    sessionstate.updateSession(botKey, {content: chunks.join(''), loading: false})
    if (sessionstate.reachBottom) {
      props.scrollBottom()
    }
  }
}

基于uniapp+deepseek+vue3跨平台ai流式对话:https://cloud.tencent.com/developer/article/2518214

electron35+deepseek桌面端ai模板:https://cloud.tencent.com/developer/article/2514843

vue3.5+deepseek网页版ai流式对话:https://cloud.tencent.com/developer/article/2508594

DeepSeek-Vue3基于vite6+vant4仿deepseek/Kimi流式AI聊天小助手

flutter3.27+getx仿抖音app短视频商城:https://cloud.tencent.com/developer/article/2493971

Electron32桌面端os系统:https://cloud.tencent.com/developer/article/2449406

electron31+vue3客户端聊天Exe实例:https://cloud.tencent.com/developer/article/2435159

tauri2.0+vue3客户端admin后台系统:https://cloud.tencent.com/developer/article/2458392

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

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 技术栈
  • 项目框架结构
  • 项目环境变量.env
  • 项目入口main.js
  • 项目结构模板
  • tauri2配置
  • 自定义ai编辑框
  • tauri2-deepseek流式对话
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档