Update Dockerfile
Browse files- Dockerfile +29 -43
Dockerfile
CHANGED
|
@@ -65,7 +65,7 @@ const parseApiResponse = (data) => {
|
|
| 65 |
return { answer: data, sources: [] };
|
| 66 |
};
|
| 67 |
|
| 68 |
-
const createPayload = (prompt, system, web
|
| 69 |
const newUserMessage = { role: 'user', content: prompt, id: generateId() };
|
| 70 |
const messagesForPayload = [newUserMessage];
|
| 71 |
|
|
@@ -110,13 +110,7 @@ const createPayload = (prompt, system, web, asyncMode = false) => {
|
|
| 110 |
domains: null,
|
| 111 |
vscodeClient: false,
|
| 112 |
codeInterpreterMode: false,
|
| 113 |
-
customProfile: {
|
| 114 |
-
name: '',
|
| 115 |
-
occupation: '',
|
| 116 |
-
traits: [],
|
| 117 |
-
additionalInfo: '',
|
| 118 |
-
enableNewChats: false,
|
| 119 |
-
},
|
| 120 |
webSearchModeOption,
|
| 121 |
session: {
|
| 122 |
user: randomUser,
|
|
@@ -124,17 +118,12 @@ const createPayload = (prompt, system, web, asyncMode = false) => {
|
|
| 124 |
isNewUser: Math.random() < 0.1,
|
| 125 |
},
|
| 126 |
isPremium: false,
|
| 127 |
-
subscriptionCache: {
|
| 128 |
-
status: 'FREE',
|
| 129 |
-
expiryTimestamp: null,
|
| 130 |
-
lastChecked: Date.now(),
|
| 131 |
-
isTrialSubscription: false,
|
| 132 |
-
},
|
| 133 |
beastMode: false,
|
| 134 |
reasoningMode: false,
|
| 135 |
designerMode: false,
|
| 136 |
workspaceId: '',
|
| 137 |
-
asyncMode,
|
| 138 |
integrations: {},
|
| 139 |
isTaskPersistent: false,
|
| 140 |
selectedElement: null,
|
|
@@ -146,23 +135,21 @@ app.use(express.json());
|
|
| 146 |
|
| 147 |
const chatApiUrl = 'https://www.blackbox.ai/api/chat';
|
| 148 |
const headers = {
|
| 149 |
-
Accept: '*/*',
|
| 150 |
'Content-Type': 'application/json',
|
| 151 |
-
Origin: 'https://www.blackbox.ai',
|
| 152 |
-
Referer: 'https://www.blackbox.ai/',
|
| 153 |
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
|
| 154 |
};
|
| 155 |
|
| 156 |
app.post('/api/generate', async (req, res) => {
|
| 157 |
const { prompt, system, web } = req.body;
|
| 158 |
-
if (!prompt) {
|
| 159 |
-
|
| 160 |
-
}
|
| 161 |
try {
|
| 162 |
-
const payload = createPayload(prompt, system, web
|
| 163 |
const chatResponse = await axios.post(chatApiUrl, payload, { headers });
|
| 164 |
-
const
|
| 165 |
-
const parsedResult = parseApiResponse(assistantRawResponse);
|
| 166 |
res.send(parsedResult.answer);
|
| 167 |
} catch (error) {
|
| 168 |
console.error("Error pada /api/generate:", error.message);
|
|
@@ -170,36 +157,35 @@ app.post('/api/generate', async (req, res) => {
|
|
| 170 |
}
|
| 171 |
});
|
| 172 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
app.post('/api/stream', async (req, res) => {
|
| 174 |
const { prompt, system, web } = req.body;
|
| 175 |
-
if (!prompt) {
|
| 176 |
-
|
| 177 |
-
}
|
| 178 |
try {
|
| 179 |
-
const payload = createPayload(prompt, system, web
|
| 180 |
-
const chatResponse = await axios.post(chatApiUrl, payload, {
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
});
|
| 184 |
|
| 185 |
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
| 186 |
res.setHeader('Cache-Control', 'no-cache');
|
| 187 |
res.setHeader('Connection', 'keep-alive');
|
| 188 |
-
|
| 189 |
-
chatResponse.data.pipe(res);
|
| 190 |
|
| 191 |
-
|
| 192 |
-
console.error("Stream error:", err.message);
|
| 193 |
-
if (!res.headersSent) {
|
| 194 |
-
res.status(500).send("Terjadi kesalahan pada stream.");
|
| 195 |
-
}
|
| 196 |
-
res.end();
|
| 197 |
-
});
|
| 198 |
|
| 199 |
} catch (error) {
|
| 200 |
console.error("Error pada /api/stream:", error.message);
|
| 201 |
if (!res.headersSent) {
|
| 202 |
-
res.status(500).send("Terjadi kesalahan pada server saat
|
| 203 |
}
|
| 204 |
}
|
| 205 |
});
|
|
@@ -208,7 +194,7 @@ app.listen(PORT, () => {
|
|
| 208 |
console.log(`Server berjalan di http://localhost:${PORT}`);
|
| 209 |
console.log('Endpoints tersedia:');
|
| 210 |
console.log(' - POST /api/generate (non-streaming)');
|
| 211 |
-
console.log(' - POST /api/stream (streaming)');
|
| 212 |
});
|
| 213 |
EOF
|
| 214 |
|
|
|
|
| 65 |
return { answer: data, sources: [] };
|
| 66 |
};
|
| 67 |
|
| 68 |
+
const createPayload = (prompt, system, web) => {
|
| 69 |
const newUserMessage = { role: 'user', content: prompt, id: generateId() };
|
| 70 |
const messagesForPayload = [newUserMessage];
|
| 71 |
|
|
|
|
| 110 |
domains: null,
|
| 111 |
vscodeClient: false,
|
| 112 |
codeInterpreterMode: false,
|
| 113 |
+
customProfile: { name: '', occupation: '', traits: [], additionalInfo: '', enableNewChats: false },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
webSearchModeOption,
|
| 115 |
session: {
|
| 116 |
user: randomUser,
|
|
|
|
| 118 |
isNewUser: Math.random() < 0.1,
|
| 119 |
},
|
| 120 |
isPremium: false,
|
| 121 |
+
subscriptionCache: { status: 'FREE', expiryTimestamp: null, lastChecked: Date.now(), isTrialSubscription: false },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
beastMode: false,
|
| 123 |
reasoningMode: false,
|
| 124 |
designerMode: false,
|
| 125 |
workspaceId: '',
|
| 126 |
+
asyncMode: false,
|
| 127 |
integrations: {},
|
| 128 |
isTaskPersistent: false,
|
| 129 |
selectedElement: null,
|
|
|
|
| 135 |
|
| 136 |
const chatApiUrl = 'https://www.blackbox.ai/api/chat';
|
| 137 |
const headers = {
|
| 138 |
+
'Accept': '*/*',
|
| 139 |
'Content-Type': 'application/json',
|
| 140 |
+
'Origin': 'https://www.blackbox.ai',
|
| 141 |
+
'Referer': 'https://www.blackbox.ai/',
|
| 142 |
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
|
| 143 |
};
|
| 144 |
|
| 145 |
app.post('/api/generate', async (req, res) => {
|
| 146 |
const { prompt, system, web } = req.body;
|
| 147 |
+
if (!prompt) return res.status(400).json({ error: 'Request body harus menyertakan "prompt"' });
|
| 148 |
+
|
|
|
|
| 149 |
try {
|
| 150 |
+
const payload = createPayload(prompt, system, web);
|
| 151 |
const chatResponse = await axios.post(chatApiUrl, payload, { headers });
|
| 152 |
+
const parsedResult = parseApiResponse(chatResponse.data);
|
|
|
|
| 153 |
res.send(parsedResult.answer);
|
| 154 |
} catch (error) {
|
| 155 |
console.error("Error pada /api/generate:", error.message);
|
|
|
|
| 157 |
}
|
| 158 |
});
|
| 159 |
|
| 160 |
+
const streamResponseByWord = async (res, text, delay = 50) => {
|
| 161 |
+
const words = text.split(' ');
|
| 162 |
+
for (const word of words) {
|
| 163 |
+
res.write(word + ' ');
|
| 164 |
+
await new Promise(resolve => setTimeout(resolve, delay));
|
| 165 |
+
}
|
| 166 |
+
res.end();
|
| 167 |
+
};
|
| 168 |
+
|
| 169 |
app.post('/api/stream', async (req, res) => {
|
| 170 |
const { prompt, system, web } = req.body;
|
| 171 |
+
if (!prompt) return res.status(400).json({ error: 'Request body harus menyertakan "prompt"' });
|
| 172 |
+
|
|
|
|
| 173 |
try {
|
| 174 |
+
const payload = createPayload(prompt, system, web);
|
| 175 |
+
const chatResponse = await axios.post(chatApiUrl, payload, { headers });
|
| 176 |
+
const parsedResult = parseApiResponse(chatResponse.data);
|
| 177 |
+
const fullAnswer = parsedResult.answer;
|
|
|
|
| 178 |
|
| 179 |
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
| 180 |
res.setHeader('Cache-Control', 'no-cache');
|
| 181 |
res.setHeader('Connection', 'keep-alive');
|
|
|
|
|
|
|
| 182 |
|
| 183 |
+
await streamResponseByWord(res, fullAnswer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
|
| 185 |
} catch (error) {
|
| 186 |
console.error("Error pada /api/stream:", error.message);
|
| 187 |
if (!res.headersSent) {
|
| 188 |
+
res.status(500).send("Terjadi kesalahan pada server saat memproses permintaan.");
|
| 189 |
}
|
| 190 |
}
|
| 191 |
});
|
|
|
|
| 194 |
console.log(`Server berjalan di http://localhost:${PORT}`);
|
| 195 |
console.log('Endpoints tersedia:');
|
| 196 |
console.log(' - POST /api/generate (non-streaming)');
|
| 197 |
+
console.log(' - POST /api/stream (simulated streaming)');
|
| 198 |
});
|
| 199 |
EOF
|
| 200 |
|