logo

基于Vue3构建Deepseek/ChatGPT流式聊天界面:API对接与开发实践指南

作者:Nicky2025.09.17 15:48浏览量:0

简介:本文详细解析如何使用Vue3开发仿Deepseek/ChatGPT的流式聊天AI界面,并完成与Deepseek/OpenAI API的对接,涵盖界面设计、流式响应处理、错误处理及优化策略。

基于Vue3构建Deepseek/ChatGPT流式聊天界面:API对接与开发实践指南

一、项目背景与需求分析

随着生成式AI技术的普及,用户对交互体验的要求日益提升。Deepseek与ChatGPT等AI模型通过流式响应(Streaming Response)技术,实现了边生成边显示的效果,显著提升了对话的流畅性。本文以Vue3为核心框架,结合Composition API与TypeScript,实现一个支持流式响应的聊天界面,并完成与Deepseek/OpenAI API的对接。

核心需求

  1. 流式响应:实时显示AI生成的文本,避免长时间等待。
  2. 界面仿制:复现Deepseek/ChatGPT的简洁交互风格。
  3. API兼容:支持Deepseek与OpenAI API的灵活切换。
  4. 错误处理网络中断、API限额等异常场景的友好提示。

二、技术选型与架构设计

1. 前端框架选择

Vue3的Composition API与响应式系统天然适合处理动态数据流。结合<script setup>语法,代码更简洁。

2. 核心依赖

  • axios:HTTP请求库,支持请求取消与拦截器。
  • EventSource:处理Server-Sent Events(SSE),实现流式响应。
  • Pinia:状态管理,替代Vuex,简化全局状态共享。

3. 架构分层

  1. src/
  2. ├── api/ # API请求封装
  3. ├── deepseek.ts
  4. └── openai.ts
  5. ├── components/ # UI组件
  6. ├── ChatBubble.vue
  7. └── MessageList.vue
  8. ├── composables/ # 组合式函数
  9. └── useStream.ts
  10. ├── stores/ # Pinia状态
  11. └── chat.ts
  12. └── App.vue # 根组件

三、流式聊天界面实现

1. 界面布局设计

采用“消息气泡+输入框”的经典布局,关键点:

  • 消息方向:用户消息右对齐,AI消息左对齐。
  • 动态高度:消息容器自动扩展,避免滚动条跳动。
  • 加载指示器:流式响应时显示“正在生成…”动画。
  1. <!-- MessageList.vue -->
  2. <template>
  3. <div class="message-container">
  4. <div
  5. v-for="(msg, index) in messages"
  6. :key="index"
  7. :class="['message', msg.sender]"
  8. >
  9. <div v-if="msg.streaming" class="streaming-dots">•••</div>
  10. <div v-else>{{ msg.content }}</div>
  11. </div>
  12. </div>
  13. </template>
  14. <style scoped>
  15. .message {
  16. margin: 12px;
  17. padding: 10px 15px;
  18. border-radius: 18px;
  19. max-width: 80%;
  20. }
  21. .message.user {
  22. background: #e3f2fd;
  23. align-self: flex-end;
  24. }
  25. .message.ai {
  26. background: #f1f1f1;
  27. align-self: flex-start;
  28. }
  29. .streaming-dots {
  30. font-size: 16px;
  31. animation: blink 1.4s infinite;
  32. }
  33. @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
  34. </style>

2. 流式响应处理

使用EventSource监听服务器推送的文本片段,关键代码:

  1. // useStream.ts
  2. import { ref, onUnmounted } from 'vue';
  3. export function useStream(url: string, onMessage: (chunk: string) => void) {
  4. const eventSource = new EventSource(url);
  5. const isStreaming = ref(true);
  6. eventSource.onmessage = (event) => {
  7. if (event.data === '[DONE]') {
  8. isStreaming.value = false;
  9. eventSource.close();
  10. return;
  11. }
  12. onMessage(event.data);
  13. };
  14. eventSource.onerror = () => {
  15. isStreaming.value = false;
  16. eventSource.close();
  17. };
  18. onUnmounted(() => {
  19. eventSource.close();
  20. });
  21. return { isStreaming };
  22. }

3. API对接实现

Deepseek API示例

  1. // api/deepseek.ts
  2. import axios from 'axios';
  3. export async function callDeepseek(prompt: string) {
  4. const response = await axios.post('https://api.deepseek.com/v1/chat', {
  5. model: 'deepseek-chat',
  6. messages: [{ role: 'user', content: prompt }],
  7. stream: true,
  8. });
  9. return new ReadableStream({
  10. start(controller) {
  11. const reader = response.data.body.getReader();
  12. function pump() {
  13. reader.read().then(({ done, value }) => {
  14. if (done) {
  15. controller.close();
  16. return;
  17. }
  18. const text = new TextDecoder().decode(value);
  19. controller.enqueue(text);
  20. pump();
  21. });
  22. }
  23. pump();
  24. },
  25. });
  26. }

OpenAI API示例

  1. // api/openai.ts
  2. export async function callOpenAI(prompt: string) {
  3. const eventSource = new EventSource(
  4. `https://api.openai.com/v1/chat/completions?stream=true`,
  5. {
  6. headers: {
  7. 'Authorization': `Bearer ${import.meta.env.VITE_OPENAI_KEY}`,
  8. 'Content-Type': 'application/json',
  9. },
  10. method: 'POST',
  11. body: JSON.stringify({
  12. model: 'gpt-3.5-turbo',
  13. messages: [{ role: 'user', content: prompt }],
  14. stream: true,
  15. }),
  16. }
  17. );
  18. return eventSource;
  19. }

四、核心功能实现

1. 消息状态管理

使用Pinia管理消息列表与当前输入:

  1. // stores/chat.ts
  2. import { defineStore } from 'pinia';
  3. export const useChatStore = defineStore('chat', {
  4. state: () => ({
  5. messages: [] as { sender: 'user' | 'ai'; content: string; streaming?: boolean }[],
  6. input: '',
  7. }),
  8. actions: {
  9. addUserMessage(content: string) {
  10. this.messages.push({ sender: 'user', content });
  11. this.input = '';
  12. },
  13. addAIMessage(content: string, streaming = false) {
  14. this.messages.push({ sender: 'ai', content, streaming });
  15. },
  16. },
  17. });

2. 发送消息与流式处理

  1. <!-- App.vue -->
  2. <script setup>
  3. import { useChatStore } from './stores/chat';
  4. import { useStream } from './composables/useStream';
  5. const chatStore = useChatStore();
  6. const { isStreaming } = useStream(apiUrl, (chunk) => {
  7. const lastMsg = chatStore.messages[chatStore.messages.length - 1];
  8. if (lastMsg?.sender === 'ai' && lastMsg.streaming) {
  9. lastMsg.content += chunk;
  10. }
  11. });
  12. const sendMessage = async () => {
  13. if (!chatStore.input.trim()) return;
  14. chatStore.addUserMessage(chatStore.input);
  15. chatStore.addAIMessage('', true); // 初始化流式消息
  16. try {
  17. // 根据配置调用Deepseek或OpenAI
  18. const response = await callDeepseek(chatStore.input);
  19. // 或 const response = await callOpenAI(chatStore.input);
  20. // 处理响应...
  21. } catch (error) {
  22. chatStore.messages.pop(); // 移除未完成的AI消息
  23. alert('API调用失败');
  24. }
  25. };
  26. </script>

五、优化与错误处理

1. 性能优化

  • 防抖输入:避免频繁触发API请求。
  • 虚拟滚动:长消息列表时使用vue-virtual-scroller
  • 请求取消:切换对话时取消未完成的流式请求。
  1. // api/utils.ts
  2. import axios from 'axios';
  3. const source = axios.CancelToken.source();
  4. export function cancelRequest() {
  5. source.cancel('请求已取消');
  6. }

2. 错误处理策略

  • 网络中断:重试机制或显示离线模式。
  • API限额:提示用户升级套餐或切换模型。
  • 内容过滤:检测敏感词并中断响应。

六、部署与扩展建议

1. 环境变量配置

  1. # .env.production
  2. VITE_API_BASE_URL=https://api.example.com
  3. VITE_OPENAI_KEY=sk-xxxxxxxxxx

2. 多模型支持

通过配置文件动态切换API:

  1. // config.ts
  2. export const API_CONFIG = {
  3. default: 'deepseek',
  4. models: {
  5. deepseek: {
  6. url: 'https://api.deepseek.com',
  7. auth: null, // 或Bearer Token
  8. },
  9. openai: {
  10. url: 'https://api.openai.com',
  11. auth: import.meta.env.VITE_OPENAI_KEY,
  12. },
  13. },
  14. };

3. 扩展功能

  • 上下文管理:保存对话历史至本地存储
  • 插件系统:支持图片生成、代码解释等扩展。
  • 多语言:通过i18n实现国际化。

七、总结与展望

本文通过Vue3实现了仿Deepseek/ChatGPT的流式聊天界面,并完成了与主流AI API的对接。核心价值在于:

  1. 低延迟交互:流式响应提升用户体验。
  2. 技术复用:组件与逻辑可迁移至其他AI应用。
  3. API抽象:支持多模型无缝切换。

未来可探索的方向包括:

  • WebSocket替代SSE实现更低延迟。
  • 端到端加密保障对话隐私。
  • 结合WebAssembly优化本地推理性能。

通过模块化设计与清晰的分层架构,本项目可作为企业级AI聊天应用的开发模板,快速适配不同业务场景。

相关文章推荐

发表评论