1weekgpt / server.js
Anonizy's picture
Update server.js
a9b8fae verified
raw
history blame
3.09 kB
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 openaiKeys = process.env.OPENAI_KEYS.split(','); // Assume keys are separated by commas
let currentKeyIndex = 0;
const port = 7860;
const baseUrl = getExternalUrl(process.env.SPACE_ID);
let requestDetails = [];
let ipRequestCounts = {};
io.on('connection', (socket) => {
console.log('A user connected to the websocket for live logs.');
});
function logAndEmit(message) {
console.log(message);
io.emit('log', message);
}
function getNextKey() {
// This function cycles through the keys in a round-robin manner
const key = openaiKeys[currentKeyIndex];
currentKeyIndex = (currentKeyIndex + 1) % openaiKeys.length;
return key;
}
app.use('/api', (req, res, next) => {
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
ipRequestCounts[ip] = (ipRequestCounts[ip] || 0) + 1;
const timestamp = moment().tz("Asia/Tbilisi").format("DD-MMM-YYYY HH:mm");
const requestData = {
requestNumber: ipRequestCounts[ip],
ip: ip,
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 ' + getNextKey();
return proxyReqOpts;
},
userResDecorator: function(proxyRes, proxyResData, userReq, userRes) {
// Check response for indication of invalid key
if (proxyRes.statusCode === 401 || proxyRes.statusCode === 403) {
logAndEmit(`Error detected with API key, switching keys...`);
getNextKey(); // Immediately get next key to avoid using the same failed key
}
return proxyResData; // Pass through the original response data
}
}));
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}`);
});