File size: 2,763 Bytes
2889205 e4e9ad6 2889205 e4e9ad6 b0e1d6e e4e9ad6 2889205 e4e9ad6 7f84064 2889205 66289b9 2889205 177a238 2889205 66289b9 7f84064 e4e9ad6 66289b9 b2850de 7f84064 66289b9 38265f9 315c31e 66289b9 65e323a 66289b9 a9b8fae 66289b9 65e323a 66289b9 65e323a 3e0d39c 177a238 66289b9 3e0d39c e4e9ad6 177a238 65e323a d5b575b 65e323a 315c31e 65e323a 2889205 e4e9ad6 66289b9 |
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 |
const express = require('express');
const http = require('http');
const proxy = require('express-http-proxy');
const socketIo = require('socket.io');
const moment = require('moment-timezone');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const targetUrl = 'https://api.openai.com';
const openaiKey = process.env.OPENAI_KEY;
const port = 7860;
const baseUrl = getExternalUrl(process.env.SPACE_ID);
let requestDetails = []; // Store details of each request
let ipRequestCounts = {}; // Dictionary to keep track of requests per IP
io.on('connection', (socket) => {
console.log('A user connected to the websocket for live logs.');
});
function logAndEmit(message) {
console.log(message); // Continue to log to the console
io.emit('log', message); // Emit this log to the frontend via WebSocket
}
app.use('/api', (req, res, next) => {
if (req.method === 'POST' && req.url.startsWith('/v1/chat/completions')) {
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
ipRequestCounts[ip] = (ipRequestCounts[ip] || 0) + 1;
const logMessage = `IP ${ip} has made ${ipRequestCounts[ip]} requests so far.`;
logAndEmit(logMessage);
}
const timestamp = moment().tz("Asia/Tbilisi").format("DD-MMM-YYYY HH:mm");
const requestData = {
requestNumber: ipRequestCounts[req.headers['x-forwarded-for'] || req.connection.remoteAddress],
ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress,
timestamp: timestamp,
text: req.method + ' ' + req.url
};
requestDetails.push(requestData);
const detailedLog = `Request ${requestData.requestNumber} on ${requestData.timestamp} from IP ${requestData.ip} with method "${req.method}" and text "${requestData.text}"`;
logAndEmit(detailedLog);
next();
}, proxy(targetUrl, {
proxyReqOptDecorator: function(proxyReqOpts, srcReq) {
proxyReqOpts.headers['Authorization'] = 'Bearer ' + openaiKey;
return proxyReqOpts;
}
}));
app.get("/", (req, res) => {
let requestsInfo = requestDetails.map(detail =>
`Request ${detail.requestNumber} on ${detail.timestamp} from IP ${detail.ip} with text "${detail.text}"`).join('<br>');
res.send(`This is your OpenAI Reverse Proxy URL: ${baseUrl}.<br><br>Requests Overview:<br>${requestsInfo}`);
});
app.get('/logs', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
function getExternalUrl(spaceId) {
try {
const [username, spacename] = spaceId.split("/");
return `https://${username}-${spacename.replace(/_/g, "-")}.hf.space/api/v1`;
} catch (e) {
return "Error generating external URL";
}
}
server.listen(port, () => {
logAndEmit(`Reverse proxy server and WebSocket running on port ${port}`);
});
|