import { OpenAI } from "https://esm.town/v/std/openai";
export default async function(req: Request): Promise { if (req.method === "OPTIONS") { return new Response(null, { headers: { "Access-Control-Allow-Origin": "", "Access-Control-Allow-Headers": "", }, status: 204, }); } const openai = new OpenAI();
try { var body = await req.json(); } catch (e) { var search = (new URL(req.url)).searchParams; body = { "messages": [{ "role": "user", "content": search.get("q") || "hello" }], "temperature": 0.5, "presence_penalty": 0, "frequency_penalty": 0, "top_p": 1, stream: true, model: "gpt-4-turbo", }; }
const stream = await openai.chat.completions.create(body);
if (!body.stream) { return new Response(JSON.stringify(body), { headers: { "Access-Control-Allow-Origin": "", "Access-Control-Allow-Headers": "", "Content-Type": "application/json; charset=UTF-8", }, }); } /* const { readable, writable } = new TransformStream(); const my_stream_writer = writable.getWriter(); var encoder = new TextEncoder(); (async () => { for await (const chunk of stream) { my_stream_writer.write(encoder.encode(chunk.choices[0]?.delta?.content || "")); } my_stream_writer.close(); })();*/
const { readable, writable } = new TransformStream();
const my_stream_writer = writable.getWriter();
var reader = stream.toReadableStream().getReader();
var totalText = "";
const decoder = new TextDecoder("utf-8", { stream: true });
var encoder = new TextEncoder();
(async () => {
while (true) {
const { done, value } = await reader.read();
if (done) break;
totalText += decoder.decode(value, { stream: true });
var msgs = totalText.split("\n");
totalText = msgs.pop();
for (let i in msgs) {
my_stream_writer.write(encoder.encode(data: ${msgs[i]}\n\n
));
}
await new Promise((r) => {
setTimeout(r, 20);
});
}
my_stream_writer.close();
})();
return new Response(readable, { headers: { "Access-Control-Allow-Origin": "", "Access-Control-Allow-Headers": "", "Content-Type": "text/event-stream; charset=UTF-8", }, }); }