@genkit-ai/core
Version:
Genkit AI framework core libraries.
1 lines • 9.96 kB
Source Map (JSON)
{"version":3,"sources":["../src/registry.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as z from 'zod';\nimport { Action } from './action.js';\nimport { FlowStateStore } from './flowTypes.js';\nimport { logger } from './logging.js';\nimport { PluginProvider } from './plugin.js';\nimport { startReflectionApi } from './reflectionApi.js';\nimport { JSONSchema } from './schema.js';\nimport { TraceStore } from './tracing/types.js';\n\nexport type AsyncProvider<T> = () => Promise<T>;\n\nconst ACTIONS_BY_ID = 'genkit__ACTIONS_BY_ID';\nconst TRACE_STORES_BY_ENV = 'genkit__TRACE_STORES_BY_ENV';\nconst FLOW_STATE_STORES_BY_ENV = 'genkit__FLOW_STATE_STORES_BY_ENV';\nconst PLUGINS_BY_NAME = 'genkit__PLUGINS_BY_NAME';\nconst SCHEMAS_BY_NAME = 'genkit__SCHEMAS_BY_NAME';\n\nfunction actionsById(): Record<string, Action<z.ZodTypeAny, z.ZodTypeAny>> {\n if (global[ACTIONS_BY_ID] === undefined) {\n global[ACTIONS_BY_ID] = {};\n }\n return global[ACTIONS_BY_ID];\n}\nfunction traceStoresByEnv(): Record<string, AsyncProvider<TraceStore>> {\n if (global[TRACE_STORES_BY_ENV] === undefined) {\n global[TRACE_STORES_BY_ENV] = {};\n }\n return global[TRACE_STORES_BY_ENV];\n}\nfunction flowStateStoresByEnv(): Record<string, AsyncProvider<FlowStateStore>> {\n if (global[FLOW_STATE_STORES_BY_ENV] === undefined) {\n global[FLOW_STATE_STORES_BY_ENV] = {};\n }\n return global[FLOW_STATE_STORES_BY_ENV];\n}\nfunction pluginsByName(): Record<string, PluginProvider> {\n if (global[PLUGINS_BY_NAME] === undefined) {\n global[PLUGINS_BY_NAME] = {};\n }\n return global[PLUGINS_BY_NAME];\n}\nfunction schemasByName(): Record<\n string,\n { schema?: z.ZodTypeAny; jsonSchema?: JSONSchema }\n> {\n if (global[SCHEMAS_BY_NAME] === undefined) {\n global[SCHEMAS_BY_NAME] = {};\n }\n return global[SCHEMAS_BY_NAME];\n}\n\n/**\n * Type of a runnable action.\n */\nexport type ActionType =\n | 'custom'\n | 'retriever'\n | 'indexer'\n | 'embedder'\n | 'evaluator'\n | 'flow'\n | 'model'\n | 'prompt'\n | 'tool';\n\n/**\n * Looks up a registry key (action type and key) in the registry.\n */\nexport async function lookupAction<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n R extends Action<I, O>,\n>(key: string): Promise<R> {\n // If we don't see the key in the registry we try to initialize the plugin first.\n const pluginName = parsePluginName(key);\n if (!actionsById()[key] && pluginName) {\n await initializePlugin(pluginName);\n }\n return actionsById()[key] as R;\n}\n\nfunction parsePluginName(registryKey: string) {\n const tokens = registryKey.split('/');\n if (tokens.length === 4) {\n return tokens[2];\n }\n return undefined;\n}\n\n/**\n * Registers an action in the registry.\n */\nexport function registerAction<I extends z.ZodTypeAny, O extends z.ZodTypeAny>(\n type: ActionType,\n action: Action<I, O>\n) {\n logger.info(`Registering ${type}: ${action.__action.name}`);\n const key = `/${type}/${action.__action.name}`;\n if (actionsById().hasOwnProperty(key)) {\n logger.warn(\n `WARNING: ${key} already has an entry in the registry. Overwriting.`\n );\n }\n actionsById()[key] = action;\n}\n\ntype ActionsRecord = Record<string, Action<z.ZodTypeAny, z.ZodTypeAny>>;\n\n/**\n * Returns all actions in the registry.\n */\nexport async function listActions(): Promise<ActionsRecord> {\n for (const pluginName of Object.keys(pluginsByName())) {\n await initializePlugin(pluginName);\n }\n return Object.assign({}, actionsById());\n}\n\n/**\n * Registers a trace store provider for the given environment.\n */\nexport function registerTraceStore(\n env: string,\n traceStoreProvider: AsyncProvider<TraceStore>\n) {\n traceStoresByEnv()[env] = traceStoreProvider;\n}\n\nconst traceStoresByEnvCache: Record<any, Promise<TraceStore>> = {};\n\n/**\n * Looks up the trace store for the given environment.\n */\nexport async function lookupTraceStore(\n env: string\n): Promise<TraceStore | undefined> {\n if (!traceStoresByEnv()[env]) {\n return undefined;\n }\n const cached = traceStoresByEnvCache[env];\n if (!cached) {\n const newStore = traceStoresByEnv()[env]();\n traceStoresByEnvCache[env] = newStore;\n return newStore;\n }\n return cached;\n}\n\n/**\n * Registers a flow state store provider for the given environment.\n */\nexport function registerFlowStateStore(\n env: string,\n flowStateStoreProvider: AsyncProvider<FlowStateStore>\n) {\n flowStateStoresByEnv()[env] = flowStateStoreProvider;\n}\n\nconst flowStateStoresByEnvCache: Record<any, Promise<FlowStateStore>> = {};\n/**\n * Looks up the flow state store for the given environment.\n */\nexport async function lookupFlowStateStore(\n env: string\n): Promise<FlowStateStore | undefined> {\n if (!flowStateStoresByEnv()[env]) {\n return undefined;\n }\n const cached = flowStateStoresByEnvCache[env];\n if (!cached) {\n const newStore = flowStateStoresByEnv()[env]();\n flowStateStoresByEnvCache[env] = newStore;\n return newStore;\n }\n return cached;\n}\n\n/**\n * Registers a flow state store for the given environment.\n */\nexport function registerPluginProvider(name: string, provider: PluginProvider) {\n let cached;\n pluginsByName()[name] = {\n name: provider.name,\n initializer: () => {\n if (cached) {\n return cached;\n }\n cached = provider.initializer();\n return cached;\n },\n };\n}\n\nexport function lookupPlugin(name: string) {\n return pluginsByName()[name];\n}\n\n/**\n *\n */\nexport async function initializePlugin(name: string) {\n if (pluginsByName()[name]) {\n return await pluginsByName()[name].initializer();\n }\n return undefined;\n}\n\nexport function registerSchema(\n name: string,\n data: { schema?: z.ZodTypeAny; jsonSchema?: JSONSchema }\n) {\n schemasByName()[name] = data;\n}\n\nexport function lookupSchema(name: string) {\n return schemasByName()[name];\n}\n\n/**\n * Development mode only. Starts a Reflection API so that the actions can be called by the Runner.\n */\nif (process.env.GENKIT_ENV === 'dev') {\n startReflectionApi();\n}\n\nexport function __hardResetRegistryForTesting() {\n delete global[ACTIONS_BY_ID];\n delete global[TRACE_STORES_BY_ENV];\n delete global[FLOW_STATE_STORES_BY_ENV];\n delete global[PLUGINS_BY_NAME];\n deleteAll(flowStateStoresByEnvCache);\n deleteAll(traceStoresByEnvCache);\n}\n\nfunction deleteAll(map: Record<any, any>) {\n Object.keys(map).forEach((key) => delete map[key]);\n}\n"],"mappings":"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","names":[]}