UNPKG

nuxt-chatgpt

Version:
63 lines (62 loc) 1.97 kB
import OpenAI from "openai"; import { createError, defineEventHandler, readBody, setHeader } from "h3"; import { defaultOptions } from "../../constants/options.js"; import { MODEL_GPT_5_MINI } from "../../constants/models.js"; import { modelMap } from "../../utils/model-map.js"; import { useRuntimeConfig } from "#imports"; export default defineEventHandler(async (event) => { const { messages, model, options } = await readBody(event); if (!useRuntimeConfig().chatgpt.apiKey) { throw createError({ statusCode: 403, message: "Missing OpenAI API Key" }); } const openai = new OpenAI({ apiKey: useRuntimeConfig().chatgpt.apiKey }); const requestOptions = { messages, model: !model ? modelMap[MODEL_GPT_5_MINI] : modelMap[model], ...options || defaultOptions, stream: true }; setHeader(event, "Content-Type", "text/event-stream; charset=utf-8"); setHeader(event, "Cache-Control", "no-cache, no-transform"); setHeader(event, "Connection", "keep-alive"); event.node.res.flushHeaders?.(); const res = event.node.res; const abort = new AbortController(); event.node.req.on("close", () => abort.abort()); const writeEvent = (eventName, data) => { res.write(`event: ${eventName} `); const lines = String(data).split("\n"); for (const line of lines) res.write(`data: ${line} `); res.write("\n"); }; try { writeEvent("meta", JSON.stringify({ ok: true })); const stream = await openai.chat.completions.create( requestOptions, { signal: abort.signal } ); for await (const chunk of stream) { const delta = chunk?.choices?.[0]?.delta?.content; if (typeof delta === "string" && delta.length) { writeEvent("token", delta); } } writeEvent("done", "[DONE]"); res.end(); } catch (error) { writeEvent( "error", JSON.stringify({ message: error?.message ?? String(error) }) ); res.end(); } });