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