genkit
Version:
Genkit AI framework
1 lines • 40.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/genkit.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 {\n checkOperation,\n defineHelper,\n definePartial,\n definePrompt,\n defineTool,\n embed,\n evaluate,\n generate,\n generateStream,\n loadPromptFolder,\n prompt,\n rerank,\n retrieve,\n type BaseDataPointSchema,\n type Document,\n type EmbedderInfo,\n type EmbedderParams,\n type Embedding,\n type EvalResponses,\n type EvaluatorParams,\n type ExecutablePrompt,\n type GenerateOptions,\n type GenerateRequest,\n type GenerateResponse,\n type GenerateResponseChunk,\n type GenerateResponseData,\n type GenerateStreamOptions,\n type GenerateStreamResponse,\n type GenerationCommonConfigSchema,\n type IndexerParams,\n type ModelArgument,\n type Part,\n type PromptConfig,\n type PromptGenerateOptions,\n type RankedDocument,\n type RerankerParams,\n type RetrieverAction,\n type RetrieverInfo,\n type RetrieverParams,\n type ToolAction,\n type ToolConfig,\n} from '@genkit-ai/ai';\nimport {\n defineEmbedder,\n embedMany,\n type EmbedderAction,\n type EmbedderArgument,\n type EmbedderFn,\n type EmbeddingBatch,\n} from '@genkit-ai/ai/embedder';\nimport {\n defineEvaluator,\n type EvaluatorAction,\n type EvaluatorFn,\n} from '@genkit-ai/ai/evaluator';\nimport { configureFormats } from '@genkit-ai/ai/formats';\nimport {\n defineBackgroundModel,\n defineGenerateAction,\n defineModel,\n type BackgroundModelAction,\n type DefineBackgroundModelOptions,\n type DefineModelOptions,\n type GenerateResponseChunkData,\n type ModelAction,\n} from '@genkit-ai/ai/model';\nimport {\n defineReranker,\n type RerankerFn,\n type RerankerInfo,\n} from '@genkit-ai/ai/reranker';\nimport {\n defineIndexer,\n defineRetriever,\n defineSimpleRetriever,\n index,\n type DocumentData,\n type IndexerAction,\n type IndexerFn,\n type RetrieverFn,\n type SimpleRetrieverOptions,\n} from '@genkit-ai/ai/retriever';\nimport { dynamicTool, type ToolFn } from '@genkit-ai/ai/tool';\nimport {\n ActionFnArg,\n GenkitError,\n Operation,\n ReflectionServer,\n defineDynamicActionProvider,\n defineFlow,\n defineJsonSchema,\n defineSchema,\n getContext,\n isAction,\n isBackgroundAction,\n isDevEnv,\n registerBackgroundAction,\n run,\n setClientHeader,\n type Action,\n type ActionContext,\n type DapConfig,\n type DapFn,\n type DynamicActionProviderAction,\n type FlowConfig,\n type FlowFn,\n type JSONSchema,\n type StreamingCallback,\n type z,\n} from '@genkit-ai/core';\nimport { Channel } from '@genkit-ai/core/async';\nimport type { HasRegistry } from '@genkit-ai/core/registry';\nimport type { BaseEvalDataPointSchema } from './evaluator.js';\nimport { logger } from './logging.js';\nimport {\n ResolvableAction,\n isPluginV2,\n type GenkitPlugin,\n type GenkitPluginV2,\n} from './plugin.js';\nimport { Registry, type ActionType } from './registry.js';\nimport { SPAN_TYPE_ATTR, runInNewSpan } from './tracing.js';\n\n/**\n * @deprecated use `ai.definePrompt({messages: fn})`\n */\nexport type PromptFn<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n> = (input: z.infer<I>) => Promise<GenerateRequest<CustomOptionsSchema>>;\n\n/**\n * Options for initializing Genkit.\n */\nexport interface GenkitOptions {\n /** List of plugins to load. */\n plugins?: (GenkitPlugin | GenkitPluginV2)[];\n /** Directory where dotprompts are stored. */\n promptDir?: string;\n /** Default model to use if no model is specified. */\n model?: ModelArgument<any>;\n /** Additional runtime context data for flows and tools. */\n context?: ActionContext;\n /** Display name that will be shown in developer tooling. */\n name?: string;\n /** Additional attribution information to include in the x-goog-api-client header. */\n clientHeader?: string;\n}\n\n/**\n * `Genkit` encapsulates a single Genkit instance including the {@link Registry}, {@link ReflectionServer}, {@link FlowServer}, and configuration.\n *\n * Do not instantiate this class directly. Use {@link genkit}.\n *\n * Registry keeps track of actions, flows, tools, and many other components. Reflection server exposes an API to inspect the registry and trigger executions of actions in the registry. Flow server exposes flows as HTTP endpoints for production use.\n *\n * There may be multiple Genkit instances in a single codebase.\n */\nexport class Genkit implements HasRegistry {\n /** Developer-configured options. */\n readonly options: GenkitOptions;\n /** Registry instance that is exclusively modified by this Genkit instance. */\n readonly registry: Registry;\n /** Reflection server for this registry. May be null if not started. */\n private reflectionServer: ReflectionServer | null = null;\n /** List of flows that have been registered in this instance. */\n readonly flows: Action<any, any, any>[] = [];\n\n get apiStability() {\n return this.registry.apiStability;\n }\n\n constructor(options?: GenkitOptions) {\n this.options = options || {};\n this.registry = new Registry();\n if (this.options.context) {\n this.registry.context = this.options.context;\n }\n this.configure();\n if (isDevEnv() && !disableReflectionApi) {\n this.reflectionServer = new ReflectionServer(this.registry, {\n configuredEnvs: ['dev'],\n name: this.options.name,\n });\n this.reflectionServer.start().catch((e) => logger.error);\n }\n if (options?.clientHeader) {\n setClientHeader(options?.clientHeader);\n }\n }\n\n /**\n * Defines and registers a flow function.\n */\n defineFlow<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n S extends z.ZodTypeAny = z.ZodTypeAny,\n >(\n config: FlowConfig<I, O, S> | string,\n fn: FlowFn<I, O, S>\n ): Action<I, O, S> {\n const flow = defineFlow(this.registry, config, fn);\n this.flows.push(flow);\n return flow;\n }\n\n /**\n * Defines and registers a tool.\n *\n * Tools can be passed to models by name or value during `generate` calls to be called automatically based on the prompt and situation.\n */\n defineTool<I extends z.ZodTypeAny, O extends z.ZodTypeAny>(\n config: ToolConfig<I, O>,\n fn: ToolFn<I, O>\n ): ToolAction<I, O> {\n return defineTool(this.registry, config, fn);\n }\n\n /**\n * Defines a dynamic tool. Dynamic tools are just like regular tools ({@link Genkit.defineTool}) but will not be registered in the\n * Genkit registry and can be defined dynamically at runtime.\n */\n dynamicTool<I extends z.ZodTypeAny, O extends z.ZodTypeAny>(\n config: ToolConfig<I, O>,\n fn?: ToolFn<I, O>\n ): ToolAction<I, O> {\n return dynamicTool(config, fn) as ToolAction<I, O>;\n }\n\n /**\n * Defines and registers a dynamic action provider (e.g. mcp host)\n */\n defineDynamicActionProvider(\n config: DapConfig | string,\n fn: DapFn\n ): DynamicActionProviderAction {\n return defineDynamicActionProvider(this.registry, config, fn);\n }\n\n /**\n * Defines and registers a schema from a Zod schema.\n *\n * Defined schemas can be referenced by `name` in prompts in place of inline schemas.\n */\n defineSchema<T extends z.ZodTypeAny>(name: string, schema: T): T {\n return defineSchema(this.registry, name, schema);\n }\n\n /**\n * Defines and registers a schema from a JSON schema.\n *\n * Defined schemas can be referenced by `name` in prompts in place of inline schemas.\n */\n defineJsonSchema(name: string, jsonSchema: JSONSchema) {\n return defineJsonSchema(this.registry, name, jsonSchema);\n }\n\n /**\n * Defines a new model and adds it to the registry.\n */\n defineModel<CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny>(\n options: {\n apiVersion: 'v2';\n } & DefineModelOptions<CustomOptionsSchema>,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n options: ActionFnArg<GenerateResponseChunkData>\n ) => Promise<GenerateResponseData>\n ): ModelAction<CustomOptionsSchema>;\n\n /**\n * Defines a new model and adds it to the registry.\n */\n defineModel<CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny>(\n options: DefineModelOptions<CustomOptionsSchema>,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n streamingCallback?: StreamingCallback<GenerateResponseChunkData>\n ) => Promise<GenerateResponseData>\n ): ModelAction<CustomOptionsSchema>;\n\n /**\n * Defines a new model and adds it to the registry.\n */\n defineModel<CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny>(\n options: any,\n runner: (\n request: GenerateRequest<CustomOptionsSchema>,\n streamingCallback: any\n ) => Promise<GenerateResponseData>\n ): ModelAction<CustomOptionsSchema> {\n return defineModel(this.registry, options, runner);\n }\n\n /**\n * Defines a new background model and adds it to the registry.\n */\n defineBackgroundModel<\n CustomOptionsSchema extends z.ZodTypeAny = z.ZodTypeAny,\n >(\n options: DefineBackgroundModelOptions<CustomOptionsSchema>\n ): BackgroundModelAction<CustomOptionsSchema> {\n return defineBackgroundModel(this.registry, options);\n }\n\n /**\n * Looks up a prompt by `name` (and optionally `variant`). Can be used to lookup\n * .prompt files or prompts previously defined with {@link Genkit.definePrompt}\n */\n prompt<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n >(\n name: string,\n options?: { variant?: string }\n ): ExecutablePrompt<z.infer<I>, O, CustomOptions> {\n return this.wrapExecutablePromptPromise(\n `${name}${options?.variant ? `.${options?.variant}` : ''}`,\n prompt(this.registry, name, {\n ...options,\n dir: this.options.promptDir ?? './prompts',\n })\n );\n }\n\n private wrapExecutablePromptPromise<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n >(\n name: string,\n promise: Promise<ExecutablePrompt<z.infer<I>, O, CustomOptions>>\n ) {\n const executablePrompt = (async (\n input?: I,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): Promise<GenerateResponse<z.infer<O>>> => {\n return (await promise)(input, opts);\n }) as ExecutablePrompt<z.infer<I>, O, CustomOptions>;\n\n executablePrompt.ref = { name };\n\n executablePrompt.render = async (\n input?: I,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): Promise<GenerateOptions<O, CustomOptions>> => {\n return (await promise).render(input, opts) as Promise<\n GenerateOptions<O, CustomOptions>\n >;\n };\n\n executablePrompt.stream = (\n input?: I,\n opts?: PromptGenerateOptions<O, CustomOptions>\n ): GenerateStreamResponse<O> => {\n let channel = new Channel<GenerateResponseChunk>();\n\n const generated = runInNewSpan(\n this.registry,\n {\n metadata: {\n name,\n input,\n },\n labels: {\n [SPAN_TYPE_ATTR]: 'dotprompt',\n },\n },\n () =>\n generate<O, CustomOptions>(\n this.registry,\n promise.then((action) =>\n action.render(input, {\n ...opts,\n onChunk: (chunk) => channel.send(chunk),\n })\n )\n )\n );\n generated.then(\n () => channel.close(),\n (err) => channel.error(err)\n );\n\n return {\n response: generated,\n stream: channel,\n };\n };\n\n executablePrompt.asTool = async (): Promise<ToolAction<I, O>> => {\n return (await promise).asTool() as Promise<ToolAction<I, O>>;\n };\n\n return executablePrompt;\n }\n\n /**\n * Defines and registers a prompt based on a function.\n *\n * This is an alternative to defining and importing a .prompt file, providing\n * the most advanced control over how the final request to the model is made.\n *\n * @param options - Prompt metadata including model, model params,\n * input/output schemas, etc\n * @param fn - A function that returns a {@link GenerateRequest}. Any config\n * parameters specified by the {@link GenerateRequest} will take precedence\n * over any parameters specified by `options`.\n *\n * ```ts\n * const hi = ai.definePrompt(\n * {\n * name: 'hi',\n * input: {\n * schema: z.object({\n * name: z.string(),\n * }),\n * },\n * config: {\n * temperature: 1,\n * },\n * },\n * async (input) => {\n * return {\n * messages: [ { role: 'user', content: [{ text: `hi ${input.name}` }] } ],\n * };\n * }\n * );\n * const { text } = await hi({ name: 'Genkit' });\n * ```\n */\n definePrompt<\n I extends z.ZodTypeAny = z.ZodTypeAny,\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n >(\n options: PromptConfig<I, O, CustomOptions>,\n /** @deprecated use `options.messages` with a template string instead. */\n templateOrFn?: string | PromptFn<I>\n ): ExecutablePrompt<z.infer<I>, O, CustomOptions> {\n // For backwards compatibility...\n if (templateOrFn) {\n if (options.messages) {\n throw new GenkitError({\n status: 'INVALID_ARGUMENT',\n message:\n 'Cannot specify template/function argument and `options.messages` at the same time',\n });\n }\n if (typeof templateOrFn === 'string') {\n return definePrompt(this.registry, {\n ...options,\n messages: templateOrFn,\n });\n } else {\n // it's the PromptFn\n return definePrompt(this.registry, {\n ...options,\n messages: async (input) => {\n const response = await (\n templateOrFn as PromptFn<z.infer<I>, CustomOptions>\n )(input);\n return response.messages;\n },\n });\n }\n }\n return definePrompt(this.registry, options);\n }\n\n /**\n * Creates a retriever action for the provided {@link RetrieverFn} implementation.\n */\n defineRetriever<OptionsType extends z.ZodTypeAny = z.ZodTypeAny>(\n options: {\n name: string;\n configSchema?: OptionsType;\n info?: RetrieverInfo;\n },\n runner: RetrieverFn<OptionsType>\n ): RetrieverAction<OptionsType> {\n return defineRetriever(this.registry, options, runner);\n }\n\n /**\n * defineSimpleRetriever makes it easy to map existing data into documents that\n * can be used for prompt augmentation.\n *\n * @param options Configuration options for the retriever.\n * @param handler A function that queries a datastore and returns items from which to extract documents.\n * @returns A Genkit retriever.\n */\n defineSimpleRetriever<C extends z.ZodTypeAny = z.ZodTypeAny, R = any>(\n options: SimpleRetrieverOptions<C, R>,\n handler: (query: Document, config: z.infer<C>) => Promise<R[]>\n ): RetrieverAction<C> {\n return defineSimpleRetriever(this.registry, options, handler);\n }\n\n /**\n * Creates an indexer action for the provided {@link IndexerFn} implementation.\n */\n defineIndexer<IndexerOptions extends z.ZodTypeAny>(\n options: {\n name: string;\n embedderInfo?: EmbedderInfo;\n configSchema?: IndexerOptions;\n },\n runner: IndexerFn<IndexerOptions>\n ): IndexerAction<IndexerOptions> {\n return defineIndexer(this.registry, options, runner);\n }\n\n /**\n * Creates evaluator action for the provided {@link EvaluatorFn} implementation.\n */\n defineEvaluator<\n DataPoint extends typeof BaseDataPointSchema = typeof BaseDataPointSchema,\n EvalDataPoint extends\n typeof BaseEvalDataPointSchema = typeof BaseEvalDataPointSchema,\n EvaluatorOptions extends z.ZodTypeAny = z.ZodTypeAny,\n >(\n options: {\n name: string;\n displayName: string;\n definition: string;\n dataPointType?: DataPoint;\n configSchema?: EvaluatorOptions;\n isBilled?: boolean;\n },\n runner: EvaluatorFn<EvalDataPoint, EvaluatorOptions>\n ): EvaluatorAction {\n return defineEvaluator(this.registry, options, runner);\n }\n\n /**\n * Creates embedder model for the provided {@link EmbedderFn} model implementation.\n */\n defineEmbedder<ConfigSchema extends z.ZodTypeAny = z.ZodTypeAny>(\n options: {\n name: string;\n configSchema?: ConfigSchema;\n info?: EmbedderInfo;\n },\n runner: EmbedderFn<ConfigSchema>\n ): EmbedderAction<ConfigSchema> {\n return defineEmbedder(this.registry, options, runner);\n }\n\n /**\n * create a handlebars helper (https://handlebarsjs.com/guide/block-helpers.html) to be used in dotprompt templates.\n */\n defineHelper(name: string, fn: Handlebars.HelperDelegate): void {\n defineHelper(this.registry, name, fn);\n }\n\n /**\n * Creates a handlebars partial (https://handlebarsjs.com/guide/partials.html) to be used in dotprompt templates.\n */\n definePartial(name: string, source: string): void {\n definePartial(this.registry, name, source);\n }\n\n /**\n * Creates a reranker action for the provided {@link RerankerFn} implementation.\n */\n defineReranker<OptionsType extends z.ZodTypeAny = z.ZodTypeAny>(\n options: {\n name: string;\n configSchema?: OptionsType;\n info?: RerankerInfo;\n },\n runner: RerankerFn<OptionsType>\n ) {\n return defineReranker(this.registry, options, runner);\n }\n\n /**\n * Embeds the given `content` using the specified `embedder`.\n */\n embed<CustomOptions extends z.ZodTypeAny>(\n params: EmbedderParams<CustomOptions>\n ): Promise<Embedding[]> {\n return embed(this.registry, params);\n }\n\n /**\n * A veneer for interacting with embedder models in bulk.\n */\n embedMany<ConfigSchema extends z.ZodTypeAny = z.ZodTypeAny>(params: {\n embedder: EmbedderArgument<ConfigSchema>;\n content: string[] | DocumentData[];\n metadata?: Record<string, unknown>;\n options?: z.infer<ConfigSchema>;\n }): Promise<EmbeddingBatch> {\n return embedMany(this.registry, params);\n }\n\n /**\n * Evaluates the given `dataset` using the specified `evaluator`.\n */\n evaluate<\n DataPoint extends typeof BaseDataPointSchema = typeof BaseDataPointSchema,\n CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n >(params: EvaluatorParams<DataPoint, CustomOptions>): Promise<EvalResponses> {\n return evaluate(this.registry, params);\n }\n\n /**\n * Reranks documents from a {@link RerankerArgument} based on the provided query.\n */\n rerank<CustomOptions extends z.ZodTypeAny>(\n params: RerankerParams<CustomOptions>\n ): Promise<Array<RankedDocument>> {\n return rerank(this.registry, params);\n }\n\n /**\n * Indexes `documents` using the provided `indexer`.\n */\n index<CustomOptions extends z.ZodTypeAny>(\n params: IndexerParams<CustomOptions>\n ): Promise<void> {\n return index(this.registry, params);\n }\n\n /**\n * Retrieves documents from the `retriever` based on the provided `query`.\n */\n retrieve<CustomOptions extends z.ZodTypeAny>(\n params: RetrieverParams<CustomOptions>\n ): Promise<Array<Document>> {\n return retrieve(this.registry, params);\n }\n\n /**\n * Make a generate call to the default model with a simple text prompt.\n *\n * ```ts\n * const ai = genkit({\n * plugins: [googleAI()],\n * model: gemini15Flash, // default model\n * })\n *\n * const { text } = await ai.generate('hi');\n * ```\n */\n generate<O extends z.ZodTypeAny = z.ZodTypeAny>(\n strPrompt: string\n ): Promise<GenerateResponse<z.infer<O>>>;\n\n /**\n * Make a generate call to the default model with a multipart request.\n *\n * ```ts\n * const ai = genkit({\n * plugins: [googleAI()],\n * model: gemini15Flash, // default model\n * })\n *\n * const { text } = await ai.generate([\n * { media: {url: 'http://....'} },\n * { text: 'describe this image' }\n * ]);\n * ```\n */\n generate<O extends z.ZodTypeAny = z.ZodTypeAny>(\n parts: Part[]\n ): Promise<GenerateResponse<z.infer<O>>>;\n\n /**\n * Generate calls a generative model based on the provided prompt and configuration. If\n * `messages` is provided, the generation will include a conversation history in its\n * request. If `tools` are provided, the generate method will automatically resolve\n * tool calls returned from the model unless `returnToolRequests` is set to `true`.\n *\n * See {@link GenerateOptions} for detailed information about available options.\n *\n * ```ts\n * const ai = genkit({\n * plugins: [googleAI()],\n * })\n *\n * const { text } = await ai.generate({\n * system: 'talk like a pirate',\n * prompt: [\n * { media: { url: 'http://....' } },\n * { text: 'describe this image' }\n * ],\n * messages: conversationHistory,\n * tools: [ userInfoLookup ],\n * model: gemini15Flash,\n * });\n * ```\n */\n generate<\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n >(\n opts:\n | GenerateOptions<O, CustomOptions>\n | PromiseLike<GenerateOptions<O, CustomOptions>>\n ): Promise<GenerateResponse<z.infer<O>>>;\n\n async generate<\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n >(\n options:\n | string\n | Part[]\n | GenerateOptions<O, CustomOptions>\n | PromiseLike<GenerateOptions<O, CustomOptions>>\n ): Promise<GenerateResponse<z.infer<O>>> {\n let resolvedOptions: GenerateOptions<O, CustomOptions>;\n if (options instanceof Promise) {\n resolvedOptions = await options;\n } else if (typeof options === 'string' || Array.isArray(options)) {\n resolvedOptions = {\n prompt: options,\n };\n } else {\n resolvedOptions = options as GenerateOptions<O, CustomOptions>;\n }\n return generate(this.registry, resolvedOptions);\n }\n\n /**\n * Make a streaming generate call to the default model with a simple text prompt.\n *\n * ```ts\n * const ai = genkit({\n * plugins: [googleAI()],\n * model: gemini15Flash, // default model\n * })\n *\n * const { response, stream } = ai.generateStream('hi');\n * for await (const chunk of stream) {\n * console.log(chunk.text);\n * }\n * console.log((await response).text);\n * ```\n */\n generateStream<O extends z.ZodTypeAny = z.ZodTypeAny>(\n strPrompt: string\n ): GenerateStreamResponse<z.infer<O>>;\n\n /**\n * Make a streaming generate call to the default model with a multipart request.\n *\n * ```ts\n * const ai = genkit({\n * plugins: [googleAI()],\n * model: gemini15Flash, // default model\n * })\n *\n * const { response, stream } = ai.generateStream([\n * { media: {url: 'http://....'} },\n * { text: 'describe this image' }\n * ]);\n * for await (const chunk of stream) {\n * console.log(chunk.text);\n * }\n * console.log((await response).text);\n * ```\n */\n generateStream<O extends z.ZodTypeAny = z.ZodTypeAny>(\n parts: Part[]\n ): GenerateStreamResponse<z.infer<O>>;\n\n /**\n * Streaming generate calls a generative model based on the provided prompt and configuration. If\n * `messages` is provided, the generation will include a conversation history in its\n * request. If `tools` are provided, the generate method will automatically resolve\n * tool calls returned from the model unless `returnToolRequests` is set to `true`.\n *\n * See {@link GenerateOptions} for detailed information about available options.\n *\n * ```ts\n * const ai = genkit({\n * plugins: [googleAI()],\n * })\n *\n * const { response, stream } = ai.generateStream({\n * system: 'talk like a pirate',\n * prompt: [\n * { media: { url: 'http://....' } },\n * { text: 'describe this image' }\n * ],\n * messages: conversationHistory,\n * tools: [ userInfoLookup ],\n * model: gemini15Flash,\n * });\n * for await (const chunk of stream) {\n * console.log(chunk.text);\n * }\n * console.log((await response).text);\n * ```\n */\n generateStream<\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n >(\n parts:\n | GenerateOptions<O, CustomOptions>\n | PromiseLike<GenerateOptions<O, CustomOptions>>\n ): GenerateStreamResponse<z.infer<O>>;\n\n generateStream<\n O extends z.ZodTypeAny = z.ZodTypeAny,\n CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n >(\n options:\n | string\n | Part[]\n | GenerateStreamOptions<O, CustomOptions>\n | PromiseLike<GenerateStreamOptions<O, CustomOptions>>\n ): GenerateStreamResponse<z.infer<O>> {\n if (typeof options === 'string' || Array.isArray(options)) {\n options = { prompt: options };\n }\n return generateStream(this.registry, options);\n }\n\n /**\n * Checks the status of of a given operation. Returns a new operation which will contain the updated status.\n *\n * ```ts\n * let operation = await ai.generateOperation({\n * model: googleAI.model('veo-2.0-generate-001'),\n * prompt: 'A banana riding a bicycle.',\n * });\n *\n * while (!operation.done) {\n * operation = await ai.checkOperation(operation!);\n * await new Promise((resolve) => setTimeout(resolve, 5000));\n * }\n * ```\n *\n * @param operation\n * @returns\n */\n checkOperation<T>(operation: Operation<T>): Promise<Operation<T>> {\n return checkOperation(this.registry, operation);\n }\n\n /**\n * A flow step that executes the provided function. Each run step is recorded separately in the trace.\n *\n * ```ts\n * ai.defineFlow('hello', async() => {\n * await ai.run('step1', async () => {\n * // ... step 1\n * });\n * await ai.run('step2', async () => {\n * // ... step 2\n * });\n * return result;\n * })\n * ```\n */\n run<T>(name: string, func: () => Promise<T>): Promise<T>;\n\n /**\n * A flow step that executes the provided function. Each run step is recorded separately in the trace.\n *\n * ```ts\n * ai.defineFlow('hello', async() => {\n * await ai.run('step1', async () => {\n * // ... step 1\n * });\n * await ai.run('step2', async () => {\n * // ... step 2\n * });\n * return result;\n * })\n */\n run<T>(\n name: string,\n input: any,\n func: (input?: any) => Promise<T>\n ): Promise<T>;\n\n run<T>(\n name: string,\n funcOrInput: () => Promise<T> | any,\n maybeFunc?: (input?: any) => Promise<T>\n ): Promise<T> {\n if (maybeFunc) {\n return run(name, funcOrInput, maybeFunc, this.registry);\n }\n return run(name, funcOrInput, this.registry);\n }\n\n /**\n * Returns current action (or flow) invocation context. Can be used to access things like auth\n * data set by HTTP server frameworks. If invoked outside of an action (e.g. flow or tool) will\n * return `undefined`.\n */\n currentContext(): ActionContext | undefined {\n return getContext();\n }\n\n /**\n * Configures the Genkit instance.\n */\n private configure() {\n const activeRegistry = this.registry;\n defineGenerateAction(activeRegistry);\n // install the default formats in the registry\n configureFormats(activeRegistry);\n const plugins = [...(this.options.plugins ?? [])];\n if (this.options.model) {\n this.registry.registerValue(\n 'defaultModel',\n 'defaultModel',\n this.options.model\n );\n }\n if (this.options.promptDir !== null) {\n loadPromptFolder(\n this.registry,\n this.options.promptDir ?? './prompts',\n ''\n );\n }\n plugins.forEach((plugin) => {\n if (isPluginV2(plugin)) {\n logger.debug(`Registering v2 plugin ${plugin.name}...`);\n activeRegistry.registerPluginProvider(plugin.name, {\n name: plugin.name,\n async initializer() {\n logger.debug(`Initializing plugin ${plugin.name}:`);\n if (!plugin.init) return;\n const resolvedActions = await plugin.init();\n resolvedActions?.forEach((resolvedAction) => {\n registerActionV2(activeRegistry, resolvedAction, plugin);\n });\n },\n async resolver(action: ActionType, target: string) {\n if (!plugin.resolve) return;\n const resolvedAction = await plugin.resolve(action, target);\n if (resolvedAction) {\n registerActionV2(activeRegistry, resolvedAction, plugin);\n }\n },\n async listActions() {\n if (typeof plugin.list === 'function') {\n return (await plugin.list()).map((a) => {\n if (a.name.startsWith(`${plugin.name}/`)) {\n return a;\n }\n return {\n ...a,\n // Apply namespace for v2 plugins.\n name: `${plugin.name}/${a.name}`,\n };\n });\n }\n return [];\n },\n });\n } else {\n const loadedPlugin = (plugin as GenkitPlugin)(this);\n logger.debug(`Registering plugin ${loadedPlugin.name}...`);\n activeRegistry.registerPluginProvider(loadedPlugin.name, {\n name: loadedPlugin.name,\n async initializer() {\n logger.debug(`Initializing plugin ${loadedPlugin.name}:`);\n await loadedPlugin.initializer();\n },\n async resolver(action: ActionType, target: string) {\n if (loadedPlugin.resolver) {\n await loadedPlugin.resolver(action, target);\n }\n },\n async listActions() {\n if (loadedPlugin.listActions) {\n return await loadedPlugin.listActions();\n }\n return [];\n },\n });\n }\n });\n }\n\n /**\n * Stops all servers.\n */\n async stopServers() {\n await this.reflectionServer?.stop();\n this.reflectionServer = null;\n }\n}\n\nfunction registerActionV2(\n registry: Registry,\n resolvedAction: ResolvableAction,\n plugin: GenkitPluginV2\n) {\n if (isBackgroundAction(resolvedAction)) {\n registerBackgroundAction(registry, resolvedAction, {\n namespace: plugin.name,\n });\n } else if (isAction(resolvedAction)) {\n if (!resolvedAction.__action.actionType) {\n throw new GenkitError({\n status: 'INVALID_ARGUMENT',\n message: 'Action type is missing for ' + resolvedAction.__action.name,\n });\n }\n registry.registerAction(\n resolvedAction.__action.actionType,\n resolvedAction,\n { namespace: plugin.name }\n );\n } else {\n throw new GenkitError({\n status: 'INVALID_ARGUMENT',\n message: 'Unknown action type returned from plugin ' + plugin.name,\n });\n }\n}\n\n/**\n * Initializes Genkit with a set of options.\n *\n * This will create a new Genkit registry, register the provided plugins, stores, and other configuration. This\n * should be called before any flows are registered.\n */\nexport function genkit(options: GenkitOptions): Genkit {\n return new Genkit(options);\n}\n\nconst shutdown = async () => {\n logger.info('Shutting down all Genkit servers...');\n await ReflectionServer.stopAll();\n process.exit(0);\n};\n\nprocess.on('SIGTERM', shutdown);\nprocess.on('SIGINT', shutdown);\n\nlet disableReflectionApi = false;\n\nexport function __disableReflectionApi() {\n disableReflectionApi = true;\n}\n"],"mappings":"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","names":[]}