UNPKG

@genkit-ai/core

Version:

Genkit AI framework core libraries.

1 lines 19.7 kB
{"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 { type JSONSchema7 } from 'json-schema';\nimport * as z from 'zod';\nimport { lazy } from './async.js';\nimport { ActionContext, getContext, runWithContext } from './context.js';\nimport { ActionType, Registry } from './registry.js';\nimport { parseSchema } from './schema.js';\nimport {\n SPAN_TYPE_ATTR,\n newTrace,\n setCustomMetadataAttributes,\n} from './tracing.js';\n\nexport { StatusCodes, StatusSchema, type Status } from './statusTypes.js';\nexport { JSONSchema7 };\n\n/**\n * Action metadata.\n */\nexport interface ActionMetadata<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n S extends z.ZodTypeAny,\n> {\n actionType?: ActionType;\n name: string;\n description?: string;\n inputSchema?: I;\n inputJsonSchema?: JSONSchema7;\n outputSchema?: O;\n outputJsonSchema?: JSONSchema7;\n streamSchema?: S;\n metadata?: Record<string, any>;\n}\n\n/**\n * Results of an action run. Includes telemetry.\n */\nexport interface ActionResult<O> {\n result: O;\n telemetry: {\n traceId: string;\n spanId: string;\n };\n}\n\n/**\n * Options (side channel) data to pass to the model.\n */\nexport interface ActionRunOptions<S> {\n /**\n * Streaming callback (optional).\n */\n onChunk?: StreamingCallback<S>;\n\n /**\n * Additional runtime context data (ex. auth context data).\n */\n context?: ActionContext;\n\n /**\n * Additional span attributes to apply to OT spans.\n */\n telemetryLabels?: Record<string, string>;\n}\n\n/**\n * Options (side channel) data to pass to the model.\n */\nexport interface ActionFnArg<S> {\n /**\n * Streaming callback (optional).\n */\n sendChunk: StreamingCallback<S>;\n\n /**\n * Additional runtime context data (ex. auth context data).\n */\n context?: ActionContext;\n}\n\n/**\n * Streaming response from an action.\n */\nexport interface StreamingResponse<\n O extends z.ZodTypeAny = z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\n> {\n /** Iterator over the streaming chunks. */\n stream: AsyncGenerator<z.infer<S>>;\n /** Final output of the action. */\n output: Promise<z.infer<O>>;\n}\n\n/**\n * Self-describing, validating, observable, locally and remotely callable function.\n */\nexport type Action<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\n RunOptions extends ActionRunOptions<S> = ActionRunOptions<S>,\n> = ((input?: z.infer<I>, options?: RunOptions) => Promise<z.infer<O>>) & {\n __action: ActionMetadata<I, O, S>;\n __registry: Registry;\n run(\n input?: z.infer<I>,\n options?: ActionRunOptions<z.infer<S>>\n ): Promise<ActionResult<z.infer<O>>>;\n\n stream(\n input?: z.infer<I>,\n opts?: ActionRunOptions<z.infer<S>>\n ): StreamingResponse<O, S>;\n};\n\n/**\n * Action factory params.\n */\nexport type ActionParams<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\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?: Record<string, any>;\n use?: Middleware<z.infer<I>, z.infer<O>, z.infer<S>>[];\n streamSchema?: S;\n actionType: ActionType;\n};\n\nexport type ActionAsyncParams<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\n> = ActionParams<I, O, S> & {\n fn: (\n input: z.infer<I>,\n options: ActionFnArg<z.infer<S>>\n ) => Promise<z.infer<O>>;\n};\n\nexport type SimpleMiddleware<I = any, O = any> = (\n req: I,\n next: (req?: I) => Promise<O>\n) => Promise<O>;\n\nexport type MiddlewareWithOptions<I = any, O = any, S = any> = (\n req: I,\n options: ActionRunOptions<S> | undefined,\n next: (req?: I, options?: ActionRunOptions<S>) => Promise<O>\n) => Promise<O>;\n\n/**\n * Middleware function for actions.\n */\nexport type Middleware<I = any, O = any, S = any> =\n | SimpleMiddleware<I, O>\n | MiddlewareWithOptions<I, O, S>;\n\n/**\n * Creates an action with provided middleware.\n */\nexport function actionWithMiddleware<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n action: Action<I, O, S>,\n middleware: Middleware<z.infer<I>, z.infer<O>, z.infer<S>>[]\n): Action<I, O, S> {\n const wrapped = (async (req: z.infer<I>) => {\n return (await wrapped.run(req)).result;\n }) as Action<I, O, S>;\n wrapped.__action = action.__action;\n wrapped.__registry = action.__registry;\n wrapped.run = async (\n req: z.infer<I>,\n options?: ActionRunOptions<z.infer<S>>\n ): Promise<ActionResult<z.infer<O>>> => {\n let telemetry;\n const dispatch = async (\n index: number,\n req: z.infer<I>,\n opts?: ActionRunOptions<z.infer<S>>\n ) => {\n if (index === middleware.length) {\n // end of the chain, call the original model action\n const result = await action.run(req, opts);\n telemetry = result.telemetry;\n return result.result;\n }\n\n const currentMiddleware = middleware[index];\n if (currentMiddleware.length === 3) {\n return (currentMiddleware as MiddlewareWithOptions<I, O, z.infer<S>>)(\n req,\n opts,\n async (modifiedReq, modifiedOptions) =>\n dispatch(index + 1, modifiedReq || req, modifiedOptions || opts)\n );\n } else if (currentMiddleware.length === 2) {\n return (currentMiddleware as SimpleMiddleware<I, O>)(\n req,\n async (modifiedReq) => dispatch(index + 1, modifiedReq || req, opts)\n );\n } else {\n throw new Error('unspported middleware function shape');\n }\n };\n wrapped.stream = action.stream;\n\n return { result: await dispatch(0, req, options), telemetry };\n };\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 S extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n config: ActionParams<I, O, S>,\n fn: (\n input: z.infer<I>,\n options: ActionFnArg<z.infer<S>>\n ) => Promise<z.infer<O>>\n): Action<I, O, z.infer<S>> {\n const actionName =\n typeof config.name === 'string'\n ? config.name\n : `${config.name.pluginId}/${config.name.actionId}`;\n const actionFn = async (\n input?: I,\n options?: ActionRunOptions<z.infer<S>>\n ) => {\n return (await actionFn.run(input, options)).result;\n };\n actionFn.__registry = registry;\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 streamSchema: config.streamSchema,\n metadata: config.metadata,\n } as ActionMetadata<I, O, S>;\n actionFn.run = async (\n input: z.infer<I>,\n options?: ActionRunOptions<z.infer<S>>\n ): Promise<ActionResult<z.infer<O>>> => {\n input = parseSchema(input, {\n schema: config.inputSchema,\n jsonSchema: config.inputJsonSchema,\n });\n let traceId;\n let spanId;\n let output = await newTrace(\n registry,\n {\n name: actionName,\n labels: {\n [SPAN_TYPE_ATTR]: 'action',\n 'genkit:metadata:subtype': config.actionType,\n ...options?.telemetryLabels,\n },\n },\n async (metadata, span) => {\n setCustomMetadataAttributes(registry, { subtype: config.actionType });\n if (options?.context) {\n setCustomMetadataAttributes(registry, {\n context: JSON.stringify(options.context),\n });\n }\n\n traceId = span.spanContext().traceId;\n spanId = span.spanContext().spanId;\n metadata.name = actionName;\n metadata.input = input;\n\n try {\n const actionFn = () =>\n fn(input, {\n ...options,\n // Context can either be explicitly set, or inherited from the parent action.\n context: options?.context ?? getContext(registry),\n sendChunk: options?.onChunk ?? sentinelNoopStreamingCallback,\n });\n // if context is explicitly passed in, we run action with the provided context,\n // otherwise we let upstream context carry through.\n const output = await runWithContext(\n registry,\n options?.context,\n actionFn\n );\n\n metadata.output = JSON.stringify(output);\n return output;\n } catch (err) {\n if (typeof err === 'object') {\n (err as any).traceId = traceId;\n }\n throw err;\n }\n }\n );\n output = parseSchema(output, {\n schema: config.outputSchema,\n jsonSchema: config.outputJsonSchema,\n });\n return {\n result: output,\n telemetry: {\n traceId,\n spanId,\n },\n };\n };\n\n actionFn.stream = (\n input?: z.infer<I>,\n opts?: ActionRunOptions<z.infer<S>>\n ): StreamingResponse<O, S> => {\n let chunkStreamController: ReadableStreamController<z.infer<S>>;\n const chunkStream = new ReadableStream<z.infer<S>>({\n start(controller) {\n chunkStreamController = controller;\n },\n pull() {},\n cancel() {},\n });\n\n const invocationPromise = actionFn\n .run(config.inputSchema ? config.inputSchema.parse(input) : input, {\n onChunk: ((chunk: z.infer<S>) => {\n chunkStreamController.enqueue(chunk);\n }) as S extends z.ZodVoid ? undefined : StreamingCallback<z.infer<S>>,\n context: opts?.context,\n })\n .then((s) => s.result)\n .finally(() => {\n chunkStreamController.close();\n });\n\n return {\n output: invocationPromise,\n stream: (async function* () {\n const reader = chunkStream.getReader();\n while (true) {\n const chunk = await reader.read();\n if (chunk.value) {\n yield chunk.value;\n }\n if (chunk.done) {\n break;\n }\n }\n return await invocationPromise;\n })(),\n };\n };\n\n if (config.use) {\n return actionWithMiddleware(actionFn, config.use);\n }\n return actionFn;\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 S extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n config: ActionParams<I, O, S>,\n fn: (\n input: z.infer<I>,\n options: ActionFnArg<z.infer<S>>\n ) => Promise<z.infer<O>>\n): Action<I, O, S> {\n if (isInRuntimeContext(registry)) {\n throw new Error(\n 'Cannot define new actions at runtime.\\n' +\n 'See: https://github.com/firebase/genkit/blob/main/docs/errors/no_new_actions_at_runtime.md'\n );\n }\n const act = action(\n registry,\n config,\n async (i: I, options): Promise<z.infer<O>> => {\n await registry.initializeAllPlugins();\n return await runInActionRuntimeContext(registry, () => fn(i, options));\n }\n );\n act.__action.actionType = config.actionType;\n registry.registerAction(config.actionType, act);\n return act;\n}\n\n/**\n * Defines an action with the given config promise and registers it in the registry.\n */\nexport function defineActionAsync<\n I extends z.ZodTypeAny,\n O extends z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\n>(\n registry: Registry,\n actionType: ActionType,\n name:\n | string\n | {\n pluginId: string;\n actionId: string;\n },\n config: PromiseLike<ActionAsyncParams<I, O, S>>,\n onInit?: (action: Action<I, O, S>) => void\n): PromiseLike<Action<I, O, S>> {\n const actionName =\n typeof name === 'string' ? name : `${name.pluginId}/${name.actionId}`;\n const actionPromise = lazy(() =>\n config.then((resolvedConfig) => {\n const act = action(\n registry,\n resolvedConfig,\n async (i: I, options): Promise<z.infer<O>> => {\n await registry.initializeAllPlugins();\n return await runInActionRuntimeContext(registry, () =>\n resolvedConfig.fn(i, options)\n );\n }\n );\n act.__action.actionType = actionType;\n onInit?.(act);\n return act;\n })\n );\n registry.registerActionAsync(actionType, actionName, actionPromise);\n return actionPromise;\n}\n\n// Streaming callback function.\nexport type StreamingCallback<T> = (chunk: T) => void;\n\nconst streamingAlsKey = 'core.action.streamingCallback';\nexport const sentinelNoopStreamingCallback = () => 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 registry: Registry,\n streamingCallback: StreamingCallback<S> | undefined,\n fn: () => O\n): O {\n return registry.asyncStore.run(\n streamingAlsKey,\n streamingCallback || sentinelNoopStreamingCallback,\n fn\n );\n}\n\n/**\n * Retrieves the {@link StreamingCallback} previously set by {@link runWithStreamingCallback}\n *\n * @hidden\n */\nexport function getStreamingCallback<S>(\n registry: Registry\n): StreamingCallback<S> | undefined {\n const cb =\n registry.asyncStore.getStore<StreamingCallback<S>>(streamingAlsKey);\n if (cb === sentinelNoopStreamingCallback) {\n return undefined;\n }\n return cb;\n}\n\nconst runtimeContextAslKey = 'core.action.runtimeContext';\n\n/**\n * Checks whether the caller is currently in the runtime context of an action.\n */\nexport function isInRuntimeContext(registry: Registry) {\n return registry.asyncStore.getStore(runtimeContextAslKey) === 'runtime';\n}\n\n/**\n * Execute the provided function in the action runtime context.\n */\nexport function runInActionRuntimeContext<R>(registry: Registry, fn: () => R) {\n return registry.asyncStore.run(runtimeContextAslKey, 'runtime', fn);\n}\n\n/**\n * Execute the provided function outside the action runtime context.\n */\nexport function runOutsideActionRuntimeContext<R>(\n registry: Registry,\n fn: () => R\n) {\n return registry.asyncStore.run(runtimeContextAslKey, 'outside', fn);\n}\n"],"mappings":"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","names":["action","req","actionFn","output"]}