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; | |
| }; | |