@nuxthub/core
Version:
Build full-stack Nuxt applications on Cloudflare, with zero configuration.
92 lines (91 loc) • 3.26 kB
JavaScript
import { ofetch } from "ofetch";
import { joinURL } from "ufo";
import { createError } from "h3";
import { requireNuxtHubFeature } from "../../../utils/features.js";
import { getCloudflareAccessHeaders } from "../../../utils/cloudflareAccess.js";
import { requireNuxtHubLinkedProject } from "../../../utils/auth.js";
import { useRuntimeConfig } from "#imports";
let _autorag;
export function hubAutoRAG(instance) {
requireNuxtHubFeature("ai");
if (_autorag) {
return _autorag;
}
const hub = useRuntimeConfig().hub;
const aiBinding = process.env.AI || globalThis.__env__?.AI || globalThis.AI;
if (hub.remote && hub.projectUrl && !aiBinding) {
const cfAccessHeaders = getCloudflareAccessHeaders(hub.cloudflareAccess);
_autorag = proxyHubAutoRAG(instance, hub.projectUrl, hub.projectSecretKey || hub.userToken, cfAccessHeaders);
} else if (import.meta.dev) {
_autorag = {
async aiSearch(params) {
requireNuxtHubLinkedProject(hub, "hubAutoRAG");
return $fetch(`/api/projects/${hub.projectKey}/ai/autorag/${instance}/ai-search`, {
baseURL: hub.url,
method: "POST",
headers: {
authorization: `Bearer ${hub.userToken}`
},
body: params,
responseType: params?.stream ? "stream" : void 0
}).catch(handleProxyError);
},
async search(params) {
requireNuxtHubLinkedProject(hub, "hubAutoRAG");
return $fetch(`/api/projects/${hub.projectKey}/ai/autorag/${instance}/search`, {
baseURL: hub.url,
method: "POST",
headers: {
authorization: `Bearer ${hub.userToken}`
},
body: params
}).catch(handleProxyError);
}
};
} else if (aiBinding) {
_autorag = aiBinding.autorag(instance);
}
if (!_autorag) {
throw createError("Missing Cloudflare AI binding (AI)");
}
return _autorag;
}
export function proxyHubAutoRAG(instance, projectUrl, secretKey, headers) {
requireNuxtHubFeature("ai");
const autoragAPI = ofetch.create({
baseURL: joinURL(projectUrl, `/api/_hub/ai/autorag/${instance}`),
method: "POST",
headers: {
Authorization: `Bearer ${secretKey}`,
...headers
}
});
return {
async aiSearch(params) {
return autoragAPI("/ai-search", {
body: params,
responseType: params?.stream ? "stream" : void 0
}).catch(handleProxyError);
},
async search(params) {
return autoragAPI("/search", {
body: params
}).catch(handleProxyError);
}
};
}
async function handleProxyError(err) {
if (import.meta.dev && err.statusCode === 403) {
console.warn("It seems that your Cloudflare API token does not have the `AutoRAG` permission.\nOpen `https://dash.cloudflare.com/profile/api-tokens` and edit your NuxtHub token.\nAdd the `Account > AutoRAG > Edit` permission to your token and save it.");
}
let data = err.data;
if (!err.data && typeof err.response?.json === "function") {
data = (await err.response.json())?.data || {};
}
throw createError({
statusCode: data?.statusCode || err.statusCode,
statusMessage: data?.statusMessage || err.statusMessage,
message: data?.message || err.message,
data
});
}