UNPKG

@genkit-ai/firebase

Version:

Genkit AI framework plugin for Firebase including Firestore trace/state store and deployment helpers for Cloud Functions for Firebase.

97 lines 3.07 kB
import { getApp, initializeServerApp } from "firebase/app"; import { executeMutation, executeQuery, getDataConnect, mutationRef, queryRef } from "firebase/data-connect"; import { readFileSync } from "fs"; import { GenkitError } from "genkit"; import { logger } from "genkit/logging"; import { genkitPlugin } from "genkit/plugin"; function serverAppFromContext(context, config) { if ("firebaseApp" in context) return context.firebaseApp; try { if (!config) config = getApp(); } catch (e) { throw new GenkitError({ status: "FAILED_PRECONDITION", message: `Must either supply a 'firebaseApp' option or have already initialized a default FirebaseApp when calling Data Connect tools.` }); } return initializeServerApp(config, { authIdToken: context.auth?.rawToken, appCheckToken: context.app?.rawToken }); } function dataConnectTools(options) { if (!options.config && !options.configFile) throw new GenkitError({ status: "INVALID_ARGUMENT", message: "Must supply `config` or `configFile` when initializing a Data Connect tools plugin." }); if (!options.config) { try { options.config = JSON.parse( readFileSync(options.configFile, "utf8") ); } catch (e) { throw new GenkitError({ status: "INVALID_ARGUMENT", message: `Could not parse Data Connect tools config from ${options.configFile}: ${e.message}` }); } } return genkitPlugin(options.name, (ai) => { const config = options.config; for (const tool of config.tools) { ai.defineTool( { name: `${options.name}/${tool.name}`, description: tool.description || "", inputJsonSchema: tool.parameters }, async (input, { context }) => { const serverApp = serverAppFromContext(context, options.firebaseApp); const dc = getDataConnect(serverApp, { connector: config.connector, location: config.location, service: config.service }); try { if (tool.type === "query") { const { data: data2 } = await executeQuery( queryRef(dc, tool.name, input) ); return data2; } const { data } = await executeMutation( mutationRef(dc, tool.name, input) ); logger.debug( `[dataConnectTools] ${tool.name}(${JSON.stringify(input)}) -> ${JSON.stringify(data)}` ); return data; } catch (e) { logger.info("[dataConnectTools] error on tool call:", e); if (options.onError === "throw") throw e; if (typeof options.onError === "function") return Promise.resolve(options.onError(tool, e)); if (options.onError === "return" || !options.onError) return { error: e.message }; } } ); } }); } export { dataConnectTools, serverAppFromContext }; //# sourceMappingURL=data-connect.mjs.map