Skip to content

Instantly share code, notes, and snippets.

@khanonnie
Last active April 1, 2023 05:38
Show Gist options
  • Save khanonnie/d02bc6c3b47d15e1fc277cbc0e3de793 to your computer and use it in GitHub Desktop.
Save khanonnie/d02bc6c3b47d15e1fc277cbc0e3de793 to your computer and use it in GitHub Desktop.
gpt-4 wrapper
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