UNPKG

@nuxthub/core

Version:

Build full-stack Nuxt applications on Cloudflare, with zero configuration.

92 lines (91 loc) 3.26 kB
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 }); }