const express = require('express'); const proxy = require('express-http-proxy'); const app = express(); const targetUrl = 'https://api.openai.com'; const openaiKey = process.env.OPENAI_KEY; const port = 7860; const baseUrl = getExternalUrl(process.env.SPACE_ID); let requestDetails = []; let ipRequestCounts = {}; app.use('/api', (req, res, next) => { const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; const currentCount = ipRequestCounts[ip] || 0; if (currentCount >= 2) { return res.status(429).send('You have reached your request limit of 10 messages. Please contact support for more details.'); } ipRequestCounts[ip] = currentCount + 1; const timestamp = new Date().toISOString(); const requestData = { requestNumber: ipRequestCounts[ip], ip: ip, timestamp: timestamp, text: req.method + ' ' + req.url }; requestDetails.push(requestData); console.log(`Request ${requestData.requestNumber} from IP ${requestData.ip} on ${requestData.timestamp}`); next(); }, proxy(targetUrl, { proxyReqOptDecorator: (proxyReqOpts, srcReq) => { proxyReqOpts.headers['Authorization'] = 'Bearer ' + openaiKey; return proxyReqOpts; }, userResDecorator: (proxyRes, proxyResData, userReq, userRes) => { if (proxyRes.statusCode === 429) { // Return a custom message for the 429 error from the proxy attempt return Buffer.from('Request limit reached on the proxied service. Please try again later.'); } return proxyResData; // Return original data if response is not 429 } })); app.get("/", (req, res) => { let requestsInfo = requestDetails.map(detail => `Request ${detail.requestNumber} from IP ${detail.ip} on ${detail.timestamp}`).join('
'); res.send(`This is your OpenAI Reverse Proxy URL: ${baseUrl}.

${requestsInfo}`); }); function getExternalUrl(spaceId) { const [username, spacename] = spaceId.split("/"); return `https://${username}-${spacename.replace(/_/g, "-")}.hf.space/api/v1`; } app.listen(port, () => { console.log(`Reverse proxy server running on ${baseUrl}.`); });