1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| import { OpenAI } from "https://esm.town/v/std/openai";
export default async function(req: Request): Promise<Response> { 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", }, }); }
|