{"version":3,"sources":["../src/generate.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  assertUnstable,\n  GenkitError,\n  isAction,\n  Operation,\n  runWithContext,\n  sentinelNoopStreamingCallback,\n  type Action,\n  type ActionContext,\n  type StreamingCallback,\n  type z,\n} from '@genkit-ai/core';\nimport { Channel } from '@genkit-ai/core/async';\nimport { Registry } from '@genkit-ai/core/registry';\nimport { toJsonSchema } from '@genkit-ai/core/schema';\nimport type { DocumentData } from './document.js';\nimport {\n  injectInstructions,\n  resolveFormat,\n  resolveInstructions,\n} from './formats/index.js';\nimport {\n  generateHelper,\n  shouldInjectFormatInstructions,\n} from './generate/action.js';\nimport { GenerateResponseChunk } from './generate/chunk.js';\nimport {\n  GenerateMiddleware,\n  generateMiddleware,\n  GenerateMiddlewareDef,\n  resolveMiddleware,\n} from './generate/middleware.js';\nimport { GenerateResponse } from './generate/response.js';\nimport { Message } from './message.js';\nimport {\n  GenerateResponseChunkData,\n  GenerateResponseData,\n  ResolvedModel,\n  resolveModel,\n  type GenerateActionOptions,\n  type GenerateRequest,\n  type GenerationCommonConfigSchema,\n  type MessageData,\n  type MiddlewareRef,\n  type ModelArgument,\n  type ModelMiddlewareArgument,\n  type Part,\n  type ToolRequestPart,\n  type ToolResponsePart,\n} from './model.js';\nimport { isExecutablePrompt } from './prompt.js';\nimport {\n  isDynamicResourceAction,\n  resolveResources,\n  ResourceAction,\n  ResourceArgument,\n} from './resource.js';\nimport {\n  isDynamicTool,\n  isMultipartTool,\n  resolveTools,\n  toToolDefinition,\n  type ToolArgument,\n} from './tool.js';\n\nexport { GenerateResponse, GenerateResponseChunk };\n\n/** Specifies how tools should be called by the model. */\nexport type ToolChoice = 'auto' | 'required' | 'none';\n\nexport interface OutputOptions<O extends z.ZodTypeAny = z.ZodTypeAny> {\n  format?: string;\n  contentType?: string;\n  instructions?: boolean | string;\n  schema?: O;\n  jsonSchema?: any;\n  constrained?: boolean;\n}\n\n/** ResumeOptions configure how to resume generation after an interrupt. */\nexport interface ResumeOptions {\n  /**\n   * respond should contain a single or list of `toolResponse` parts corresponding\n   * to interrupt `toolRequest` parts from the most recent model message. Each\n   * entry must have a matching `name` and `ref` (if supplied) for its `toolRequest`\n   * counterpart.\n   *\n   * Tools have a `.respond` helper method to construct a reply ToolResponse and validate\n   * the data against its schema. Call `myTool.respond(interruptToolRequest, yourReplyData)`.\n   */\n  respond?: ToolResponsePart | ToolResponsePart[];\n  /**\n   * restart will run a tool again with additionally supplied metadata passed through as\n   * a `resumed` option in the second argument. This allows for scenarios like conditionally\n   * requesting confirmation of an LLM's tool request.\n   *\n   * Tools have a `.restart` helper method to construct a restart ToolRequest. Call\n   * `myTool.restart(interruptToolRequest, resumeMetadata)`.\n   *\n   */\n  restart?: ToolRequestPart | ToolRequestPart[];\n  /** Additional metadata to annotate the created tool message with in the \"resume\" key. */\n  metadata?: Record<string, any>;\n}\n\nexport interface GenerateOptions<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = z.ZodTypeAny,\n> {\n  /** A model name (e.g. `vertexai/gemini-1.0-pro`) or reference. */\n  model?: ModelArgument<CustomOptions>;\n  /** The system prompt to be included in the generate request. Can be a string for a simple text prompt or one or more parts for multi-modal prompts (subject to model support). */\n  system?: string | Part | Part[];\n  /** The prompt for which to generate a response. Can be a string for a simple text prompt or one or more parts for multi-modal prompts. */\n  prompt?: string | Part | Part[];\n  /** Retrieved documents to be used as context for this generation. */\n  docs?: DocumentData[];\n  /** Conversation messages (history) for multi-turn prompting when supported by the underlying model. */\n  messages?: (MessageData & { content: Part[] | string | (string | Part)[] })[];\n  /** List of registered tool names or actions to treat as a tool for this generation if supported by the underlying model. */\n  tools?: ToolArgument[];\n  /** List of dynamic resources to be made available to this generate request. */\n  resources?: ResourceArgument[];\n  /** Specifies how tools should be called by the model.  */\n  toolChoice?: ToolChoice;\n  /** Configuration for the generation request. */\n  config?: z.infer<CustomOptions>;\n  /** Configuration for the desired output of the request. Defaults to the model's default output if unspecified. */\n  output?: OutputOptions<O>;\n  /**\n   * resume provides convenient capabilities for continuing generation\n   * after an interrupt is triggered. Example:\n   *\n   * ```ts\n   * const myInterrupt = ai.defineInterrupt({...});\n   *\n   * const response = await ai.generate({\n   *   tools: [myInterrupt],\n   *   prompt: \"Call myInterrupt\",\n   * });\n   *\n   * const interrupt = response.interrupts[0];\n   *\n   * const resumedResponse = await ai.generate({\n   *   messages: response.messages,\n   *   resume: myInterrupt.respond(interrupt, {note: \"this is the reply data\"}),\n   * });\n   * ```\n   *\n   * @beta\n   */\n  resume?: ResumeOptions;\n  /** When true, return tool calls for manual processing instead of automatically resolving them. */\n  returnToolRequests?: boolean;\n  /** Maximum number of tool call iterations that can be performed in a single generate call (default 5). */\n  maxTurns?: number;\n  /** When provided, models supporting streaming will call the provided callback with chunks as generation progresses. */\n  onChunk?: StreamingCallback<GenerateResponseChunk>;\n  /**\n   * When provided, models supporting streaming will call the provided callback with chunks as generation progresses.\n   *\n   * @deprecated use {@link onChunk} instead.\n   */\n  streamingCallback?: StreamingCallback<GenerateResponseChunk>;\n  /** Middleware to be used with this model call. */\n  use?: (ModelMiddlewareArgument | GenerateMiddleware | MiddlewareRef)[];\n  /** Additional context (data, like e.g. auth) to be passed down to tools, prompts and other sub actions. */\n  context?: ActionContext;\n  /** Abort signal for the generate request. */\n  abortSignal?: AbortSignal;\n  /** Custom step name for this generate call to display in trace views. Defaults to \"generate\". */\n  stepName?: string;\n  /**\n   * Additional metadata describing the GenerateOptions, used by tooling. If\n   * this is an instance of a rendered dotprompt, will contain any prompt\n   * metadata contained in the original frontmatter.\n   **/\n  metadata?: Record<string, any>;\n}\n\nexport async function toGenerateRequest(\n  registry: Registry,\n  options: GenerateOptions\n): Promise<GenerateRequest> {\n  const messages: MessageData[] = [];\n  if (options.system) {\n    messages.push({\n      role: 'system',\n      content: Message.parseContent(options.system),\n    });\n  }\n  if (options.messages) {\n    messages.push(...options.messages.map((m) => Message.parseData(m)));\n  }\n  if (options.prompt) {\n    messages.push({\n      role: 'user',\n      content: Message.parseContent(options.prompt),\n    });\n  }\n  if (messages.length === 0) {\n    throw new GenkitError({\n      status: 'INVALID_ARGUMENT',\n      message: 'at least one message is required in generate request',\n    });\n  }\n  if (\n    options.resume &&\n    !(\n      messages.at(-1)?.role === 'model' &&\n      messages.at(-1)?.content.find((p) => !!p.toolRequest)\n    )\n  ) {\n    throw new GenkitError({\n      status: 'FAILED_PRECONDITION',\n      message: `Last message must be a 'model' role with at least one tool request to 'resume' generation.`,\n      detail: messages.at(-1),\n    });\n  }\n  let tools: Action<any, any>[] | undefined;\n  if (options.tools) {\n    tools = await resolveTools(registry, options.tools);\n  }\n  let resources: ResourceAction[] | undefined;\n  if (options.resources) {\n    resources = await resolveResources(registry, options.resources);\n  }\n\n  const resolvedSchema = toJsonSchema({\n    schema: options.output?.schema,\n    jsonSchema: options.output?.jsonSchema,\n  });\n\n  const resolvedFormat = await resolveFormat(registry, options.output);\n  const instructions = resolveInstructions(\n    resolvedFormat,\n    resolvedSchema,\n    options?.output?.instructions\n  );\n\n  const out = {\n    messages: shouldInjectFormatInstructions(\n      resolvedFormat?.config,\n      options.output\n    )\n      ? injectInstructions(messages, instructions)\n      : messages,\n    config: options.config,\n    docs: options.docs,\n    tools: tools?.map(toToolDefinition) || [],\n    resources: resources?.map((a) => a.__action) || [],\n    output: {\n      ...(resolvedFormat?.config || {}),\n      ...options.output,\n      schema: resolvedSchema,\n    },\n  } as GenerateRequest;\n  if (!out?.output?.schema) delete out?.output?.schema;\n  return out;\n}\n\nexport class GenerationResponseError extends GenkitError {\n  detail: {\n    response: GenerateResponse;\n    [otherDetails: string]: any;\n  };\n\n  constructor(\n    response: GenerateResponse<any>,\n    message: string,\n    status?: GenkitError['status'],\n    detail?: Record<string, any>\n  ) {\n    super({\n      status: status || 'FAILED_PRECONDITION',\n      message,\n    });\n    this.detail = { response, ...detail };\n  }\n}\n\nasync function toolsToActionRefs(\n  registry: Registry,\n  toolOpt?: ToolArgument[]\n): Promise<string[] | undefined> {\n  if (!toolOpt) return;\n\n  const tools: string[] = [];\n\n  for (const t of toolOpt) {\n    if (typeof t === 'string') {\n      const names = await resolveFullToolNames(registry, t);\n      tools.push(...names);\n    } else if (isAction(t) || isDynamicTool(t)) {\n      tools.push(`/${t.__action.metadata?.type}/${t.__action.name}`);\n    } else if (isExecutablePrompt(t)) {\n      const promptToolAction = await t.asTool();\n      tools.push(`/prompt/${promptToolAction.__action.name}`);\n    } else {\n      throw new Error(`Unable to determine type of tool: ${JSON.stringify(t)}`);\n    }\n  }\n  return tools;\n}\n\nasync function resourcesToActionRefs(\n  registry: Registry,\n  resOpt?: ResourceArgument[]\n): Promise<string[] | undefined> {\n  if (!resOpt) return;\n\n  const resources: string[] = [];\n\n  for (const r of resOpt) {\n    if (typeof r === 'string') {\n      const names = await resolveFullResourceNames(registry, r);\n      resources.push(...names);\n    } else if (isAction(r)) {\n      resources.push(`/resource/${r.__action.name}`);\n    } else {\n      throw new Error(`Unable to resolve resource: ${JSON.stringify(r)}`);\n    }\n  }\n  return resources;\n}\n\nfunction messagesFromOptions(options: GenerateOptions): MessageData[] {\n  const messages: MessageData[] = [];\n  if (options.system) {\n    messages.push({\n      role: 'system',\n      content: Message.parseContent(options.system),\n    });\n  }\n  if (options.messages) {\n    messages.push(...options.messages);\n  }\n  if (options.prompt) {\n    messages.push({\n      role: 'user',\n      content: Message.parseContent(options.prompt),\n    });\n  }\n  if (messages.length === 0) {\n    throw new GenkitError({\n      status: 'INVALID_ARGUMENT',\n      message: 'at least one message is required in generate request',\n    });\n  }\n  return messages;\n}\n\n/** A GenerationBlockedError is thrown when a generation is blocked. */\nexport class GenerationBlockedError extends GenerationResponseError {}\n\n/**\n * Normalizes a mix of middleware representations into an array of standardized `MiddlewareRef`s.\n * Any raw functional middleware or unregistered middleware objects are dynamically registered\n * into the provided registry.\n *\n * @param registry The registry to use for looking up or dynamically registering middleware.\n * @param middlewareList An array of middleware functions, instances, or references.\n * @returns A promise resolving to an array of normalized `MiddlewareRef` objects.\n */\nexport async function normalizeMiddleware(\n  registry: Registry,\n  middlewareList?: (\n    | ModelMiddlewareArgument\n    | GenerateMiddleware\n    | MiddlewareRef\n  )[]\n): Promise<MiddlewareRef[]> {\n  if (!middlewareList || middlewareList.length === 0) {\n    return [];\n  }\n\n  const refs: MiddlewareRef[] = [];\n\n  for (let i = 0; i < middlewareList.length; i++) {\n    const middleware = middlewareList[i];\n\n    if (\n      typeof middleware === 'function' &&\n      (middleware as any).instantiate &&\n      (middleware as any).plugin\n    ) {\n      throw new GenkitError({\n        status: 'INVALID_ARGUMENT',\n        message: `Middleware ${(middleware as any).name || 'function'} must be called with () when used in 'use' array.`,\n      });\n    }\n\n    if (typeof middleware === 'function') {\n      const name = `dynamic-middleware-${i}-${Math.random().toString(36).slice(2)}`;\n\n      const wrappedDef = generateMiddleware(\n        { name, metadata: { dynamic: true } },\n        () => ({\n          model: async (req, ctx, next) => {\n            if (middleware.length === 3) {\n              return (middleware as any)(\n                req,\n                ctx,\n                async (modifiedReq: any, opts: any) =>\n                  next(modifiedReq || req, opts || ctx)\n              );\n            } else {\n              return (middleware as any)(req, async (modifiedReq: any) =>\n                next(modifiedReq || req, ctx)\n              );\n            }\n          },\n        })\n      );\n      registry.registerValue('middleware', name, wrappedDef);\n      refs.push({ name });\n      continue;\n    }\n\n    if (\n      typeof middleware === 'object' &&\n      middleware !== null &&\n      'instantiate' in middleware &&\n      typeof middleware.instantiate === 'function'\n    ) {\n      const def = middleware as GenerateMiddleware;\n      const registered = await registry.lookupValue<GenerateMiddleware>(\n        'middleware',\n        def.name\n      );\n      if (!registered) {\n        registry.registerValue('middleware', def.name, def);\n      }\n      refs.push({ name: def.name });\n      continue;\n    }\n\n    if (\n      typeof middleware === 'object' &&\n      middleware !== null &&\n      'name' in middleware\n    ) {\n      const ref = middleware as MiddlewareRef & { __def?: GenerateMiddleware };\n      const registered = await registry.lookupValue<GenerateMiddleware>(\n        'middleware',\n        ref.name\n      );\n      if (!registered && ref.__def) {\n        registry.registerValue('middleware', ref.name, ref.__def);\n      }\n      refs.push({ name: ref.name, config: ref.config });\n    }\n  }\n\n  return refs;\n}\n\n/**\n * Generate calls a generative model based on the provided prompt and configuration. If\n * `history` 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 `GenerateOptions` for detailed information about available options.\n *\n * @param options The options for this generation request.\n * @returns The generated response based on the provided parameters.\n */\nexport async function generate<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n>(\n  registry: Registry,\n  options:\n    | GenerateOptions<O, CustomOptions>\n    | PromiseLike<GenerateOptions<O, CustomOptions>>\n): Promise<GenerateResponse<z.infer<O>>> {\n  const resolvedOptions: GenerateOptions<O, CustomOptions> = {\n    ...(await Promise.resolve(options)),\n  };\n  const resolvedFormat = await resolveFormat(registry, resolvedOptions.output);\n\n  registry = Registry.withParent(registry);\n\n  maybeRegisterDynamicTools(registry, resolvedOptions);\n  maybeRegisterDynamicResources(registry, resolvedOptions);\n\n  const middlewareRefs = await normalizeMiddleware(\n    registry,\n    resolvedOptions.use\n  );\n  resolvedOptions.use = middlewareRefs; // Cast back because `use` can be generic\n\n  const params = await toGenerateActionOptions(registry, resolvedOptions);\n\n  const tools = await toolsToActionRefs(registry, resolvedOptions.tools);\n  const resources = await resourcesToActionRefs(\n    registry,\n    resolvedOptions.resources\n  );\n  const streamingCallback = stripNoop(\n    resolvedOptions.onChunk ?? resolvedOptions.streamingCallback\n  ) as StreamingCallback<GenerateResponseChunkData>;\n\n  const resolvedMiddleware = await resolveMiddleware(registry, middlewareRefs);\n  maybeRegisterDynamicMiddlewareTools(registry, resolvedMiddleware);\n\n  const response = await runWithContext(resolvedOptions.context, () =>\n    generateHelper(registry, {\n      rawRequest: params,\n      middleware: resolvedMiddleware,\n      abortSignal: resolvedOptions.abortSignal,\n      streamingCallback,\n    })\n  );\n  const request = await toGenerateRequest(registry, {\n    ...resolvedOptions,\n    tools,\n    resources,\n  });\n  return new GenerateResponse<O>(response, {\n    request: response.request ?? request,\n    parser: resolvedFormat?.handler(request.output?.schema).parseMessage,\n  });\n}\n\nexport async function generateOperation<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n>(\n  registry: Registry,\n  options:\n    | GenerateOptions<O, CustomOptions>\n    | PromiseLike<GenerateOptions<O, CustomOptions>>\n): Promise<Operation<GenerateResponseData>> {\n  assertUnstable(registry, 'beta', 'generateOperation is a beta feature.');\n\n  options = await options;\n  const resolvedModel = await resolveModel(registry, options.model);\n  if (\n    !resolvedModel.modelAction.__action.metadata?.model.supports?.longRunning\n  ) {\n    throw new GenkitError({\n      status: 'INVALID_ARGUMENT',\n      message: `Model '${resolvedModel.modelAction.__action.name}' does not support long running operations.`,\n    });\n  }\n\n  const { operation } = await generate(registry, options);\n  if (!operation) {\n    throw new GenkitError({\n      status: 'FAILED_PRECONDITION',\n      message: `Model '${resolvedModel.modelAction.__action.name}' did not return an operation.`,\n    });\n  }\n  return operation;\n}\n\nexport function maybeRegisterDynamicMiddlewareTools(\n  registry: Registry,\n  middlewares?: GenerateMiddlewareDef[]\n) {\n  middlewares?.forEach((mw) => {\n    mw.tools?.forEach((t) => {\n      if (isDynamicTool(t)) {\n        registry.registerAction('tool', t as Action);\n      }\n    });\n  });\n}\n\nfunction maybeRegisterDynamicTools<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n>(registry: Registry, options: GenerateOptions<O, CustomOptions>) {\n  options?.tools?.forEach((t) => {\n    if (isDynamicTool(t)) {\n      if (isMultipartTool(t)) {\n        registry.registerAction('tool.v2', t);\n      } else {\n        registry.registerAction('tool', t as Action);\n      }\n    }\n  });\n}\n\nfunction maybeRegisterDynamicResources<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n>(registry: Registry, options: GenerateOptions<O, CustomOptions>) {\n  options?.resources?.forEach((r) => {\n    if (isDynamicResourceAction(r)) {\n      registry.registerAction('resource', r);\n    }\n  });\n}\n\nexport async function toGenerateActionOptions<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n>(\n  registry: Registry,\n  options: GenerateOptions<O, CustomOptions>\n): Promise<GenerateActionOptions> {\n  let resolvedModel: ResolvedModel<CustomOptions> | undefined;\n  if (options.model) {\n    resolvedModel = await resolveModel(registry, options.model);\n  }\n  const tools = await toolsToActionRefs(registry, options.tools);\n  const resources = await resourcesToActionRefs(registry, options.resources);\n  const messages: MessageData[] = messagesFromOptions(options);\n\n  const resolvedSchema = toJsonSchema({\n    schema: options.output?.schema,\n    jsonSchema: options.output?.jsonSchema,\n  });\n\n  // If is schema is set but format is not explicitly set, default to `json` format.\n  if (\n    (options.output?.schema || options.output?.jsonSchema) &&\n    !options.output?.format\n  ) {\n    options.output.format = 'json';\n  }\n\n  const params: GenerateActionOptions = {\n    model: resolvedModel?.modelAction.__action.name,\n    docs: options.docs,\n    messages: messages,\n    tools,\n    resources,\n    toolChoice: options.toolChoice,\n    config: {\n      version: resolvedModel?.version,\n      ...stripUndefinedOptions(resolvedModel?.config),\n      ...stripUndefinedOptions(options.config),\n    },\n    output: options.output && {\n      ...options.output,\n      format: options.output.format,\n      jsonSchema: resolvedSchema,\n    },\n    // coerce reply and restart into arrays for the action schema\n    resume: options.resume && {\n      respond: [options.resume.respond || []].flat(),\n      restart: [options.resume.restart || []].flat(),\n      metadata: options.resume.metadata,\n    },\n    returnToolRequests: options.returnToolRequests,\n    maxTurns: options.maxTurns,\n    stepName: options.stepName,\n    use: options.use as MiddlewareRef[] | undefined,\n  };\n  // if config is empty and it was not explicitly passed in, we delete it, don't want {}\n  if (Object.keys(params.config).length === 0 && !options.config) {\n    delete params.config;\n  }\n  return params;\n}\n\n/**\n * Check if the callback is a noop callback and return undefined -- downstream models\n * expect undefined if no streaming is requested.\n */\nfunction stripNoop<T>(\n  callback: StreamingCallback<T> | undefined\n): StreamingCallback<T> | undefined {\n  if (callback === sentinelNoopStreamingCallback) {\n    return undefined;\n  }\n  return callback;\n}\n\nfunction stripUndefinedOptions(input?: any): any {\n  if (!input) return input;\n  const copy = { ...input };\n  Object.keys(input).forEach((key) => {\n    if (copy[key] === undefined) {\n      delete copy[key];\n    }\n  });\n  return copy;\n}\n\nasync function resolveFullToolNames(\n  registry: Registry,\n  name: string\n): Promise<string[]> {\n  let names: string[];\n  const parts = name.split(':');\n  if (parts.length > 1) {\n    // Dynamic Action Provider\n    names = await registry.resolveActionNames(\n      `/dynamic-action-provider/${name}`\n    );\n    if (names.length) {\n      return names;\n    }\n  }\n  if (await registry.lookupAction(`/tool/${name}`)) {\n    return [`/tool/${name}`];\n  }\n  if (await registry.lookupAction(`/tool.v2/${name}`)) {\n    return [`/tool.v2/${name}`];\n  }\n  if (await registry.lookupAction(`/prompt/${name}`)) {\n    return [`/prompt/${name}`];\n  }\n  throw new Error(`Unable to resolve tool: ${name}`);\n}\n\nasync function resolveFullResourceNames(\n  registry: Registry,\n  name: string\n): Promise<string[]> {\n  let names: string[];\n  const parts = name.split(':');\n  if (parts.length > 1) {\n    // Dynamic Action Provider\n    names = await registry.resolveActionNames(\n      `/dynamic-action-provider/${name}`\n    );\n    if (names.length) {\n      return names;\n    }\n  }\n  if (await registry.lookupAction(`/resource/${name}`)) {\n    return [`/resource/${name}`];\n  }\n  throw new Error(`Unable to resolve resource: ${name}`);\n}\n\nexport type GenerateStreamOptions<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n> = Omit<GenerateOptions<O, CustomOptions>, 'streamingCallback'>;\n\nexport interface GenerateStreamResponse<O extends z.ZodTypeAny = z.ZodTypeAny> {\n  get stream(): AsyncIterable<GenerateResponseChunk>;\n  get response(): Promise<GenerateResponse<O>>;\n}\n\nexport function generateStream<\n  O extends z.ZodTypeAny = z.ZodTypeAny,\n  CustomOptions extends z.ZodTypeAny = typeof GenerationCommonConfigSchema,\n>(\n  registry: Registry,\n  options:\n    | GenerateOptions<O, CustomOptions>\n    | PromiseLike<GenerateOptions<O, CustomOptions>>\n): GenerateStreamResponse<O> {\n  const channel = new Channel<GenerateResponseChunk>();\n\n  const generated = Promise.resolve(options).then((resolvedOptions) =>\n    generate<O, CustomOptions>(registry, {\n      ...resolvedOptions,\n      onChunk: (chunk) => channel.send(chunk),\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\nexport function tagAsPreamble(msgs?: MessageData[]): MessageData[] | undefined {\n  if (!msgs) {\n    return undefined;\n  }\n  return msgs.map((m) => ({\n    ...m,\n    metadata: {\n      ...m.metadata,\n      preamble: true,\n    },\n  }));\n}\n"],"mappings":"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","names":[]}