刪除不必要檔案、實作 AI 助手

This commit is contained in:
2025-09-19 03:24:09 +08:00
parent ea17bd0ca2
commit 08a1f1b248
32 changed files with 348 additions and 3292 deletions

View File

@@ -15,6 +15,7 @@ import {
User,
Loader2
} from "lucide-react"
import { generateSystemPrompt } from "@/lib/ai-knowledge-base"
interface Message {
id: string
@@ -24,38 +25,10 @@ interface Message {
quickQuestions?: string[]
}
const DEEPSEEK_API_KEY = process.env.NEXT_PUBLIC_DEEPSEEK_API_KEY || "sk-3640dcff23fe4a069a64f536ac538d75"
const DEEPSEEK_API_KEY = process.env.NEXT_PUBLIC_DEEPSEEK_API_KEY || "sk-30cac9533e5b451fa1e277fe34a7f64b"
const DEEPSEEK_API_URL = process.env.NEXT_PUBLIC_DEEPSEEK_API_URL || "https://api.deepseek.com/v1/chat/completions"
const systemPrompt = `你是一個競賽管理系統的AI助手專門幫助用戶了解如何使用這個系統。
系統功能包括:
後台管理功能:
1. 競賽管理 - 創建、編輯、刪除競賽
2. 評審管理 - 管理評審團成員
3. 評分系統 - 手動輸入評分或讓評審自行評分
4. 團隊管理 - 管理參賽團隊
5. 獎項管理 - 設定各種獎項
6. 評審連結 - 提供評審登入連結
前台功能:
1. 競賽瀏覽 - 查看所有競賽資訊和詳細內容
2. 團隊註冊 - 如何註冊參賽團隊和提交作品
3. 作品展示 - 瀏覽參賽作品和投票功能
4. 排行榜 - 查看人氣排行榜和得獎名單
5. 個人中心 - 管理個人資料和參賽記錄
6. 收藏功能 - 如何收藏喜歡的作品
7. 評論系統 - 如何對作品進行評論和互動
8. 搜尋功能 - 如何搜尋特定競賽或作品
9. 通知系統 - 查看競賽更新和個人通知
10. 幫助中心 - 常見問題和使用指南
請用友善、專業的語氣回答用戶問題,並提供具體的操作步驟。回答要簡潔明瞭,避免過長的文字。
重要請不要使用任何Markdown格式只使用純文字回答。不要使用**、*、#、-等符號。
回答時請使用繁體中文。`
const systemPrompt = generateSystemPrompt()
export function ChatBot() {
const [isOpen, setIsOpen] = useState(false)
@@ -106,6 +79,15 @@ export function ChatBot() {
const callDeepSeekAPI = async (userMessage: string): Promise<string> => {
try {
// 構建對話歷史,只保留最近的幾條對話
const recentMessages = messages
.filter(msg => msg.sender === "user")
.slice(-5) // 只保留最近5條用戶消息
.map(msg => ({
role: "user" as const,
content: msg.text
}))
const response = await fetch(DEEPSEEK_API_URL, {
method: "POST",
headers: {
@@ -119,31 +101,47 @@ export function ChatBot() {
role: "system",
content: systemPrompt
},
...messages
.filter(msg => msg.sender === "user")
.map(msg => ({
role: "user" as const,
content: msg.text
})),
...recentMessages,
{
role: "user",
content: userMessage
}
],
max_tokens: 200, // 減少 token 數量以獲得更簡潔的回答
temperature: 0.7
max_tokens: 300,
temperature: 0.7,
stream: false
})
})
if (!response.ok) {
throw new Error(`API request failed: ${response.status}`)
const errorText = await response.text()
console.error("API Error:", response.status, errorText)
throw new Error(`API request failed: ${response.status} - ${errorText}`)
}
const data = await response.json()
const rawResponse = data.choices[0]?.message?.content || "抱歉,我現在無法回答您的問題,請稍後再試。"
if (!data.choices || !data.choices[0] || !data.choices[0].message) {
console.error("Invalid API response:", data)
throw new Error("Invalid API response format")
}
const rawResponse = data.choices[0].message.content || "抱歉,我現在無法回答您的問題,請稍後再試。"
return cleanResponse(rawResponse)
} catch (error) {
console.error("DeepSeek API error:", error)
// 根據錯誤類型提供不同的錯誤信息
if (error instanceof Error) {
if (error.message.includes('401')) {
return "API 密鑰無效,請聯繫管理員檢查配置。"
} else if (error.message.includes('429')) {
return "API 請求過於頻繁,請稍後再試。"
} else if (error.message.includes('500')) {
return "AI 服務暫時不可用,請稍後再試。"
}
}
return "抱歉我現在無法連接到AI服務請檢查網路連接或稍後再試。"
}
}
@@ -153,48 +151,90 @@ export function ChatBot() {
const question = userQuestion.toLowerCase()
// 前台相關問題
if (question.includes('註冊') || question.includes('團隊')) {
if (question.includes('註冊') || question.includes('團隊') || question.includes('報名')) {
return [
"如何提交作品?",
"怎麼查看競賽詳情?",
"如何收藏作品",
"怎麼進行投票"
"如何收藏應用",
"怎麼查看我的參賽記錄"
]
}
if (question.includes('作品') || question.includes('提交')) {
if (question.includes('作品') || question.includes('提交') || question.includes('應用')) {
return [
"如何修改作品?",
"如何修改作品信息",
"怎麼查看作品狀態?",
"如何刪除作品?",
"怎麼下載作品"
"怎麼查看作品評價"
]
}
if (question.includes('投票') || question.includes('排行榜')) {
if (question.includes('投票') || question.includes('排行榜') || question.includes('評分')) {
return [
"如何查看排行榜?",
"怎麼收藏作品",
"如何評論作品",
"怎麼分享作品"
"怎麼收藏喜歡的應用",
"如何對應用進行評論?",
"怎麼查看應用詳情"
]
}
if (question.includes('個人') || question.includes('資料') || question.includes('設置')) {
return [
"如何修改個人資料?",
"怎麼查看我的收藏?",
"如何修改密碼?",
"怎麼查看通知?"
]
}
// 後台相關問題
if (question.includes('競賽') || question.includes('創建')) {
// 後台管理相關問題
if (question.includes('競賽') || question.includes('創建') || question.includes('管理')) {
return [
"如何編輯競賽?",
"如何編輯競賽信息",
"怎麼設定評分標準?",
"如何管理參賽團隊?",
"怎麼設定獎項?"
]
}
if (question.includes('評審') || question.includes('評分')) {
if (question.includes('評審') || question.includes('評分') || question.includes('評委')) {
return [
"如何新增評審?",
"如何新增評審成員",
"怎麼設定評審權限?",
"如何查看評分結果?",
"怎麼生成評審連結?"
]
}
if (question.includes('應用') || question.includes('app') || question.includes('作品管理')) {
return [
"如何審核應用?",
"怎麼管理應用狀態?",
"如何查看應用統計?",
"怎麼處理應用舉報?"
]
}
if (question.includes('用戶') || question.includes('成員') || question.includes('邀請')) {
return [
"如何邀請新用戶?",
"怎麼管理用戶角色?",
"如何查看用戶統計?",
"怎麼處理用戶問題?"
]
}
// 技術支持相關問題
if (question.includes('忘記') || question.includes('密碼') || question.includes('登入')) {
return [
"如何重設密碼?",
"怎麼修改個人資料?",
"如何聯繫管理員?",
"怎麼查看使用說明?"
]
}
if (question.includes('錯誤') || question.includes('問題') || question.includes('無法')) {
return [
"如何聯繫技術支持?",
"怎麼查看常見問題?",
"如何回報問題?",
"怎麼查看系統狀態?"
]
}
// 通用問題
return [