firebase-functions
Version:
Firebase SDK for Cloud Functions
198 lines (196 loc) • 6.67 kB
JavaScript
const require_logger_index = require('../../../logger/index.js');
const require_runtime_manifest = require('../../../runtime/manifest.js');
const require_common_onInit = require('../../../common/onInit.js');
const require_common_providers_https = require('../../../common/providers/https.js');
const require_v2_trace = require('../../trace.js');
const require_v2_options = require('../../options.js');
require('../https.js');
const require_v2_providers_ai_types_vertex_v1beta1_index = require('./types/vertex/v1beta1/index.js');
const require_v2_providers_ai_types_gemini_v1beta_index = require('./types/gemini/v1beta/index.js');
//#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) {
require_logger_index.error("Invalid JSON body (Buffer):", e);
throw new require_common_providers_https.HttpsError("invalid-argument", "Invalid JSON body", e);
}
} else if (typeof event === "string") {
try {
event = JSON.parse(event);
} catch (e) {
require_logger_index.error("Invalid JSON body (String):", e);
throw new require_common_providers_https.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"] = require_v2_providers_ai_types_gemini_v1beta_index.requestTypeName;
} else if (api === vertexV1Beta1) {
responseBody["@type"] = require_v2_providers_ai_types_vertex_v1beta1_index.requestTypeName;
}
}
res.status(200).send(responseBody);
} catch (err) {
require_logger_index.error("Unhandled error:", err);
if (err instanceof require_common_providers_https.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 = require_v2_trace.wrapTraceContext(require_common_onInit.withInit(func));
const baseOpts = require_v2_options.optionsToEndpoint(require_v2_options.getGlobalOptions());
const specificOpts = require_v2_options.optionsToEndpoint(opts);
func.__endpoint = {
...require_runtime_manifest.initV2Endpoint(require_v2_options.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) {
require_logger_index.error("Invalid JSON body (Buffer):", e);
throw new require_common_providers_https.HttpsError("invalid-argument", "Invalid JSON body", e);
}
} else if (typeof event === "string") {
try {
event = JSON.parse(event);
} catch (e) {
require_logger_index.error("Invalid JSON body (String):", e);
throw new require_common_providers_https.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"] = require_v2_providers_ai_types_gemini_v1beta_index.responseTypeName;
} else if (api === vertexV1Beta1) {
responseBody["@type"] = require_v2_providers_ai_types_vertex_v1beta1_index.responseTypeName;
}
}
res.status(200).send(responseBody);
} catch (err) {
require_logger_index.error("Unhandled error:", err);
if (err instanceof require_common_providers_https.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 = require_v2_trace.wrapTraceContext(require_common_onInit.withInit(func));
const baseOpts = require_v2_options.optionsToEndpoint(require_v2_options.getGlobalOptions());
const specificOpts = require_v2_options.optionsToEndpoint(opts);
func.__endpoint = {
...require_runtime_manifest.initV2Endpoint(require_v2_options.getGlobalOptions(), opts),
platform: "gcfv2",
...baseOpts,
...specificOpts,
labels: {
...baseOpts?.labels,
...specificOpts?.labels
},
blockingTrigger: {
eventType: afterGenerateEventType,
options: { regionalWebhook: opts.regionalWebhook }
}
};
return func;
}
//#endregion
exports.GeminiV1BetaGenerateContentRequest = GeminiV1BetaGenerateContentRequest;
exports.GeminiV1BetaGenerateContentResponse = GeminiV1BetaGenerateContentResponse;
exports.HttpsError = require_common_providers_https.HttpsError;
exports.VertexV1Beta1GenerateContentRequest = VertexV1Beta1GenerateContentRequest;
exports.VertexV1Beta1GenerateContentResponse = VertexV1Beta1GenerateContentResponse;
exports.afterGenerateContent = afterGenerateContent;
exports.afterGenerateEventType = afterGenerateEventType;
exports.beforeGenerateContent = beforeGenerateContent;
exports.beforeGenerateEventType = beforeGenerateEventType;
exports.geminiV1Beta = geminiV1Beta;
exports.rpcCodeMap = rpcCodeMap;
exports.vertexV1Beta1 = vertexV1Beta1;