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}`); });