諮詢熱線:15911225507
龍霄
登入
首頁-所有文章tw-Nuxt.js繁体-正文

Nuxt 3 專案中整合 AI API 實現智慧內容生成與多語言翻譯

龍霄龍霄
Nuxt.js繁体
12小时前
0
0
2

隨著大型語言模型(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',
    'ja': '日本語',
  }

  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.60W119
載入中…
分享:
1
WordPress 自訂 REST API 安全加固與微信公眾號排版自動化實踐
WordPress 自訂 REST API 安全加固與微信公眾號排版自動化實踐上一篇
相关文章
總數:16
龍霄主題加盟推廣:前端追蹤歸因、多語言支援,從流量到收益的全鏈路閉環

龍霄主題加盟推廣:前端追蹤歸因、多語言支援,從流量到收益的全鏈路閉環

前言在數位化商業生態中,聯盟行銷(AffiliateMarketing)已成為品牌方拓展銷售渠道、降低獲客成本的核心手段。一套完整的加…
龍霄龍霄
Nuxt.js繁体, Vue.js繁体
3天前
0
0
13
0
龍霄主題-商城系統:課程、產品、活動三大外掛的統一交易引擎

龍霄主題-商城系統:課程、產品、活動三大外掛的統一交易引擎

一套底層交易鏈路,三類商品形態,統一購物車、合併結算、集中訂單管理——商用電商商城系統將課程外掛、實體產品外掛、營銷活動外掛的核心能力深度整合,…
龍霄龍霄
Nuxt.js繁体
2个月前
0
0
2.54K
0
活動外掛-活動管理外掛:從策劃到落地,一站式活動營運解決方案

活動外掛-活動管理外掛:從策劃到落地,一站式活動營運解決方案

一場成功的活動,背後是場地管理、嘉賓邀約、報名簽到、票務結算的複雜協作。活動管理外掛將全流程數位化——從活動建立、嘉賓管理、線上報名到現場簽到,…
龍霄龍霄
Nuxt.js繁体, WordPress繁体
2个月前
0
0
2.80K
0
Nuxt 4 中 Naive UI 整合與 UnoCSS 原子化樣式實戰

Nuxt 4 中 Naive UI 整合與 UnoCSS 原子化樣式實戰

本文詳解如何在Nuxt4專案中高效整合NaiveUI元件庫與UnoCSS原子化CSS引擎,涵蓋自動匯入設定、SSR樣式收集…
Nuxt.js繁体, Vue.js繁体
2个月前
0
0
4.66K
0
Nuxt 4 國際化 i18n 架構與多語言路由策略

Nuxt 4 國際化 i18n 架構與多語言路由策略

本文完整呈現基於@nuxtjs/i18nv10的三語言(zh-CN/zh-TW/en)國際化方案,從prefix_except_defa…
龍霄龍霄
Nuxt.js繁体, Vue.js繁体
2个月前
0
0
2.80K
0
擁抱現代Web開發:Nuxt.js + WordPress 架構革新指南

擁抱現代Web開發:Nuxt.js + WordPress 架構革新指南

一、效能優化:靜態生成與動態渲染的完美平衡在當今快節奏的數位時代,網站效能直接關係到用戶體驗和業務轉化。傳統的WordPress主題開發…
龍霄龍霄
Nuxt.js繁体, WordPress繁体
2个月前
0
0
5.41K
0
Nuxt.js頁面建構器:一個模組,構建萬千網站

Nuxt.js頁面建構器:一個模組,構建萬千網站

深入解析Nuxt4視覺化頁面建構器的設計哲學——從拖曳式模組編排、全裝置即時預覽到資料匯入匯出,一套工具滿足企業官網、電商平台、教育課程、…
大理旅行大理旅行
Nuxt.js繁体, Vue.js繁体
2个月前
3
1
3.28K
0
龍霄主題-視覺化頁面建構器:一個人、一個下午,搭建專業級網站

龍霄主題-視覺化頁面建構器:一個人、一個下午,搭建專業級網站

告別寫程式碼、調樣式、接API的傳統建站模式。拖拽模組、配置參數、一鍵發布——讓頁面建構器成為你的效率槓桿,用十分之一的時間,交付十倍品質的…
龍霄龍霄
Nuxt.js繁体, WordPress繁体
2个月前
0
0
2.33K
0
龍霄主題-電商與會員一體化產品外掛:讓內容變現從[能賣]到[賣得好]

龍霄主題-電商與會員一體化產品外掛:讓內容變現從[能賣]到[賣得好]

一套完整的電商交易鏈路,配合多級會員權限體系——從商品展示、購物車、優惠券到訂單支付,從免費試讀到VIP專屬內容,用系統化的商業工具把你的知…
龍霄龍霄
Nuxt.js繁体, WordPress繁体
2个月前
0
0
3.84K
0
一鍵智能·三語通達:龍霄AI翻譯如何讓多語言網站管理效率翻倍

一鍵智能·三語通達:龍霄AI翻譯如何讓多語言網站管理效率翻倍

一、痛點:多語言網站管理的「三座大山」運營一個中文(簡體)、中文(繁體)和英文三語並行的網站,開發者與內容管理者每天都要面對三大難題:…
龍霄龍霄
Nuxt.js繁体, Vue.js繁体, WordPress繁体
28天前
0
0
38
0
Nuxt.js + WordPress 架構:效能、速度、安全與快取的全方位解析

Nuxt.js + WordPress 架構:效能、速度、安全與快取的全方位解析

當Nuxt.js的現代化前端工程能力遇上WordPress強大的內容管理生態,兩者透過Headless架構結合,打造出一套兼顧極致效…
龍霄龍霄
Nuxt.js繁体, WordPress繁体
2个月前
0
0
2.69K
0
Pinia 狀態持久化與記憶體治理實戰

Pinia 狀態持久化與記憶體治理實戰

本文系統介紹大型Nuxt4專案中25個PiniaStore的狀態管理架構,深入分析shallowRef記憶體最佳化、loca…
龍霄龍霄
Nuxt.js繁体, Vue.js繁体
2个月前
0
0
3.59K
0
评论表单游客 您好,欢迎参与讨论。
載入中…
评论列表
總數:0
龍霄
沒有相關內容