基于vue3.5+deepseek+vant4+markdown仿DeepSeek-R1流式输出ai聊天界面

Vite-DeepseekChat原创新作vue3.5+vant4仿deepseek流式打字ai对话。

2025年重磅ai大模型对话,基于Vue3+Vite6+OpenAI对接DeepSeek聊天小助手模板,支持流式打字返回效果、浅色/暗黑主题模式、代码高亮显示、针对移动端+PC端适配处理。

在这里插入图片描述

运用技术

  • 编辑器:vscode
  • 技术框架:vite6.2.0 + vue3.5.13 + vue-router4.5.0
  • AI框架:DeepSeek-R1 + OpenAI
  • 组件库:Vant^4.9.17 (有赞vue3移动端组件库)
  • 状态管理:pinia^3.0.1
  • 高亮插件:highlight.js^11.11.1
  • markdown解析:markdown-it
  • 本地缓存:pinia-plugin-persistedstate^4.2.0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

vue3-deepseek支持暗黑+浅色两种模式主题。

在这里插入图片描述

项目结构目录

使用最新版vite6.x+vue3.5搭建项目模板,集成deepseek-chat模型,采用流式stream输出返回结果,全部采用vue3 setup语法编码开发。

在这里插入图片描述
在这里插入图片描述
vue3-deepseek-chat项目已经同步至我的原创作品,感兴趣的可以去瞅瞅~
Vue3+DeepSeek+Vant4智能聊天AI流式对话模板

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

deepseek-vue3chat同样支持在pc端显示,以750px像素宽度布局。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

环境变量配置

只需要在deepseek官网申请apiKey,替换下.env文件里的VITE_DEEPSEEK_API_KEY即可体验deepseek-chat模型功能。

# 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配置文件

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')

主模板布局

在这里插入图片描述
主体会话模板分为顶部导航+会话内容区+底部操作区三个大模块。

<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 flex-c" :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 flex-c"><span class="flex1">你可以这样问</span><span class="flex-c" @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>

在这里插入图片描述

pinia本地会话存储

在这里插入图片描述
使用pinia进行状态管理,配合pinia-plugin-persistedstate插件本地存储会话数据。

/**
 * 状态管理 Pinia
 * @author andy
 */

import { createPinia } from 'pinia'
// 引入pinia本地持久化存储
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

export default pinia
export const chatStore = defineStore('chat', {
  state: () => ({
    // 聊天会话记录
    sessionId: '',
    session: []
  }),
  getters: {},
  actions: {
    // 创建新对话
    createSession(ssid) {
      this.sessionId = ssid
      this.session.unshift({
        sessionId: ssid,
        title: '',
        data: []
      })
    },

    // 新增会话
    addSession(message) {
      // 判断当前会话uuid是否存在,不存在创建新对话
      if(!this.sessionId) {
        const ssid = guid()
        this.createSession(ssid)
      }
      this.session.map(item => {
        if(item.sessionId == this.sessionId) {
          if(!item.title) {
            item.title = message.content
          }
          item.data.push(message)
        }
      })
    },

    // 更新某一条会话
    updateSession(key, content) {
      this.session.map(item => {
        if(item.sessionId == this.sessionId) {
          if(item.data && !isEmpty(item.data)) {
            item.data.map((it, index) => {
              if(it.key == key) {
                it.content = content
              }
            })
          }
        }
      })
    },

    // 获取会话
    getSession() {
      return this.session.find(item => item.sessionId == this.sessionId)
    },

    // 移除会话
    removeSession(ssid) {
      const index = this.session.findIndex(item => item?.sessionId === ssid)
      if(index > -1) {
        this.session.splice(index, 1)
      }
      this.sessionId = ''
    },
    // 删除某一条会话
    deleteSession(key) {
      this.session.map(item => {
        if(item.sessionId == this.sessionId) {
          if(item.data && !isEmpty(item.data)) {
            item.data.map((it, index) => {
              if(it.key == key) {
                item.data.splice(index, 1)
              }
            })
          }
        }
      })
    },

    // 清空会话
    clearSession() {
      this.session = []
      this.sessionId = ''
    }
  },
  // 本地持久化存储(默认存储localStorage)
  persist: true
  /* persist: {
    // key: 'chatStore', // 不设置则是默认app
    storage: localStorage,
    paths: ['ssid', 'sessions'] // 设置缓存键
  } */
})

在这里插入图片描述

vue3+deepseek api流式输出

  • 正常输出
const completion = await openai.chat.completions.create({
  messages: [
    {role: 'user', content: editorValue}
  ],
  model: 'deepseek-chat', // deepseek-chat对话模型 deepseek-reasoner推理模型
  stream: false, // 流式输出
  max_tokens: 8192, // 限制一次请求中模型生成 completion 的最大 token 数(默认使用 4096)
  temperature: 0.4, // 严谨采样 越低越严谨(默认1)
})
// 处理返回数据
console.log(completion.choices[0].message.content)
  • 流式stream返回
// 处理流式输出
let content = ''
for await (const chunk of completion) {
  content += chunk.choices[0].delta.content;
  chatState.updateSession(uniKey, content)
  if(chunk.choices[0].finish_reason == 'stop') {
    loading.value = false
  }
  if(props.reachBottom) {
    props.scrollBottom()
  }
}

综上就是vue3接入deepseek实现聊天ai助手的一些知识分享,希望对大家有所帮助!

往期热文

在这里插入图片描述

<think>好的,我现在需要帮用户做一个微信小程序项目,要求实现AI对话界面,接入深度求索(DeepSeek)的官方API,功能和官网一样,外观大气简约。首先,我需要理清楚整个项目的步骤和需要注意的地方。 首先,用户的需求是做一个类似DeepSeek官网的AI对话功能的小程序。我需要考虑前端界面设计、后端API对接、以及微信小程序的整体架构。可能需要分步骤来实现,比如先注册小程序,然后设计界面,再处理API调用,最后测试和发布。 第一步,注册微信小程序账号。用户需要有一个已注册的账号,并且完成开发者资质认证,因为涉及到网络请求,必须使用HTTPS,所以需要配置合法域名。这里可能需要提醒用户去微信公众平台注册并认证。 接下来是前端界面设计。用户希望外观大气简约,参考DeepSeek官网。可能需要设计一个聊天界面,包含消息列表、输入框和发送按钮。消息列表需要区分用户和AI的消息,用不同的样式显示。输入框可能需要支持多行输入,发送按钮可以设计成图标或者文字。颜色搭配方面,可能选择深蓝色或科技感强的颜色,保持简洁。 然后是API对接。需要接入DeepSeek的官方API,用户需要提供API密钥。这里需要查阅DeepSeek的API文档,了解请求格式、参数和返回数据结构。在微信小程序中,使用wx.request方法发送POST请求到API端点,携带必要的headers,比如Authorization和Content-Type。需要注意异步处理,可能使用Promise或async/await来优化代码结构。 在处理API响应时,可能需要支持流式传输,如果DeepSeek的API支持类似ChatGPT流式返回,这样可以实现逐字显示的效果。不过微信小程序的WebSocket或者持续请求可能需要额外处理,或者使用分块接收数据。如果没有流式支持,可能需要一次性获取全部响应再显示。 同时,要考虑网络请求的安全性和错误处理。比如,处理API调用失败的情况,显示错误提示,并可能重试。用户的输入也需要做合法性校验,防止空消息或过长文本。 后端部分,如果DeepSeek的API可以直接从小程序前端调用,可能不需要额外搭建后端服务器。但需要注意小程序的AppSecret和API密钥的安全,避免暴露在前端代码中。如果DeepSeek要求API密钥不能放在前端,可能需要搭建一个中转服务器,小程序前端请求自己的服务器,再由服务器转发请求到DeepSeek。这涉及到服务器搭建,比如使用Node.js、Python等,但用户可能希望简化步骤,所以需要确认DeepSeek的API是否允许前端直接调用。 另外,实现历史对话记录的功能,可能需要使用小程序的本地存储,比如wx.setStorageSync来保存聊天记录。但本地存储容量有限,如果用户需要云存储,可能需要接入数据库,比如微信云开发或第三方数据库服务,这会增加复杂度。 性能优化方面,需要注意消息列表的渲染效率,使用好的数据结构和渲染方法,避免卡顿。特别是当消息较多时,需要确保滚动流畅。 测试环节,需要使用微信开发者工具进行模拟器测试,真机调试,检查不同设备的兼容性。特别是API请求在不同网络环境下的表现,比如慢速网络下的超时处理。 最后,发布小程序需要提交审核,确保内容符合微信的规定,比如不涉及敏感信息,AI对话内容合法等。可能需要内容安全审核接口,比如调用微信的imgSecCheck和msgSecCheck,防止用户输入或AI生成违规内容。 可能遇到的难点包括API密钥的安全处理、流式响应的实现、历史数据的管理以及审核合规性。需要逐一解决这些问题,同时保持代码结构清晰,便于维护和迭代。 总结下来,步骤大概是:注册小程序、设计UI、接入API、处理数据存储、实现交互功能、测试优化、发布上线。每个步骤都需要详细考虑可能出现的问题,并找到合适的解决方案。同时,保持与用户的沟通,确保需求被正确理解和实现。</think>以下是开发微信小程序实现AI对话功能的分步指南,包含DeepSeek API对接和界面设计要点: --- ### 一、前期准备 1. **注册小程序** - 前往[微信公众平台](https://mp.weixin.qq.com/)注册账号 - 完成企业资质认证(需300元认证费,个人主体无法使用网络API) 2. **获取DeepSeek API** - 登录[DeepSeek官网](https://www.deepseek.com/)申请开发者权限 - 获取API_KEY和接口文档(请求示例): ```javascript // 典型请求结构 { "model": "deepseek-chat", "messages": [ {"role": "user", "content": "你好"} ] } ``` --- ### 二、界面设计(WXML+WXSS) ```html <!-- pages/chat/chat.wxml --> <view class="container"> <!-- 消息区域 --> <scroll-view scroll-y class="message-list"> <block wx:for="{{messages}}" wx:key="index"> <view class="message {{item.role}}"> <image wx:if="{{item.role === &#39;assistant&#39;}}" src="/images/ai-avatar.png" /> <text class="content">{{item.content}}</text> </view> </block> </scroll-view> <!-- 输入区域 --> <view class="input-area"> <textarea auto-height bindinput="onInput" value="{{inputText}}" placeholder="输入你的问题..." /> <button class="send-btn" bindtap="sendMessage"> <image src="/icons/send.png" /> </button> </view> </view> ``` **样式建议**: - 主色调:`#1A237E`(深蓝科技感) - AI消息气泡:浅灰色背景 + 左侧AI头像 - 用户消息:蓝色右对齐气泡 - 使用`rpx`单位保证多设备适配 --- ### 三、核心逻辑实现 ```javascript // pages/chat/chat.js Page({ data: { messages: [], inputText: &#39;&#39;, apiKey: &#39;sk-your-api-key&#39; // 正式环境需加密存储 }, sendMessage() { const newMsg = {role: &#39;user&#39;, content: this.data.inputText}; this.setData({ messages: [...this.data.messages, newMsg], inputText: &#39;&#39; }); wx.request({ url: &#39;https://api.deepseek.com/v1/chat/completions&#39;, method: &#39;POST&#39;, header: { &#39;Content-Type&#39;: &#39;application/json&#39;, &#39;Authorization&#39;: `Bearer ${this.data.apiKey}` }, data: { model: "deepseek-chat", messages: this.data.messages }, success: (res) => { const aiResponse = res.data.choices[0].message; this.setData({ messages: [...this.data.messages, aiResponse] }); } }); } }) ``` --- ### 四、关键优化点 1. **流式输出实现** ```javascript // 使用WebSocket实现逐字显示 const socket = wx.connectSocket({ url: &#39;wss://api.deepseek.com/v1/chat/stream&#39; }); socket.onMessage(res => { const partialResponse = JSON.parse(res.data); this.setData({ messages: this.data.messages.map((msg, index) => index === this.data.messages.length -1 ? {...msg, content: msg.content + partialResponse.choices[0].delta.content} : msg ) }); }); ``` 2. **安全措施** - 使用微信云函数转发API请求,避免暴露API_KEY - 启用HTTPS并配置合法域名 - 接入内容安全API(需额外开发) --- ### 五、部署流程 1. 配置服务器域名:登录小程序后台添加`api.deepseek.com`到request合法域名 2. 本地调试:使用微信开发者工具模拟对话 3. 提交审核:准备AI类目资质材料(通常需要《增值电信业务经营许可证》) --- ### 六、扩展功能建议 - 对话历史管理(使用云开发数据库) - Markdown格式渲染(需引入第三方解析库) - 预设prompt模板 - 打字机动画效果 开发周期预估:基础功能约2周,含安全加固和优化需3-4周。建议使用`WeUI`组件库加速开发。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoyan_2018

你的鼓励将是我持续作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值