server.js
const express = require('express'); const bodyParser = require('body-parser'); const { fetchEventSource } = require('./modules/FetchEventSource'); const app = express(); const router = express.Router(); router.get('/', (req, res) => { res.render('index.html'); }); router.post('/request', (request, response) => { const url = 'https://api.openai.com/v1/chat/completions'; const apiKey = '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'; const bodyData = Object.assign({}, request.body, { model: 'gpt-3.5-turbo', stream: true }); const abortController = new AbortController(); (new Promise(async (resolve, reject) => { try { await fetchEventSource(url, { method: 'post', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` }, body: JSON.stringify(bodyData), signal: abortController.signal, onopen: async (openResponse) => { if (openResponse.status === 200) { response.on('close', () => { abortController.abort(); resolve(); }); response.set({ 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Type': 'text/event-stream' }); response.flushHeaders(); return; } let error; try { const json = await openResponse.json(); error = json; } catch (e) { error = e; } error.status = openResponse.status; throw error; }, onclose: () => resolve(), onerror: (error) => { reject(error); throw error; }, onmessage: (message) => { if (!message.data || message.event === 'ping') { return; } response.write('data:' + message.data + '\n\n'); }, }); } catch (e) { reject(e); } })).then(() => response.end()) .catch((error) => response.status(error.status).json(error).end()); }); app.use(bodyParser.json()); app.use('/', router); app.listen(8080);