nuxt-chatgpt
Version:
ChatGPT integration for Nuxt 3
63 lines (62 loc) • 1.97 kB
JavaScript
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();
}
});