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