Secret7 / server.js
Raybilhelp's picture
Create server.js
a5e013f verified
Raw
History Blame
5.81 kB
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}`);
});