Last active
April 1, 2023 05:38
-
-
Save khanonnie/d02bc6c3b47d15e1fc277cbc0e3de793 to your computer and use it in GitHub Desktop.
gpt-4 wrapper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const ws = require('ws') | |
// just trivially obfuscating the endpoint url to avoid spiders | |
function rot13(str) { | |
return str.replace(/[a-zA-Z]/g, (c) => { | |
const base = c <= 'Z' ? 'A'.charCodeAt(0) : 'a'.charCodeAt(0) | |
return String.fromCharCode(((c.charCodeAt(0) - base + 13) % 26) + base) | |
}) | |
} | |
async function requestGpt4Response(systemPrompt, userPrompt, topP = 1, temperature = 0.85) { | |
return new Promise((resolve, reject) => { | |
const socket = new ws(`wss://${rot13('lfunezn-pungtcg4')}.hf.space/queue/join`) | |
let spinnerIndex = 0 | |
let generatedTokens = 0 | |
const spinnerChars = ['|', '/', '-', '\\'] | |
const session_hash = Math.random().toString(36).slice(2) | |
function displaySpinner() { | |
process.stdout.write( | |
'\r' + | |
spinnerChars[spinnerIndex] + | |
` Processing... (${generatedTokens} tokens)` + | |
' '.repeat(15) + | |
'\r' | |
) | |
spinnerIndex = (spinnerIndex + 1) % spinnerChars.length | |
} | |
socket.on('open', () => { | |
console.log('Socket connection opened') | |
}) | |
socket.on('message', (event) => { | |
const parsed = JSON.parse(event) | |
switch (parsed.msg) { | |
case 'send_hash': | |
console.log('Sending session hash', session_hash) | |
socket.send(JSON.stringify({ fn_index: 0, session_hash })) | |
break | |
case 'estimation': | |
process.stdout.write( | |
`\rQueue size: ${parsed.queue_size} Position: ${parsed.rank}${' '.repeat(5)}\r` | |
) | |
break | |
case 'queue_full': | |
socket.close() | |
reject(new Error('Queue is full')) | |
break | |
case 'send_data': | |
const payload = JSON.stringify({ | |
fn_index: 1, | |
data: [systemPrompt, userPrompt, topP, temperature, 0, [], null], | |
session_hash, | |
event_data: null, // not sure what this is | |
}) | |
const sysTruncated = | |
systemPrompt.length > 20 ? systemPrompt.slice(0, 20) + '...' : systemPrompt | |
const userTruncated = | |
userPrompt.length > 20 ? userPrompt.slice(0, 20) + '...' : userPrompt | |
console.log('Sending the following prompts:', { | |
system: sysTruncated, | |
user: userTruncated, | |
}) | |
socket.send(payload) | |
break | |
case 'process_starts': | |
console.log('Acknowledged prompt') | |
break | |
case 'process_completed': | |
if (parsed.output.error || parsed.success === false) { | |
socket.close() | |
const unknownError = 'Unknown error (prompt too long?)' | |
reject(new Error(parsed.output.error ? parsed.output.error : unknownError)) | |
} else { | |
const response = parsed.output.data[0][0][1] | |
console.log('Raw response from GPT4:', response) | |
resolve(response) | |
} | |
break | |
case 'process_generating': | |
generatedTokens++ | |
displaySpinner() | |
break | |
default: | |
console.log('Unknown message from server', parsed) | |
break | |
} | |
}) | |
socket.on('close', (event) => { | |
console.log(`Socket connection closed with code ${event}`) | |
}) | |
socket.on('error', (error) => { | |
console.log(`Socket error: ${error.message}`) | |
reject(error) | |
}) | |
}) | |
} | |
module.exports = requestGpt4Response |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment