UNPKG

firebase-functions

Version:
187 lines (185 loc) 5.42 kB
import { error } from "../../../logger/index.mjs"; import { initV2Endpoint } from "../../../runtime/manifest.mjs"; import { withInit } from "../../../common/onInit.mjs"; import { HttpsError } from "../../../common/providers/https.mjs"; import { wrapTraceContext } from "../../trace.mjs"; import { getGlobalOptions, optionsToEndpoint } from "../../options.mjs"; import "../https.mjs"; import { requestTypeName, responseTypeName } from "./types/vertex/v1beta1/index.mjs"; import { requestTypeName as requestTypeName$1, responseTypeName as responseTypeName$1 } from "./types/gemini/v1beta/index.mjs"; //#region src/v2/providers/ai/index.ts const rpcCodeMap = { ok: 0, cancelled: 1, unknown: 2, "invalid-argument": 3, "deadline-exceeded": 4, "not-found": 5, "already-exists": 6, "permission-denied": 7, unauthenticated: 16, "resource-exhausted": 8, "failed-precondition": 9, aborted: 10, "out-of-range": 11, unimplemented: 12, internal: 13, unavailable: 14, "data-loss": 15 }; const beforeGenerateEventType = "google.firebase.ailogic.v1.beforeGenerate"; const afterGenerateEventType = "google.firebase.ailogic.v1.afterGenerate"; const geminiV1Beta = "google.ai.generativelanguage.v1beta"; const vertexV1Beta1 = "google.cloud.aiplatform.v1beta1"; function beforeGenerateContent(optsOrCb, cb) { let opts; let handler; if (arguments.length === 1) { opts = {}; handler = optsOrCb; } else { opts = optsOrCb; handler = cb; } let func = async (req, res) => { try { let event = req.body; if (Buffer.isBuffer(event)) { try { event = JSON.parse(event.toString("utf-8")); } catch (e) { error("Invalid JSON body (Buffer):", e); throw new HttpsError("invalid-argument", "Invalid JSON body", e); } } else if (typeof event === "string") { try { event = JSON.parse(event); } catch (e) { error("Invalid JSON body (String):", e); throw new HttpsError("invalid-argument", "Invalid JSON body", e); } } const parsedEvent = event; const result = await handler(parsedEvent); const responseBody = result || {}; if (typeof responseBody === "object") { const api = parsedEvent.data?.api; if (api === geminiV1Beta) { responseBody["@type"] = requestTypeName$1; } else if (api === vertexV1Beta1) { responseBody["@type"] = requestTypeName; } } res.status(200).send(responseBody); } catch (err) { error("Unhandled error:", err); if (err instanceof HttpsError) { res.status(500).send({ code: rpcCodeMap[err.code] || 13, message: err.message }); } else { res.status(500).send({ code: 13, message: "Internal error." }); } } }; func.run = handler; func = wrapTraceContext(withInit(func)); const baseOpts = optionsToEndpoint(getGlobalOptions()); const specificOpts = optionsToEndpoint(opts); func.__endpoint = { ...initV2Endpoint(getGlobalOptions(), opts), platform: "gcfv2", ...baseOpts, ...specificOpts, labels: { ...baseOpts?.labels, ...specificOpts?.labels }, blockingTrigger: { eventType: beforeGenerateEventType, options: { regionalWebhook: opts.regionalWebhook } } }; return func; } function afterGenerateContent(optsOrCb, cb) { let opts; let handler; if (arguments.length === 1) { opts = {}; handler = optsOrCb; } else { opts = optsOrCb; handler = cb; } let func = async (req, res) => { try { let event = req.body; if (Buffer.isBuffer(event)) { try { event = JSON.parse(event.toString("utf-8")); } catch (e) { error("Invalid JSON body (Buffer):", e); throw new HttpsError("invalid-argument", "Invalid JSON body", e); } } else if (typeof event === "string") { try { event = JSON.parse(event); } catch (e) { error("Invalid JSON body (String):", e); throw new HttpsError("invalid-argument", "Invalid JSON body", e); } } const parsedEvent = event; const result = await handler(parsedEvent); const responseBody = result || {}; if (typeof responseBody === "object") { const api = parsedEvent.data?.api; if (api === geminiV1Beta) { responseBody["@type"] = responseTypeName$1; } else if (api === vertexV1Beta1) { responseBody["@type"] = responseTypeName; } } res.status(200).send(responseBody); } catch (err) { error("Unhandled error:", err); if (err instanceof HttpsError) { res.status(500).send({ code: rpcCodeMap[err.code] || 13, message: err.message }); } else { res.status(500).send({ code: 13, message: "Internal error." }); } } }; func.run = handler; func = wrapTraceContext(withInit(func)); const baseOpts = optionsToEndpoint(getGlobalOptions()); const specificOpts = optionsToEndpoint(opts); func.__endpoint = { ...initV2Endpoint(getGlobalOptions(), opts), platform: "gcfv2", ...baseOpts, ...specificOpts, labels: { ...baseOpts?.labels, ...specificOpts?.labels }, blockingTrigger: { eventType: afterGenerateEventType, options: { regionalWebhook: opts.regionalWebhook } } }; return func; } //#endregion export { GeminiV1BetaGenerateContentRequest, GeminiV1BetaGenerateContentResponse, HttpsError, VertexV1Beta1GenerateContentRequest, VertexV1Beta1GenerateContentResponse, afterGenerateContent, afterGenerateEventType, beforeGenerateContent, beforeGenerateEventType, geminiV1Beta, rpcCodeMap, vertexV1Beta1 };