firebase-functions
Version:
Firebase SDK for Cloud Functions
187 lines (185 loc) • 5.42 kB
JavaScript
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 };