Spaces:
Runtime error
Runtime error
import endent from 'endent'; | |
import { | |
createParser, | |
ParsedEvent, | |
ReconnectInterval, | |
} from 'eventsource-parser'; | |
const createPrompt = ( | |
inputLanguage: string, | |
outputLanguage: string, | |
inputCode: string, | |
) => { | |
if (inputLanguage === 'Natural Language') { | |
return endent` | |
You are an expert programmer in all programming languages. Translate the natural language to "${outputLanguage}" code. Do not include \`\`\`. | |
Example translating from natural language to JavaScript: | |
Natural language: | |
Print the numbers 0 to 9. | |
JavaScript code: | |
for (let i = 0; i < 10; i++) { | |
console.log(i); | |
} | |
Natural language: | |
${inputCode} | |
${outputLanguage} code (no \`\`\`): | |
`; | |
} else if (outputLanguage === 'Natural Language') { | |
return endent` | |
You are an expert programmer in all programming languages. Translate the "${inputLanguage}" code to natural language in plain English that the average adult could understand. Respond as bullet points starting with -. | |
Example translating from JavaScript to natural language: | |
JavaScript code: | |
for (let i = 0; i < 10; i++) { | |
console.log(i); | |
} | |
Natural language: | |
Print the numbers 0 to 9. | |
${inputLanguage} code: | |
${inputCode} | |
Natural language: | |
`; | |
} else { | |
return endent` | |
You are an expert programmer in all programming languages. Translate the "${inputLanguage}" code to "${outputLanguage}" code. Do not include \`\`\`. | |
Example translating from JavaScript to Python: | |
JavaScript code: | |
for (let i = 0; i < 10; i++) { | |
console.log(i); | |
} | |
Python code: | |
for i in range(10): | |
print(i) | |
${inputLanguage} code: | |
${inputCode} | |
${outputLanguage} code (no \`\`\`): | |
`; | |
} | |
}; | |
export const OpenAIStream = async ( | |
inputLanguage: string, | |
outputLanguage: string, | |
inputCode: string, | |
model: string, | |
key: string, | |
) => { | |
const prompt = createPrompt(inputLanguage, outputLanguage, inputCode); | |
const system = { role: 'system', content: prompt }; | |
const res = await fetch(`https://api.openai.com/v1/chat/completions`, { | |
headers: { | |
'Content-Type': 'application/json', | |
Authorization: `Bearer ${key || process.env.OPENAI_API_KEY}`, | |
}, | |
method: 'POST', | |
body: JSON.stringify({ | |
model, | |
messages: [system], | |
temperature: 0, | |
stream: true, | |
}), | |
}); | |
const encoder = new TextEncoder(); | |
const decoder = new TextDecoder(); | |
if (res.status !== 200) { | |
const statusText = res.statusText; | |
const result = await res.body?.getReader().read(); | |
throw new Error( | |
`OpenAI API returned an error: ${ | |
decoder.decode(result?.value) || statusText | |
}`, | |
); | |
} | |
const stream = new ReadableStream({ | |
async start(controller) { | |
const onParse = (event: ParsedEvent | ReconnectInterval) => { | |
if (event.type === 'event') { | |
const data = event.data; | |
if (data === '[DONE]') { | |
controller.close(); | |
return; | |
} | |
try { | |
const json = JSON.parse(data); | |
const text = json.choices[0].delta.content; | |
const queue = encoder.encode(text); | |
controller.enqueue(queue); | |
} catch (e) { | |
controller.error(e); | |
} | |
} | |
}; | |
const parser = createParser(onParse); | |
for await (const chunk of res.body as any) { | |
parser.feed(decoder.decode(chunk)); | |
} | |
}, | |
}); | |
return stream; | |
}; | |