Spaces:
Paused
Paused
File size: 5,813 Bytes
a5e013f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | 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}`);
});
|