@genkit-ai/core
Version:
Genkit AI framework core libraries.
1 lines • 9.26 kB
Source Map (JSON)
{"version":3,"sources":["../src/action.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 { JSONSchema7 } from 'json-schema';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport * as z from 'zod';\nimport { ActionType, lookupPlugin, registerAction } from './registry.js';\nimport { parseSchema } from './schema.js';\nimport {\n SPAN_TYPE_ATTR,\n runInNewSpan,\n setCustomMetadataAttributes,\n} from './tracing.js';\n\nexport { Status, StatusCodes, StatusSchema } from './statusTypes.js';\nexport { JSONSchema7 };\n\nexport interface ActionMetadata<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n M extends Record<string, any> = Record<string, any>,\n> {\n actionType?: ActionType;\n name: string;\n description?: string;\n inputSchema?: I;\n inputJsonSchema?: JSONSchema7;\n outputSchema?: O;\n outputJsonSchema?: JSONSchema7;\n metadata?: M;\n}\n\nexport type Action<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n M extends Record<string, any> = Record<string, any>,\n> = ((input: z.infer<I>) => Promise<z.infer<O>>) & {\n __action: ActionMetadata<I, O, M>;\n};\n\nexport type SideChannelData = Record<string, any>;\n\ntype ActionParams<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n M extends Record<string, any> = Record<string, any>,\n> = {\n name:\n | string\n | {\n pluginId: string;\n actionId: string;\n };\n description?: string;\n inputSchema?: I;\n inputJsonSchema?: JSONSchema7;\n outputSchema?: O;\n outputJsonSchema?: JSONSchema7;\n metadata?: M;\n use?: Middleware<z.infer<I>, z.infer<O>>[];\n};\n\nexport interface Middleware<I = any, O = any> {\n (req: I, next: (req?: I) => Promise<O>): Promise<O>;\n}\n\nexport function actionWithMiddleware<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n M extends Record<string, any> = Record<string, any>,\n>(\n action: Action<I, O, M>,\n middleware: Middleware<z.infer<I>, z.infer<O>>[]\n): Action<I, O, M> {\n const wrapped = (async (req: z.infer<I>) => {\n const dispatch = async (index: number, req: z.infer<I>) => {\n if (index === middleware.length) {\n // end of the chain, call the original model action\n return await action(req);\n }\n\n const currentMiddleware = middleware[index];\n return currentMiddleware(req, async (modifiedReq) =>\n dispatch(index + 1, modifiedReq || req)\n );\n };\n\n return await dispatch(0, req);\n }) as Action<I, O, M>;\n wrapped.__action = action.__action;\n return wrapped;\n}\n\n/**\n * Creates an action with the provided config.\n */\nexport function action<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n M extends Record<string, any> = Record<string, any>,\n>(\n config: ActionParams<I, O, M>,\n fn: (input: z.infer<I>) => Promise<z.infer<O>>\n): Action<I, O> {\n const actionName =\n typeof config.name === 'string'\n ? validateActionName(config.name)\n : `${validatePluginName(config.name.pluginId)}/${validateActionId(config.name.actionId)}`;\n const actionFn = async (input: I) => {\n input = parseSchema(input, {\n schema: config.inputSchema,\n jsonSchema: config.inputJsonSchema,\n });\n let output = await runInNewSpan(\n {\n metadata: {\n name: actionName,\n },\n labels: {\n [SPAN_TYPE_ATTR]: 'action',\n },\n },\n async (metadata) => {\n metadata.name = actionName;\n metadata.input = input;\n\n const output = await fn(input);\n\n metadata.output = JSON.stringify(output);\n return output;\n }\n );\n output = parseSchema(output, {\n schema: config.outputSchema,\n jsonSchema: config.outputJsonSchema,\n });\n return output;\n };\n actionFn.__action = {\n name: actionName,\n description: config.description,\n inputSchema: config.inputSchema,\n inputJsonSchema: config.inputJsonSchema,\n outputSchema: config.outputSchema,\n outputJsonSchema: config.outputJsonSchema,\n metadata: config.metadata,\n } as ActionMetadata<I, O, M>;\n\n if (config.use) {\n return actionWithMiddleware(actionFn, config.use);\n }\n return actionFn;\n}\n\nfunction validateActionName(name: string) {\n if (name.includes('/')) {\n validatePluginName(name.split('/', 1)[0]);\n validateActionId(name.substring(name.indexOf('/') + 1));\n }\n return name;\n}\n\nfunction validatePluginName(pluginId: string) {\n if (!lookupPlugin(pluginId)) {\n throw new Error(\n `Unable to find plugin name used in the action name: ${pluginId}`\n );\n }\n return pluginId;\n}\n\nfunction validateActionId(actionId: string) {\n if (actionId.includes('/')) {\n throw new Error(`Action name must not include slashes (/): ${actionId}`);\n }\n return actionId;\n}\n\n/**\n * Defines an action with the given config and registers it in the registry.\n */\nexport function defineAction<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n M extends Record<string, any> = Record<string, any>,\n>(\n config: ActionParams<I, O, M> & {\n actionType: ActionType;\n },\n fn: (input: z.infer<I>) => Promise<z.infer<O>>\n): Action<I, O> {\n const act = action(config, (i: I): Promise<z.infer<O>> => {\n setCustomMetadataAttributes({ subtype: config.actionType });\n return fn(i);\n });\n act.__action.actionType = config.actionType;\n registerAction(config.actionType, act);\n return act;\n}\n\n// Streaming callback function.\nexport type StreamingCallback<T> = (chunk: T) => void;\n\nconst streamingAls = new AsyncLocalStorage<StreamingCallback<any>>();\nconst sentinelNoopCallback = () => null;\n\n/**\n * Executes provided function with streaming callback in async local storage which can be retrieved\n * using {@link getStreamingCallback}.\n */\nexport function runWithStreamingCallback<S, O>(\n streamingCallback: StreamingCallback<S> | undefined,\n fn: () => O\n): O {\n return streamingAls.run(streamingCallback || sentinelNoopCallback, fn);\n}\n\n/**\n * Retrieves the {@link StreamingCallback} previously set by {@link runWithStreamingCallback}\n */\nexport function getStreamingCallback<S>(): StreamingCallback<S> | undefined {\n const cb = streamingAls.getStore();\n if (cb === sentinelNoopCallback) {\n return undefined;\n }\n return cb;\n}\n"],"mappings":"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","names":["action","req","output"]}