咨询热线:15911225507
龙霄
登录
首页-所有文章-Nuxt.js-正文

Nuxt 3 项目中集成 AI API 实现智能内容生成与多语言翻译

龙霄龙霄
Nuxt.js
1天前
0
0
4

随着大语言模型(LLM)技术的飞速发展,越来越多的 Web 应用开始集成 AI 能力——从智能客服、内容摘要到自动翻译,AI 正在重塑前端开发的工作方式。对于使用 Nuxt 3 构建全栈应用的开发者来说,如何在项目中安全、高效地调用 AI API 是一个值得深入探讨的话题。本文将带你一步步实现在 Nuxt 3 项目中集成 OpenAI 兼容 API,完成智能内容生成与多语言翻译功能。

一、为什么选择服务端调用

在 Nuxt 3 项目中调用 AI API,首要考虑的是安全性。所有主流 AI 服务(OpenAI、Claude、DeepSeek 等)都要求通过 API Key 进行身份认证。如果将 API Key 写在前端代码中,任何人都能通过浏览器开发者工具获取你的密钥,造成严重的安全隐患和费用损失。

Nuxt 3 的 server/api 目录提供了完美的解决方案:API 路由运行在服务端(Nitro 引擎),API Key 存储在 .env 环境变量中,前端通过 $fetch 调用自己的接口,再由服务端转发请求到 AI 服务。这样 API Key 永远不会暴露给客户端。

二、环境准备

首先在 Nuxt 3 项目根目录创建 .env 文件:

NUXT_OPENAI_API_KEY=sk-your-api-key-here
NUXT_OPENAI_BASE_URL=https://api.openai.com/v1
NUXT_AI_MODEL=gpt-4o-mini

nuxt.config.ts 中不需要额外配置,Nitro 会自动读取以 NUXT_ 开头的环境变量并通过 useRuntimeConfig() 暴露给服务端。

三、创建 AI 服务层

为了代码复用和维护性,我们先创建一个通用的 AI 服务封装。在 server/utils/ai.ts 中:

interface ChatMessage {
  role: 'system' | 'user' | 'assistant'
  content: string
}

interface ChatOptions {
  messages: ChatMessage[]
  temperature?: number
  maxTokens?: number
  stream?: boolean
}

export async function chatCompletion(options: ChatOptions) {
  const config = useRuntimeConfig()
  
  const response = await $fetch(`${config.openaiBaseUrl}/chat/completions`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${config.openaiApiKey}`,
      'Content-Type': 'application/json',
    },
    body: {
      model: config.aiModel,
      messages: options.messages,
      temperature: options.temperature ?? 0.7,
      max_tokens: options.maxTokens ?? 2048,
      stream: options.stream ?? false,
    },
  })
  
  return response
}

四、实现内容生成 API 路由

创建 server/api/ai/generate.post.ts

export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  const { prompt, systemPrompt } = body

  if (!prompt) {
    throw createError({
      statusCode: 400,
      message: 'prompt 参数不能为空',
    })
  }

  try {
    const result = await chatCompletion({
      messages: [
        { role: 'system', content: systemPrompt || '你是一个专业的技术内容创作者。' },
        { role: 'user', content: prompt },
      ],
      temperature: 0.8,
    })

    return {
      success: true,
      content: result.choices[0].message.content,
      usage: result.usage,
    }
  } catch (error: any) {
    throw createError({
      statusCode: 500,
      message: error.message || 'AI 服务调用失败',
    })
  }
})

五、实现流式响应(SSE)

对于内容生成场景,流式响应能大幅提升用户体验——用户可以看到文字逐字生成,而不是等待几秒钟后一次性展示。创建 server/api/ai/stream.post.ts

export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  const { prompt, systemPrompt } = body
  const config = useRuntimeConfig()

  setHeader(event, 'Content-Type', 'text/event-stream')
  setHeader(event, 'Cache-Control', 'no-cache')
  setHeader(event, 'Connection', 'keep-alive')

  const response = await fetch(
    `${config.openaiBaseUrl}/chat/completions`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${config.openaiApiKey}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        model: config.aiModel,
        messages: [
          { role: 'system', content: systemPrompt || '你是一个专业助手。' },
          { role: 'user', content: prompt },
        ],
        stream: true,
      }),
    }
  )

  const reader = response.body?.getReader()
  if (!reader) throw createError({ statusCode: 500 })

  const decoder = new TextDecoder()
  let buffer = ''

  while (true) {
    const { done, value } = await reader.read()
    if (done) {
      sendEventStream(event, { data: '[DONE]' })
      break
    }

    buffer += decoder.decode(value, { stream: true })
    const lines = buffer.split('n')
    buffer = lines.pop() || ''

    for (const line of lines) {
      if (line.startsWith('data: ') && line !== 'data: [DONE]') {
        try {
          const parsed = JSON.parse(line.slice(6))
          const content = parsed.choices[0]?.delta?.content
          if (content) {
            sendEventStream(event, { data: content })
          }
        } catch {}
      }
    }
  }
})

六、前端 Vue 组件集成

创建一个可复用的 AI 内容生成组件:

<script setup lang="ts">
const prompt = ref('')
const generatedContent = ref('')
const isLoading = ref(false)
const isStreaming = ref(false)

async function generateContent() {
  if (!prompt.value.trim()) return
  
  isLoading.value = true
  generatedContent.value = ''
  
  try {
    const data = await $fetch('/api/ai/generate', {
      method: 'POST',
      body: { prompt: prompt.value },
    })
    generatedContent.value = data.content
  } catch (error) {
    console.error('生成失败:', error)
  } finally {
    isLoading.value = false
  }
}

async function generateStream() {
  if (!prompt.value.trim()) return
  
  isStreaming.value = true
  generatedContent.value = ''
  
  const eventSource = new EventSource(
    `/api/ai/stream?${new URLSearchParams({ prompt: prompt.value })}`
  )
  
  eventSource.onmessage = (event) => {
    if (event.data === '[DONE]') {
      eventSource.close()
      isStreaming.value = false
      return
    }
    generatedContent.value += event.data
  }
  
  eventSource.onerror = () => {
    eventSource.close()
    isStreaming.value = false
  }
}
</script>

七、多语言翻译实现

基于上述 AI 服务层,实现多语言翻译非常简单。创建 server/api/ai/translate.post.ts

export default defineEventHandler(async (event) => {
  const { text, targetLang, sourceLang } = await readBody(event)

  const langMap: Record<string, string> = {
    'zh-cn': '简体中文',
    'zh-tw': '繁体中文',
    'en': 'English'
  }

  const result = await chatCompletion({
    messages: [
      {
        role: 'system',
        content: `你是一个专业翻译。将用户输入的${sourceLang ? langMap[sourceLang] || sourceLang : ''}内容翻译为${langMap[targetLang] || targetLang}。只返回翻译结果,不要添加任何解释。`,
      },
      { role: 'user', content: text },
    ],
    temperature: 0.3,
  })

  return {
    success: true,
    translation: result.choices[0].message.content,
    sourceLang,
    targetLang,
  }
})

八、错误处理与速率限制

生产环境中,AI API 调用可能因各种原因失败——网络超时、速率限制、余额不足等。我们需要健壮的错误处理机制。

server/utils/ai.ts 中添加重试逻辑:

export async function chatCompletionWithRetry(
  options: ChatOptions,
  maxRetries = 3
) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await chatCompletion(options)
    } catch (error: any) {
      if (error.statusCode === 429) {
        // 速率限制,等待后重试
        const retryAfter = error.headers?.get('retry-after') || 5
        await new Promise(r => setTimeout(r, retryAfter * 1000))
        continue
      }
      if (i === maxRetries - 1) throw error
      await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)))
    }
  }
}

同时建议在 Nitro 配置中设置请求体大小限制:

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    routeRules: {
      '/api/ai/**': {
        maxBodySize: '1mb',
      },
    },
  },
})

九、总结

通过 Nuxt 3 的 Server API 路由,我们以安全、高效的方式集成了 AI 能力。核心要点回顾:

  • 安全性:API Key 存储在服务端环境变量,绝不暴露给客户端
  • 流式响应:使用 SSE 实现实时内容生成,提升用户体验
  • 可复用架构:通过服务层封装,content generation 和 translation 共享同一套 AI 调用逻辑
  • 健壮性:指数退避重试策略处理速率限制和网络异常

这套架构已经在萨龙网络的多个项目中稳定运行,无论是自动生成技术文章、产品描述,还是实现多语言站点的内容翻译,都能高效胜任。希望本文能帮助你在 Nuxt 3 项目中顺利集成 AI 能力。

标签:
本文来源萨龙网络,经授权后由龙霄发布,观点不代表龙霄的立场,转载请联系原作者。
龙霄

龙霄

Lv1Rec2
以 Nuxt.js 之力,焕新 WordPress 体验
187.61W1214.21W1.07W
加载中…
分享:
1
WordPress 自定义 REST API 安全加固与微信公众号排版自动化实践
WordPress 自定义 REST API 安全加固与微信公众号排版自动化实践上一篇
相关文章
总数:16
Pinia 状态持久化与内存治理实践

Pinia 状态持久化与内存治理实践

本文系统介绍大型Nuxt4项目中25个PiniaStore的状态管理架构,深入分析shallowRef内存优化、localS…
龙霄龙霄
Nuxt.js, Vue.js
2个月前
1
1
3.63K
0
Nuxt.js页面构建器:一个模块,构建万千网站

Nuxt.js页面构建器:一个模块,构建万千网站

深入解析Nuxt4可视化页面构建器的设计哲学——从拖拽式模块编排、全设备实时预览到数据导入导出,一套工具满足企业官网、电商平台、教育课程、…
龙霄龙霄
Nuxt.js, Vue.js
2个月前
0
0
3.13K
0
Nuxt 4 中 Naive UI 集成与 UnoCSS 原子化样式实战

Nuxt 4 中 Naive UI 集成与 UnoCSS 原子化样式实战

本文详解如何在Nuxt4项目中高效集成NaiveUI组件库与UnoCSS原子化CSS引擎,涵盖自动导入配置、SSR样式收集…
龙霄龙霄
Nuxt.js, Vue.js
2个月前
0
0
3.08K
0
龙霄主题加盟推广:前端追踪归因、多语言支持,从流量到收益的全链路闭环

龙霄主题加盟推广:前端追踪归因、多语言支持,从流量到收益的全链路闭环

前言在数字化商业生态中,联盟营销(AffiliateMarketing)已成为品牌方拓展销售渠道、降低获客成本的核心手段。一套完整的加…
龙霄龙霄
Nuxt.js, Vue.js
4天前
0
0
20
0
拥抱现代Web开发:Nuxt.js + WordPress 架构革新指南

拥抱现代Web开发:Nuxt.js + WordPress 架构革新指南

一、性能优化:静态生成与动态渲染的完美平衡在当今快节奏的数字时代,网站性能直接关系到用户体验和业务转化。传统的WordPress主题开发…
龙霄龙霄
Nuxt.js, WordPress
2个月前
0
0
4.78K
0
Nuxt.js + WordPress 架构:性能、速度、安全与缓存的全方位解析

Nuxt.js + WordPress 架构:性能、速度、安全与缓存的全方位解析

当Nuxt.js的现代化前端工程能力遇上WordPress强大的内容管理生态,两者通过Headless架构结合,打造出一套兼顾极致性…
大理旅行大理旅行
Nuxt.js, WordPress
2个月前
1
1
7.96K
0
龙霄主题四个小怪兽守护的登录:趣味交互动效设计深度解析

龙霄主题四个小怪兽守护的登录:趣味交互动效设计深度解析

当你输入密码时,它们会偷看;当你移动鼠标时,它们会歪头跟随——这不是游戏,而是一个Nuxt4项目的登录页面。四个彩色「小怪兽」让登录从枯燥…
龙霄龙霄
Nuxt.js, Vue.js
2个月前
0
0
3.92K
0
Nitro 服务端架构:安全代理层与性能引擎深度解析

Nitro 服务端架构:安全代理层与性能引擎深度解析

这道隐形的「围墙」将WordPress后端完全隔离在公网之外,同时通过多层缓存、请求去重和智能重试,为前端提供稳定、高效、安全的数据服务。…
龙霄龙霄
Nuxt.js
2个月前
0
0
2.72K
0
龙霄主题-商城系统:课程、产品、活动三大插件的统一交易引擎

龙霄主题-商城系统:课程、产品、活动三大插件的统一交易引擎

一套底层交易链路,三类商品形态,统一购物车、合并结算、集中订单管理——商用电商商城系统将课程插件、实体产品插件、营销活动插件的核心能力深度整合,…
龙霄龙霄
Nuxt.js
2个月前
0
0
2.68K
0
龙霄主题-电商与会员一体化产品插件:让内容变现从[能卖]到[卖得好]

龙霄主题-电商与会员一体化产品插件:让内容变现从[能卖]到[卖得好]

一套完整的电商交易链路,配合多级会员权限体系——从商品展示、购物车、优惠券到订单支付,从免费试读到VIP专属内容,用系统化的商业工具把你的知…
龙霄龙霄
Nuxt.js, WordPress
2个月前
1
0
4.60K
0
一键智能·三语通达:龙霄AI翻译如何让多语言网站管理效率翻倍

一键智能·三语通达:龙霄AI翻译如何让多语言网站管理效率翻倍

一、痛点:多语言网站管理的「三座大山」运营一个中文(简体)、中文(繁体)和英文三语并行的网站,开发者与内容管理者每天都要面对三大难题:…
龙霄龙霄
Nuxt.js, Vue.js, WordPress
29天前
0
0
38
0
Nuxt 4 + WordPress GraphQL:数据管理策略与性能优化深度指南

Nuxt 4 + WordPress GraphQL:数据管理策略与性能优化深度指南

本文深入剖析基于Nuxt4+WordPressGraphQL的生产级数据层架构,从服务端SHA-256缓存代理、飞行中请求去重、…
大理旅行大理旅行
Nuxt.js, Vue.js, WordPress
2个月前
1
1
6.83K
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
龙霄
没有相关内容