简介:本文详细解析Vue.js项目如何高效对接DeepSeek API接口,涵盖环境配置、核心代码实现、错误处理及优化策略,提供可复用的技术方案。
DeepSeek API作为领先的AI服务接口,提供自然语言处理、图像识别等核心能力。在Vue.js项目中集成该API,可实现智能问答、内容生成等高价值功能。典型应用场景包括:
技术实现层面需解决三大挑战:
npm init vue@latest deepseek-democd deepseek-demonpm install axios vue-router pinia
推荐采用环境变量存储敏感信息:
# .env.localVUE_APP_DEEPSEEK_API_KEY=your_api_key_hereVUE_APP_API_BASE_URL=https://api.deepseek.com/v1
创建src/utils/apiClient.js:
import axios from 'axios'const apiClient = axios.create({baseURL: process.env.VUE_APP_API_BASE_URL,headers: {'Authorization': `Bearer ${process.env.VUE_APP_DEEPSEEK_API_KEY}`,'Content-Type': 'application/json'}})// 请求拦截器apiClient.interceptors.request.use(config => {// 可添加全局参数如语言设置return config})// 响应拦截器apiClient.interceptors.response.use(response => response.data,error => {if (error.response?.status === 401) {// 处理鉴权失败}return Promise.reject(error)})export default apiClient
创建src/composables/useTextGeneration.js:
import { ref } from 'vue'import apiClient from '@/utils/apiClient'export function useTextGeneration() {const loading = ref(false)const result = ref('')const error = ref(null)const generateText = async (prompt, maxTokens = 1000) => {try {loading.value = trueerror.value = nullconst response = await apiClient.post('/text/generate', {prompt,max_tokens: maxTokens,temperature: 0.7})result.value = response.generated_text} catch (err) {error.value = err.message || '生成失败'} finally {loading.value = false}}return {generateText,result,loading,error}}
<template><div class="text-gen"><textarea v-model="prompt" placeholder="输入提示词..."></textarea><button @click="handleGenerate" :disabled="loading">{{ loading ? '生成中...' : '生成文本' }}</button><div v-if="error" class="error">{{ error }}</div><div v-if="result" class="result">{{ result }}</div></div></template><script setup>import { ref } from 'vue'import { useTextGeneration } from '@/composables/useTextGeneration'const prompt = ref('')const { generateText, result, loading, error } = useTextGeneration()const handleGenerate = async () => {if (!prompt.value.trim()) returnawait generateText(prompt.value)}</script>
对于长文本生成场景,需实现流式接收:
// 修改apiClient配置const streamClient = axios.create({baseURL: process.env.VUE_APP_API_BASE_URL,headers: {'Authorization': `Bearer ${process.env.VUE_APP_DEEPSEEK_API_KEY}`,'Accept': 'text/event-stream'},responseType: 'stream'})// 在composable中实现export function useStreamGeneration() {const chunks = ref([])const startStream = async (prompt) => {const response = await streamClient.post('/text/stream', { prompt })return new ReadableStream({async start(controller) {for await (const chunk of response.data) {const text = chunk.toString()if (text.includes('[DONE]')) breakconst data = text.replace('data: ', '').trim()if (data) {controller.enqueue(data)chunks.value.push(data)}}controller.close()}})}return { chunks, startStream }}
建立完善的错误分类体系:
const handleApiError = (error) => {if (error.response) {switch (error.response.status) {case 400: return '请求参数错误'case 401: return '未授权,请检查API密钥'case 429: return '请求过于频繁,请稍后重试'case 500: return '服务器错误,请联系支持'default: return '未知错误'}} else if (error.request) {return '网络错误,请检查连接'} else {return '请求配置错误'}}
import { throttle } from 'lodash-es'// 在composable中应用const throttledGenerate = throttle(generateText, 3000, { leading: true, trailing: false })
使用Pinia实现请求缓存:
// stores/apiCache.jsimport { defineStore } from 'pinia'export const useApiCache = defineStore('apiCache', {state: () => ({cache: new Map()}),actions: {getCache(key) {return this.cache.get(key)},setCache(key, value, ttl = 3600000) {this.cache.set(key, {data: value,expire: Date.now() + ttl})},cleanup() {const now = Date.now()this.cache.forEach((value, key) => {if (value.expire < now) {this.cache.delete(key)}})}}})
const sanitizeInput = (input) => {return input.replace(/<[^>]*>/g, '') // 简单XSS防护.substring(0, 2000) // 限制长度}
src/├── api/│ └── deepseek.js # API方法封装├── composables/│ ├── useTextGeneration.js│ └── useStreamGeneration.js├── stores/│ └── apiCache.js # Pinia状态管理├── utils/│ ├── apiClient.js # Axios实例│ └── errorHandler.js # 错误处理└── views/└── DeepSeekDemo.vue # 主界面组件
通过以上架构设计,Vue.js项目可稳定高效地对接DeepSeek API,实现智能化的业务功能。实际开发中应根据具体需求调整实现细节,重点关注错误处理和性能优化这两个关键环节。