Spaces:
Paused
Paused
| require('dotenv').config(); | |
| const express = require('express'); | |
| const admin = require('firebase-admin'); | |
| const Groq = require('groq-sdk'); | |
| const { Octokit } = require('@octokit/rest'); | |
| const app = report = express(); | |
| // Hugging Face-এর জন্য রিকোয়েস্ট সাইজ অপ্টিমাইজেশন | |
| app.use(express.json({ limit: '10mb' })); | |
| app.use(express.urlencoded({ extended: true, limit: '10mb' })); | |
| // ১. ফায়ারবেস অ্যাডমিন এসডিকে ইনিশিয়ালিলাইজেশন (এনভায়রনমেন্ট ভেরিয়েবল থেকে) | |
| try { | |
| if (!process.env.FIREBASE_ADMIN_API) { | |
| throw new Error("FIREBASE_ADMIN_API এনভায়রনমেন্ট ভেরিয়েবলটি পাওয়া যায়নি!"); | |
| } | |
| // সেটিংসের সিক্রেট থেকে সম্পূর্ণ JSON স্ট্রিংটি অবজেক্টে কনভার্ট করা হচ্ছে | |
| const serviceAccount = JSON.parse(process.env.FIREBASE_ADMIN_API); | |
| admin.initializeApp({ | |
| credential: admin.credential.cert(serviceAccount), | |
| databaseURL: process.env.FIREBASE_REALTIME_URL | |
| }); | |
| console.log("Firebase Admin SDK successfully connected."); | |
| } catch (error) { | |
| console.error("Firebase Initialization Error:", error.message); | |
| } | |
| const db = admin.database(); | |
| // ২. Groq এবং GitHub (Octokit) ইনিশিয়ালিলাইজেশন | |
| const groq = new Groq({ apiKey: process.env.GROQ_API }); | |
| const octokit = new Octokit({ auth: process.env.GITHUB_API_TOKEN }); | |
| const REPO_OWNER = 'chaingroupworld-rgb'; | |
| const REPO_NAME = 'Website-visit-1'; | |
| // ৩. চ্যাট এপিআই (Dynamic Model Selection লজিক) | |
| app.post('/api/chat', async (req, res) => { | |
| const { userId, message } = req.body; | |
| if (!userId || !message) { | |
| return res.status(400).json({ error: "userId এবং message পাঠানো বাধ্যতামূলক।" }); | |
| } | |
| try { | |
| // ডায়নামিক মডেল ট্রিক: টেক্সট ৩০০ ক্যারেক্টারের বেশি হলে ১৭ বিলিয়ন (Llama 4 Scout), কম হলে ইনস্ট্যান্ট | |
| let selectedModel = "llama-3.1-8b-instant"; | |
| if (message.length > 300) { | |
| selectedModel = "meta-llama/llama-4-scout-17b-16e-instruct"; | |
| } | |
| // Groq এপিআই কল | |
| const chatCompletion = await groq.chat.completions.create({ | |
| messages: [{ role: "user", content: message }], | |
| model: selectedModel, | |
| }); | |
| const aiResponse = chatCompletion.choices[0]?.message?.content || ""; | |
| // ফায়ারবেস রিয়েলটাইম ডাটাবেজে ইউজার ও এআই কথোপকথন সেভ | |
| const chatRef = db.ref(`chats/${userId}`).push(); | |
| await chatRef.set({ | |
| userMessage: message, | |
| aiResponse: aiResponse, | |
| modelUsed: selectedModel, | |
| timestamp: admin.database.ServerValue.TIMESTAMP | |
| }); | |
| res.status(200).json({ | |
| success: true, | |
| model: selectedModel, | |
| reply: aiResponse | |
| }); | |
| } catch (error) { | |
| console.error("Chat API Error:", error); | |
| res.status(500).json({ error: "সার্ভারে এআই বা ডাটাবেজ প্রসেস করতে সমস্যা হয়েছে।" }); | |
| } | |
| }); | |
| // ৪. গিটহাব ফাইল পুশ এপিআই (ফ্রন্টএন্ড ফাইল আপলোডের জন্য) | |
| app.post('/api/github/push', async (req, res) => { | |
| const { filePath, fileContent, commitMessage } = req.body; | |
| if (!filePath || !fileContent) { | |
| return res.status(400).json({ error: "filePath এবং fileContent পাঠানো বাধ্যতামূলক।" }); | |
| } | |
| try { | |
| let sha; | |
| // ফাইল আগে থেকে আছে কিনা চেক করা (আপডেটের জন্য SHA কোড দরকার হয়) | |
| try { | |
| const { data } = await octokit.repos.getContent({ | |
| owner: REPO_OWNER, | |
| repo: REPO_NAME, | |
| path: filePath, | |
| }); | |
| sha = data.sha; | |
| } catch (e) { | |
| sha = undefined; // ফাইল নতুন হলে SHA থাকবে না | |
| } | |
| // ফাইল ডেটাকে Base64 ফরম্যাটে রূপান্তর | |
| const base64Content = Buffer.from(fileContent).toString('base64'); | |
| // গিটহাবে পুশ বা আপডেট করা | |
| const response = await octokit.repos.createOrUpdateFileContents({ | |
| owner: REPO_OWNER, | |
| repo: REPO_NAME, | |
| path: filePath, | |
| message: commitMessage || "Uploaded via Mobile-first Backend API", | |
| content: base64Content, | |
| sha: sha | |
| }); | |
| res.status(200).json({ | |
| success: true, | |
| message: "GitHub রিপোজিটরিতে ফাইল সফলভাবে পুশ হয়েছে।", | |
| download_url: response.data.content.download_url | |
| }); | |
| } catch (error) { | |
| console.error("GitHub API Error:", error); | |
| res.status(500).json({ error: "GitHub এপিআই-তে ফাইল পুশ করতে ব্যর্থ হয়েছে।" }); | |
| } | |
| }); | |
| // ৫. বেসিক রুট (Hugging Face Spaces হেলথ চেকের জন্য জরুরি) | |
| app.get('/', (req, res) => { | |
| res.status(200).send('Hugging Face Free Space Backend Engine is Active!'); | |
| }); | |
| // Hugging Face ফ্রি স্পেসের ডিফল্ট পোর্ট ৭৮৬০ রিড করা | |
| const PORT = process.env.PORT || 7860; | |
| app.listen(PORT, () => { | |
| console.log(`Server is running smoothly on port ${PORT}`); | |
| }); | |