UNPKG

@langchain/core

Version:
1 lines 59.8 kB
{"version":3,"file":"chat_models.cjs","names":["isURLContentBlock","isBase64ContentBlock","convertToOpenAIImageBlock","BaseLanguageModel","iife","getEnvironmentVariable","convertChunksToEvents","ChatModelStream","CallbackManager","castStandardMessageContent","isAIMessageChunk","coerceMessageLikeToMessage","callbackHandlerPrefersChatModelStreamEvents","callbackHandlerPrefersStreaming","ModelAbortError","concat","RUN_KEY","isBaseMessage","isAIMessage","getSchemaDescription","isInteropZodSchema","isSerializableSchema","toJsonSchema","assembleStructuredOutputPipeline","RunnableLambda","AIMessageChunk","AIMessage"],"sources":["../../src/language_models/chat_models.ts"],"sourcesContent":["import type { ZodV3Like, ZodV4Like } from \"../utils/types/zod.js\";\nimport {\n  AIMessage,\n  type BaseMessage,\n  BaseMessageChunk,\n  type BaseMessageLike,\n  coerceMessageLikeToMessage,\n  AIMessageChunk,\n  isAIMessageChunk,\n  isBaseMessage,\n  isAIMessage,\n  MessageOutputVersion,\n} from \"../messages/index.js\";\nimport {\n  convertToOpenAIImageBlock,\n  isURLContentBlock,\n  isBase64ContentBlock,\n} from \"../messages/content/data.js\";\nimport type { BasePromptValueInterface } from \"../prompt_values.js\";\nimport {\n  LLMResult,\n  RUN_KEY,\n  type ChatGeneration,\n  ChatGenerationChunk,\n  type ChatResult,\n  type Generation,\n} from \"../outputs.js\";\nimport {\n  BaseLanguageModel,\n  type StructuredOutputMethodOptions,\n  type ToolDefinition,\n  type BaseLanguageModelCallOptions,\n  type BaseLanguageModelInput,\n  type BaseLanguageModelParams,\n} from \"./base.js\";\nimport {\n  CallbackManager,\n  type CallbackManagerForLLMRun,\n  type Callbacks,\n} from \"../callbacks/manager.js\";\nimport type { RunnableConfig } from \"../runnables/config.js\";\nimport type { BaseCache } from \"../caches/index.js\";\nimport {\n  StructuredToolInterface,\n  StructuredToolParams,\n} from \"../tools/index.js\";\nimport {\n  Runnable,\n  RunnableLambda,\n  RunnableToolLike,\n} from \"../runnables/base.js\";\nimport { concat } from \"../utils/stream.js\";\nimport {\n  getSchemaDescription,\n  InteropZodType,\n  isInteropZodSchema,\n} from \"../utils/types/zod.js\";\nimport { ModelAbortError } from \"../errors/index.js\";\nimport {\n  callbackHandlerPrefersChatModelStreamEvents,\n  callbackHandlerPrefersStreaming,\n} from \"../callbacks/base.js\";\nimport { toJsonSchema } from \"../utils/json_schema.js\";\nimport { getEnvironmentVariable } from \"../utils/env.js\";\nimport { castStandardMessageContent, iife } from \"./utils.js\";\nimport {\n  isSerializableSchema,\n  type SerializableSchema,\n} from \"../utils/standard_schema.js\";\nimport { assembleStructuredOutputPipeline } from \"./structured_output.js\";\nimport type { ChatModelStreamEvent } from \"./event.js\";\nimport { ChatModelStream } from \"./stream.js\";\nimport { convertChunksToEvents } from \"./compat.js\";\nimport {\n  EventStreamCallbackHandlerInput,\n  StreamEvent,\n} from \"../tracers/event_stream.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ToolChoice = string | Record<string, any> | \"auto\" | \"any\";\n\n/**\n * Represents a serialized chat model.\n */\nexport type SerializedChatModel = {\n  _model: string;\n  _type: string;\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\n// todo?\n/**\n * Represents a serialized large language model.\n */\nexport type SerializedLLM = {\n  _model: string;\n  _type: string;\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\n/**\n * Represents the parameters for a base chat model.\n */\nexport type BaseChatModelParams = BaseLanguageModelParams & {\n  /**\n   * Whether to disable streaming.\n   *\n   * If streaming is bypassed, then `stream()` will defer to\n   * `invoke()`.\n   *\n   * - If true, will always bypass streaming case.\n   * - If false (default), will always use streaming case if available.\n   */\n  disableStreaming?: boolean;\n  /**\n   * Version of `AIMessage` output format to store in message content.\n   *\n   * `AIMessage.contentBlocks` will lazily parse the contents of `content` into a\n   * standard format. This flag can be used to additionally store the standard format\n   * as the message content, e.g., for serialization purposes.\n   *\n   * - \"v0\": provider-specific format in content (can lazily parse with `.contentBlocks`)\n   * - \"v1\": standardized format in content (consistent with `.contentBlocks`)\n   *\n   * You can also set `LC_OUTPUT_VERSION` as an environment variable to \"v1\" to\n   * enable this by default.\n   *\n   * @default \"v0\"\n   */\n  outputVersion?: MessageOutputVersion;\n};\n\n/**\n * Represents the call options for a base chat model.\n */\nexport type BaseChatModelCallOptions = BaseLanguageModelCallOptions & {\n  /**\n   * Specifies how the chat model should use tools.\n   * @default undefined\n   *\n   * Possible values:\n   * - \"auto\": The model may choose to use any of the provided tools, or none.\n   * - \"any\": The model must use one of the provided tools.\n   * - \"none\": The model must not use any tools.\n   * - A string (not \"auto\", \"any\", or \"none\"): The name of a specific tool the model must use.\n   * - An object: A custom schema specifying tool choice parameters. Specific to the provider.\n   *\n   * Note: Not all providers support tool_choice. An error will be thrown\n   * if used with an unsupported model.\n   */\n  tool_choice?: ToolChoice;\n  /**\n   * Version of `AIMessage` output format to store in message content.\n   *\n   * `AIMessage.contentBlocks` will lazily parse the contents of `content` into a\n   * standard format. This flag can be used to additionally store the standard format\n   * as the message content, e.g., for serialization purposes.\n   *\n   * - \"v0\": provider-specific format in content (can lazily parse with `.contentBlocks`)\n   * - \"v1\": standardized format in content (consistent with `.contentBlocks`)\n   *\n   * You can also set `LC_OUTPUT_VERSION` as an environment variable to \"v1\" to\n   * enable this by default.\n   *\n   * @default \"v0\"\n   */\n  outputVersion?: MessageOutputVersion;\n};\n\nfunction _formatForTracing(messages: BaseMessage[]): BaseMessage[] {\n  const messagesToTrace: BaseMessage[] = [];\n  for (const message of messages) {\n    let messageToTrace = message;\n    if (Array.isArray(message.content)) {\n      for (let idx = 0; idx < message.content.length; idx++) {\n        const block = message.content[idx];\n        if (isURLContentBlock(block) || isBase64ContentBlock(block)) {\n          if (messageToTrace === message) {\n            // Also shallow-copy content\n            // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n            messageToTrace = new (message.constructor as any)({\n              ...messageToTrace,\n              content: [\n                ...message.content.slice(0, idx),\n                convertToOpenAIImageBlock(block),\n                ...message.content.slice(idx + 1),\n              ],\n            });\n          }\n        }\n      }\n    }\n    messagesToTrace.push(messageToTrace);\n  }\n  return messagesToTrace;\n}\n\nexport type LangSmithParams = {\n  ls_provider?: string;\n  ls_model_name?: string;\n  ls_model_type: \"chat\";\n  ls_temperature?: number;\n  ls_max_tokens?: number;\n  ls_stop?: Array<string>;\n  ls_integration?: string;\n};\n\nexport type BindToolsInput =\n  | StructuredToolInterface\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  | Record<string, any>\n  | ToolDefinition\n  | RunnableToolLike\n  | StructuredToolParams;\n\n/**\n * Base class for chat models. It extends the BaseLanguageModel class and\n * provides methods for generating chat based on input messages.\n */\nexport abstract class BaseChatModel<\n  CallOptions extends BaseChatModelCallOptions = BaseChatModelCallOptions,\n  // TODO: Fix the parameter order on the next minor version.\n  OutputMessageType extends BaseMessageChunk = AIMessageChunk,\n> extends BaseLanguageModel<OutputMessageType, CallOptions> {\n  // Backwards compatibility since fields have been moved to RunnableConfig\n  declare ParsedCallOptions: Omit<\n    CallOptions,\n    Exclude<keyof RunnableConfig, \"signal\" | \"timeout\" | \"maxConcurrency\">\n  >;\n\n  // Only ever instantiated in main LangChain\n  lc_namespace = [\"langchain\", \"chat_models\", this._llmType()];\n\n  disableStreaming = false;\n\n  outputVersion?: MessageOutputVersion;\n\n  get callKeys(): string[] {\n    return [...super.callKeys, \"outputVersion\"];\n  }\n\n  constructor(fields: BaseChatModelParams) {\n    super(fields);\n    this.outputVersion = iife(() => {\n      const outputVersion =\n        fields.outputVersion ?? getEnvironmentVariable(\"LC_OUTPUT_VERSION\");\n      if (outputVersion && [\"v0\", \"v1\"].includes(outputVersion)) {\n        return outputVersion as \"v0\" | \"v1\";\n      }\n      return \"v0\";\n    });\n  }\n\n  _combineLLMOutput?(\n    ...llmOutputs: LLMResult[\"llmOutput\"][]\n  ): LLMResult[\"llmOutput\"];\n\n  protected _separateRunnableConfigFromCallOptionsCompat(\n    options?: Partial<CallOptions>\n  ): [RunnableConfig, this[\"ParsedCallOptions\"]] {\n    // For backwards compat, keep `signal` in both runnableConfig and callOptions\n    const [runnableConfig, callOptions] =\n      super._separateRunnableConfigFromCallOptions(options);\n    (callOptions as this[\"ParsedCallOptions\"]).signal = runnableConfig.signal;\n    return [runnableConfig, callOptions as this[\"ParsedCallOptions\"]];\n  }\n\n  /**\n   * Bind tool-like objects to this chat model.\n   *\n   * @param tools A list of tool definitions to bind to this chat model.\n   * Can be a structured tool, an OpenAI formatted tool, or an object\n   * matching the provider's specific tool schema.\n   * @param kwargs Any additional parameters to bind.\n   */\n  bindTools?(\n    tools: BindToolsInput[],\n    kwargs?: Partial<CallOptions>\n  ): Runnable<BaseLanguageModelInput, OutputMessageType, CallOptions>;\n\n  /**\n   * Invokes the chat model with a single input.\n   * @param input The input for the language model.\n   * @param options The call options.\n   * @returns A Promise that resolves to a BaseMessageChunk.\n   */\n  async invoke(\n    input: BaseLanguageModelInput,\n    options?: Partial<CallOptions>\n  ): Promise<OutputMessageType> {\n    const promptValue = BaseChatModel._convertInputToPromptValue(input);\n    const result = await this.generatePrompt(\n      [promptValue],\n      options,\n      options?.callbacks\n    );\n    const chatGeneration = result.generations[0][0] as ChatGeneration;\n    // TODO: Remove cast after figuring out inheritance\n    return chatGeneration.message as OutputMessageType;\n  }\n\n  // oxlint-disable-next-line require-yield\n  async *_streamResponseChunks(\n    _messages: BaseMessage[],\n    _options: this[\"ParsedCallOptions\"],\n    _runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatGenerationChunk> {\n    throw new Error(\"Not implemented.\");\n  }\n\n  /**\n   * Stream chat model events using the new content-block-centric protocol.\n   *\n   * Override this method to provide native event streaming from the provider SDK.\n   * The default implementation bridges from `_streamResponseChunks` by\n   * synthesizing lifecycle events from `ChatGenerationChunk` objects.\n   *\n   * ## Event lifecycle\n   *\n   * ```\n   * MessageStart\n   *   -> ContentBlockStart(index, contentBlock)\n   *     -> ContentBlockDelta(index, delta) ...\n   *   -> ContentBlockFinish(index, contentBlock)\n   * -> MessageFinish(reason, usage?)\n   * ```\n   *\n   * Content blocks may interleave (e.g., parallel tool calls). The only\n   * invariant: a block's start precedes its deltas, and its deltas precede\n   * its finish.\n   *\n   * @param messages - The input messages.\n   * @param options - Parsed call options.\n   * @param runManager - Optional callback manager for the run.\n   * @returns An async generator of {@link ChatModelStreamEvent}.\n   */\n  async *_streamChatModelEvents(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatModelStreamEvent> {\n    // Default: bridge from legacy _streamResponseChunks\n    const chunks = this._streamResponseChunks(messages, options, runManager);\n    yield* convertChunksToEvents(chunks, { signal: options.signal });\n  }\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n   * option for content-block streaming instead.\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options: Partial<CallOptions> & { version: \"v2\" },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<StreamEvent>;\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n   * option for content-block streaming instead.\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options: Partial<CallOptions> & {\n      version: \"v2\";\n      encoding: \"text/event-stream\";\n    },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<Uint8Array>;\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n   * option for content-block streaming instead.\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options: Partial<CallOptions> & { version: \"v1\" },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<StreamEvent>;\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n   * option for content-block streaming instead.\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options: Partial<CallOptions> & {\n      version: \"v1\";\n      encoding: \"text/event-stream\";\n    },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<Uint8Array>;\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n   * option for content-block streaming instead.\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options: Partial<CallOptions> & { version: \"v1\" | \"v2\" },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<StreamEvent>;\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} without a `version`\n   * option for content-block streaming instead.\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options: Partial<CallOptions> & {\n      version: \"v1\" | \"v2\";\n      encoding: \"text/event-stream\";\n    },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): IterableReadableStream<Uint8Array>;\n\n  /**\n   * Create a {@link ChatModelStream} for the given input.\n   *\n   * Returns a stream object that is both `AsyncIterable<ChatModelStreamEvent>`\n   * and `PromiseLike<AIMessage>`, with typed sub-stream accessors for\n   * `.text`, `.toolCalls`, `.reasoning`, and `.usage`.\n   *\n   * @param input - The input messages.\n   * @param options - Optional call options.\n   * @returns A {@link ChatModelStream}.\n   *\n   * When `options.version` is `\"v1\"` or `\"v2\"`, this delegates to\n   * {@link Runnable.streamEvents} for callback-based tracing events instead.\n   * That path is deprecated on chat models; prefer calling `streamEvents()`\n   * without a `version` option.\n   *\n   * @example\n   * ```ts\n   * const stream = model.streamEvents([{ role: \"user\", content: \"Hello\" }]);\n   *\n   * // Stream text\n   * for await (const token of stream.text) {\n   *   process.stdout.write(token);\n   * }\n   *\n   * // Stream tool calls\n   * for await (const toolCall of stream.toolCalls) {\n   *   console.log(toolCall);\n   * }\n   *\n   * // Stream reasoning\n   * for await (const reasoning of stream.reasoning) {\n   *   console.log(reasoning);\n   * }\n   *\n   * // Stream usage\n   * for await (const usage of stream.usage) {\n   *   console.log(usage);\n   * }\n   *\n   * // Or await the full message\n   * const message = await stream;\n   * ```\n   */\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options?: Partial<CallOptions>\n  ): ChatModelStream;\n\n  streamEvents(\n    input: BaseLanguageModelInput,\n    options?: Partial<CallOptions> & {\n      version?: \"v1\" | \"v2\";\n      encoding?: \"text/event-stream\" | undefined;\n    },\n    streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n  ): ChatModelStream | IterableReadableStream<StreamEvent | Uint8Array> {\n    if (options?.version === \"v1\" || options?.version === \"v2\") {\n      return super.streamEvents(\n        input,\n        options as Partial<CallOptions> & {\n          version: \"v1\" | \"v2\";\n          encoding?: \"text/event-stream\" | undefined;\n        },\n        streamOptions\n      );\n    }\n\n    const prompt = BaseChatModel._convertInputToPromptValue(input);\n    const messages = prompt.toChatMessages();\n    const [, callOptions] =\n      this._separateRunnableConfigFromCallOptionsCompat(options);\n\n    const generator = this._streamChatModelEvents(messages, callOptions);\n\n    return new ChatModelStream(generator);\n  }\n\n  /**\n   * @deprecated Use {@link BaseChatModel.streamEvents} instead. This method will be removed in the next major version.\n   */\n  streamV2(\n    input: BaseLanguageModelInput,\n    options?: Partial<CallOptions>\n  ): ChatModelStream {\n    return this.streamEvents(input, options);\n  }\n\n  async *_streamIterator(\n    input: BaseLanguageModelInput,\n    options?: Partial<CallOptions>\n  ): AsyncGenerator<OutputMessageType> {\n    // Subclass check required to avoid double callbacks with default implementation\n    if (\n      this._streamResponseChunks ===\n        BaseChatModel.prototype._streamResponseChunks ||\n      this.disableStreaming\n    ) {\n      yield this.invoke(input, options);\n    } else {\n      const prompt = BaseChatModel._convertInputToPromptValue(input);\n      const messages = prompt.toChatMessages();\n      const [runnableConfig, callOptions] =\n        this._separateRunnableConfigFromCallOptionsCompat(options);\n\n      const inheritableMetadata = {\n        ...runnableConfig.metadata,\n        ...this.getLsParamsWithDefaults(callOptions),\n      };\n      const invocationParams = this._getInvocationParamsForTracing(callOptions);\n      const callbackManager_ = await CallbackManager.configure(\n        runnableConfig.callbacks,\n        this.callbacks,\n        runnableConfig.tags,\n        this.tags,\n        inheritableMetadata,\n        this.metadata,\n        {\n          verbose: this.verbose,\n          tracerInheritableMetadata:\n            this._filterInvocationParamsForTracing(invocationParams),\n        }\n      );\n      const extra = {\n        options: this._getCallOptionsForTracing(callOptions, invocationParams),\n        invocation_params: invocationParams,\n        batch_size: 1,\n      };\n      const outputVersion = callOptions.outputVersion ?? this.outputVersion;\n      const runManagers = await callbackManager_?.handleChatModelStart(\n        this.toJSON(),\n        [_formatForTracing(messages)],\n        runnableConfig.runId,\n        undefined,\n        extra,\n        undefined,\n        undefined,\n        runnableConfig.runName\n      );\n      let generationChunk: ChatGenerationChunk | undefined;\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      let llmOutput: Record<string, any> | undefined;\n      try {\n        for await (const chunk of this._streamResponseChunks(\n          messages,\n          callOptions,\n          runManagers?.[0]\n        )) {\n          callOptions.signal?.throwIfAborted();\n          if (chunk.message.id == null) {\n            const runId = runManagers?.at(0)?.runId;\n            if (runId != null) chunk.message._updateId(`run-${runId}`);\n          }\n          chunk.message.response_metadata = {\n            ...chunk.generationInfo,\n            ...chunk.message.response_metadata,\n          };\n          if (outputVersion === \"v1\") {\n            yield castStandardMessageContent(\n              chunk.message\n            ) as OutputMessageType;\n          } else {\n            yield chunk.message as OutputMessageType;\n          }\n          if (!generationChunk) {\n            generationChunk = chunk;\n          } else {\n            generationChunk = generationChunk.concat(chunk);\n          }\n          if (\n            isAIMessageChunk(chunk.message) &&\n            chunk.message.usage_metadata !== undefined\n          ) {\n            llmOutput = {\n              tokenUsage: {\n                promptTokens: chunk.message.usage_metadata.input_tokens,\n                completionTokens: chunk.message.usage_metadata.output_tokens,\n                totalTokens: chunk.message.usage_metadata.total_tokens,\n              },\n            };\n          }\n        }\n        // Throw error if stream ended due to abort (provider returned early)\n        callOptions.signal?.throwIfAborted();\n      } catch (err) {\n        await Promise.all(\n          (runManagers ?? []).map((runManager) =>\n            runManager?.handleLLMError(err)\n          )\n        );\n        throw err;\n      }\n      await Promise.all(\n        (runManagers ?? []).map((runManager) =>\n          runManager?.handleLLMEnd({\n            // TODO: Remove cast after figuring out inheritance\n            generations: [[generationChunk as ChatGeneration]],\n            llmOutput,\n          })\n        )\n      );\n    }\n  }\n\n  getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n    const providerName = this.getName().startsWith(\"Chat\")\n      ? this.getName().replace(\"Chat\", \"\")\n      : this.getName();\n\n    return {\n      ls_model_type: \"chat\",\n      ls_stop: options.stop,\n      ls_provider: providerName,\n    };\n  }\n\n  /**\n   * Wraps getLsParams() and always appends ls_integration.\n   * This ensures the integration tag is present even when\n   * partner packages fully override getLsParams().\n   */\n  getLsParamsWithDefaults(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n    return {\n      ...this.getLsParams(options),\n      ls_integration: \"langchain_chat_model\",\n    };\n  }\n\n  /** @ignore */\n  async _generateUncached(\n    messages: BaseMessageLike[][],\n    parsedOptions: this[\"ParsedCallOptions\"],\n    handledOptions: RunnableConfig,\n    startedRunManagers?: CallbackManagerForLLMRun[]\n  ): Promise<LLMResult> {\n    const baseMessages = messages.map((messageList) =>\n      messageList.map(coerceMessageLikeToMessage)\n    );\n\n    let runManagers: CallbackManagerForLLMRun[] | undefined;\n    if (\n      startedRunManagers !== undefined &&\n      startedRunManagers.length === baseMessages.length\n    ) {\n      runManagers = startedRunManagers;\n    } else {\n      const inheritableMetadata = {\n        ...handledOptions.metadata,\n        ...this.getLsParamsWithDefaults(parsedOptions),\n      };\n      const invocationParams =\n        this._getInvocationParamsForTracing(parsedOptions);\n      // create callback manager and start run\n      const callbackManager_ = await CallbackManager.configure(\n        handledOptions.callbacks,\n        this.callbacks,\n        handledOptions.tags,\n        this.tags,\n        inheritableMetadata,\n        this.metadata,\n        {\n          verbose: this.verbose,\n          tracerInheritableMetadata:\n            this._filterInvocationParamsForTracing(invocationParams),\n        }\n      );\n      const extra = {\n        options: this._getCallOptionsForTracing(\n          parsedOptions,\n          invocationParams\n        ),\n        invocation_params: invocationParams,\n        batch_size: 1,\n      };\n      runManagers = await callbackManager_?.handleChatModelStart(\n        this.toJSON(),\n        baseMessages.map(_formatForTracing),\n        handledOptions.runId,\n        undefined,\n        extra,\n        undefined,\n        undefined,\n        handledOptions.runName\n      );\n    }\n    const outputVersion = parsedOptions.outputVersion ?? this.outputVersion;\n    const generations: ChatGeneration[][] = [];\n    const llmOutputs: LLMResult[\"llmOutput\"][] = [];\n    // Even if stream is not explicitly called, check if model is implicitly\n    // called from streamEvents() or streamLog() to get all streamed events.\n    // Bail out if _streamResponseChunks not overridden\n    const hasChatModelStreamEventHandler = !!runManagers?.[0].handlers.find(\n      callbackHandlerPrefersChatModelStreamEvents\n    );\n    const hasStreamingHandler = !!runManagers?.[0].handlers.find(\n      callbackHandlerPrefersStreaming\n    );\n    if (\n      hasChatModelStreamEventHandler &&\n      !this.disableStreaming &&\n      baseMessages.length === 1 &&\n      (this._streamChatModelEvents !==\n        BaseChatModel.prototype._streamChatModelEvents ||\n        this._streamResponseChunks !==\n          BaseChatModel.prototype._streamResponseChunks)\n    ) {\n      try {\n        let sawEvent = false;\n        const runManager = runManagers?.[0];\n        const events = this._streamChatModelEvents(\n          baseMessages[0],\n          parsedOptions\n        );\n        const forwardedEvents = {\n          async *[Symbol.asyncIterator]() {\n            for await (const event of events) {\n              parsedOptions.signal?.throwIfAborted();\n              sawEvent = true;\n              const streamEvent =\n                event.event === \"message-start\" &&\n                event.id == null &&\n                runManager?.runId != null\n                  ? { ...event, id: `run-${runManager.runId}` }\n                  : event;\n              await runManager?.handleChatModelStreamEvent(streamEvent);\n              yield streamEvent;\n            }\n          },\n        };\n        const message = await new ChatModelStream(forwardedEvents);\n        parsedOptions.signal?.throwIfAborted();\n        if (!sawEvent) {\n          throw new Error(\"Received empty response from chat model call.\");\n        }\n        if (message.id == null) {\n          const runId = runManagers?.at(0)?.runId;\n          if (runId != null) message._updateId(`run-${runId}`);\n        }\n        const generation: ChatGeneration = {\n          text: message.text,\n          message,\n        };\n        generations.push([generation]);\n        const llmOutput =\n          message.usage_metadata !== undefined\n            ? {\n                tokenUsage: {\n                  promptTokens: message.usage_metadata.input_tokens,\n                  completionTokens: message.usage_metadata.output_tokens,\n                  totalTokens: message.usage_metadata.total_tokens,\n                },\n              }\n            : undefined;\n        await runManagers?.[0].handleLLMEnd({\n          generations,\n          llmOutput,\n        });\n      } catch (e) {\n        await runManagers?.[0].handleLLMError(e);\n        throw e;\n      }\n    } else if (\n      hasStreamingHandler &&\n      !this.disableStreaming &&\n      baseMessages.length === 1 &&\n      this._streamResponseChunks !==\n        BaseChatModel.prototype._streamResponseChunks\n    ) {\n      try {\n        const stream = await this._streamResponseChunks(\n          baseMessages[0],\n          parsedOptions,\n          runManagers?.[0]\n        );\n        let aggregated: ChatGenerationChunk | undefined;\n        // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n        let llmOutput: Record<string, any> | undefined;\n        for await (const chunk of stream) {\n          // Check for abort signal - throw ModelAbortError with partial output\n          if (parsedOptions.signal?.aborted) {\n            const partialMessage = aggregated?.message as\n              | AIMessageChunk\n              | undefined;\n            throw new ModelAbortError(\n              \"Model invocation was aborted.\",\n              partialMessage\n            );\n          }\n          if (chunk.message.id == null) {\n            const runId = runManagers?.at(0)?.runId;\n            if (runId != null) chunk.message._updateId(`run-${runId}`);\n          }\n          if (aggregated === undefined) {\n            aggregated = chunk;\n          } else {\n            aggregated = concat(aggregated, chunk);\n          }\n          if (\n            isAIMessageChunk(chunk.message) &&\n            chunk.message.usage_metadata !== undefined\n          ) {\n            llmOutput = {\n              tokenUsage: {\n                promptTokens: chunk.message.usage_metadata.input_tokens,\n                completionTokens: chunk.message.usage_metadata.output_tokens,\n                totalTokens: chunk.message.usage_metadata.total_tokens,\n              },\n            };\n          }\n        }\n        // Check if stream ended due to abort (provider returned early)\n        if (parsedOptions.signal?.aborted) {\n          const partialMessage = aggregated?.message as\n            | AIMessageChunk\n            | undefined;\n          throw new ModelAbortError(\n            \"Model invocation was aborted.\",\n            partialMessage\n          );\n        }\n        if (aggregated === undefined) {\n          throw new Error(\"Received empty response from chat model call.\");\n        }\n        if (outputVersion === \"v1\") {\n          aggregated.message = castStandardMessageContent(\n            aggregated.message\n          ) as AIMessageChunk;\n        }\n        generations.push([aggregated]);\n        await runManagers?.[0].handleLLMEnd({\n          generations,\n          llmOutput,\n        });\n      } catch (e) {\n        await runManagers?.[0].handleLLMError(e);\n        throw e;\n      }\n    } else {\n      // generate results\n      const results = await Promise.allSettled(\n        baseMessages.map(async (messageList, i) => {\n          const generateResults = await this._generate(\n            messageList,\n            { ...parsedOptions, promptIndex: i },\n            runManagers?.[i]\n          );\n          if (outputVersion === \"v1\") {\n            for (const generation of generateResults.generations) {\n              generation.message = castStandardMessageContent(\n                generation.message\n              );\n            }\n          }\n          return generateResults;\n        })\n      );\n      // handle results\n      await Promise.all(\n        results.map(async (pResult, i) => {\n          if (pResult.status === \"fulfilled\") {\n            const result = pResult.value;\n            for (const generation of result.generations) {\n              if (generation.message.id == null) {\n                const runId = runManagers?.at(0)?.runId;\n                if (runId != null) generation.message._updateId(`run-${runId}`);\n              }\n              generation.message.response_metadata = {\n                ...generation.generationInfo,\n                ...generation.message.response_metadata,\n              };\n            }\n            if (result.generations.length === 1) {\n              result.generations[0].message.response_metadata = {\n                ...result.llmOutput,\n                ...result.generations[0].message.response_metadata,\n              };\n            }\n            generations[i] = result.generations;\n            llmOutputs[i] = result.llmOutput;\n            return runManagers?.[i]?.handleLLMEnd({\n              generations: [result.generations],\n              llmOutput: result.llmOutput,\n            });\n          } else {\n            // status === \"rejected\"\n            await runManagers?.[i]?.handleLLMError(pResult.reason);\n            return Promise.reject(pResult.reason);\n          }\n        })\n      );\n    }\n    // create combined output\n    const output: LLMResult = {\n      generations,\n      llmOutput: llmOutputs.length\n        ? this._combineLLMOutput?.(...llmOutputs)\n        : undefined,\n    };\n    Object.defineProperty(output, RUN_KEY, {\n      value: runManagers\n        ? { runIds: runManagers?.map((manager) => manager.runId) }\n        : undefined,\n      configurable: true,\n    });\n    return output;\n  }\n\n  async _generateCached({\n    messages,\n    cache,\n    llmStringKey,\n    parsedOptions,\n    handledOptions,\n  }: {\n    messages: BaseMessageLike[][];\n    cache: BaseCache<Generation[]>;\n    llmStringKey: string;\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    parsedOptions: any;\n    handledOptions: RunnableConfig;\n  }): Promise<\n    LLMResult & {\n      missingPromptIndices: number[];\n      startedRunManagers?: CallbackManagerForLLMRun[];\n    }\n  > {\n    const baseMessages = messages.map((messageList) =>\n      messageList.map(coerceMessageLikeToMessage)\n    );\n\n    const inheritableMetadata = {\n      ...handledOptions.metadata,\n      ...this.getLsParamsWithDefaults(parsedOptions),\n    };\n    const invocationParams = this._getInvocationParamsForTracing(parsedOptions);\n    // create callback manager and start run\n    const callbackManager_ = await CallbackManager.configure(\n      handledOptions.callbacks,\n      this.callbacks,\n      handledOptions.tags,\n      this.tags,\n      inheritableMetadata,\n      this.metadata,\n      {\n        verbose: this.verbose,\n        tracerInheritableMetadata:\n          this._filterInvocationParamsForTracing(invocationParams),\n      }\n    );\n    const extra = {\n      options: this._getCallOptionsForTracing(parsedOptions, invocationParams),\n      invocation_params: invocationParams,\n      batch_size: 1,\n    };\n    const runManagers = await callbackManager_?.handleChatModelStart(\n      this.toJSON(),\n      baseMessages.map(_formatForTracing),\n      handledOptions.runId,\n      undefined,\n      extra,\n      undefined,\n      undefined,\n      handledOptions.runName\n    );\n\n    // generate results\n    const missingPromptIndices: number[] = [];\n    const results = await Promise.allSettled(\n      baseMessages.map(async (baseMessage, index) => {\n        // Join all content into one string for the prompt index\n        const prompt =\n          BaseChatModel._convertInputToPromptValue(baseMessage).toString();\n        const result = await cache.lookup(prompt, llmStringKey);\n\n        if (result == null) {\n          missingPromptIndices.push(index);\n        }\n\n        return result;\n      })\n    );\n\n    // Map run managers to the results before filtering out null results\n    // Null results are just absent from the cache.\n    const cachedResults = results\n      .map((result, index) => ({ result, runManager: runManagers?.[index] }))\n      .filter(\n        ({ result }) =>\n          (result.status === \"fulfilled\" && result.value != null) ||\n          result.status === \"rejected\"\n      );\n\n    // Handle results and call run managers\n    const outputVersion = parsedOptions.outputVersion ?? this.outputVersion;\n    const generations: Generation[][] = [];\n    await Promise.all(\n      cachedResults.map(async ({ result: promiseResult, runManager }, i) => {\n        if (promiseResult.status === \"fulfilled\") {\n          const result = promiseResult.value as Generation[];\n          generations[i] = result.map((result) => {\n            if (\n              \"message\" in result &&\n              isBaseMessage(result.message) &&\n              isAIMessage(result.message)\n            ) {\n              result.message.usage_metadata = {\n                input_tokens: 0,\n                output_tokens: 0,\n                total_tokens: 0,\n              };\n              if (outputVersion === \"v1\") {\n                result.message = castStandardMessageContent(result.message);\n              }\n            }\n            result.generationInfo = {\n              ...result.generationInfo,\n              tokenUsage: {},\n            };\n            return result;\n          });\n          if (result.length) {\n            await runManager?.handleLLMNewToken(result[0].text);\n          }\n          return runManager?.handleLLMEnd(\n            {\n              generations: [result],\n            },\n            undefined,\n            undefined,\n            undefined,\n            {\n              cached: true,\n            }\n          );\n        } else {\n          // status === \"rejected\"\n          await runManager?.handleLLMError(\n            promiseResult.reason,\n            undefined,\n            undefined,\n            undefined,\n            {\n              cached: true,\n            }\n          );\n          return Promise.reject(promiseResult.reason);\n        }\n      })\n    );\n\n    const output = {\n      generations,\n      missingPromptIndices,\n      startedRunManagers: runManagers,\n    };\n\n    // This defines RUN_KEY as a non-enumerable property on the output object\n    // so that it is not serialized when the output is stringified, and so that\n    // it isnt included when listing the keys of the output object.\n    Object.defineProperty(output, RUN_KEY, {\n      value: runManagers\n        ? { runIds: runManagers?.map((manager) => manager.runId) }\n        : undefined,\n      configurable: true,\n    });\n\n    return output;\n  }\n\n  /**\n   * Generates chat based on the input messages.\n   * @param messages An array of arrays of BaseMessage instances.\n   * @param options The call options or an array of stop sequences.\n   * @param callbacks The callbacks for the language model.\n   * @returns A Promise that resolves to an LLMResult.\n   */\n  async generate(\n    messages: BaseMessageLike[][],\n    options?: string[] | Partial<CallOptions>,\n    callbacks?: Callbacks\n  ): Promise<LLMResult> {\n    // parse call options\n    let parsedOptions: Partial<CallOptions> | undefined;\n    if (Array.isArray(options)) {\n      parsedOptions = { stop: options } as Partial<CallOptions>;\n    } else {\n      parsedOptions = options;\n    }\n\n    const baseMessages = messages.map((messageList) =>\n      messageList.map(coerceMessageLikeToMessage)\n    );\n\n    const [runnableConfig, callOptions] =\n      this._separateRunnableConfigFromCallOptionsCompat(parsedOptions);\n    runnableConfig.callbacks = runnableConfig.callbacks ?? callbacks;\n\n    if (!this.cache) {\n      return this._generateUncached(baseMessages, callOptions, runnableConfig);\n    }\n\n    const { cache } = this;\n    const llmStringKey = this._getSerializedCacheKeyParametersForCall(\n      callOptions as CallOptions\n    );\n\n    const { generations, missingPromptIndices, startedRunManagers } =\n      await this._generateCached({\n        messages: baseMessages,\n        cache,\n        llmStringKey,\n        parsedOptions: callOptions,\n        handledOptions: runnableConfig,\n      });\n\n    let llmOutput = {};\n    if (missingPromptIndices.length > 0) {\n      const results = await this._generateUncached(\n        missingPromptIndices.map((i) => baseMessages[i]),\n        callOptions,\n        runnableConfig,\n        startedRunManagers !== undefined\n          ? missingPromptIndices.map((i) => startedRunManagers?.[i])\n          : undefined\n      );\n      await Promise.all(\n        results.generations.map(async (generation, index) => {\n          const promptIndex = missingPromptIndices[index];\n          generations[promptIndex] = generation;\n          // Join all content into one string for the prompt index\n          const prompt = BaseChatModel._convertInputToPromptValue(\n            baseMessages[promptIndex]\n          ).toString();\n          return cache.update(prompt, llmStringKey, generation);\n        })\n      );\n      llmOutput = results.llmOutput ?? {};\n    }\n\n    return { generations, llmOutput } as LLMResult;\n  }\n\n  protected _getInvocationParamsForTracing(\n    options?: this[\"ParsedCallOptions\"]\n  ): ReturnType<this[\"invocationParams\"]> {\n    return this.invocationParams(options);\n  }\n\n  protected _getCallOptionsForTracing(\n    options: this[\"ParsedCallOptions\"],\n    _invocationParams: ReturnType<this[\"invocationParams\"]>\n  ): this[\"ParsedCallOptions\"] {\n    return options;\n  }\n\n  /**\n   * Get the parameters used to invoke the model\n   */\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  invocationParams(_options?: this[\"ParsedCallOptions\"]): any {\n    return {};\n  }\n\n  _modelType(): string {\n    return \"base_chat_model\" as const;\n  }\n\n  abstract _llmType(): string;\n\n  /**\n   * Generates a prompt based on the input prompt values.\n   * @param promptValues An array of BasePromptValue instances.\n   * @param options The call options or an array of stop sequences.\n   * @param callbacks The callbacks for the language model.\n   * @returns A Promise that resolves to an LLMResult.\n   */\n  async generatePrompt(\n    promptValues: BasePromptValueInterface[],\n    options?: string[] | Partial<CallOptions>,\n    callbacks?: Callbacks\n  ): Promise<LLMResult> {\n    const promptMessages: BaseMessage[][] = promptValues.map((promptValue) =>\n      promptValue.toChatMessages()\n    );\n    return this.generate(promptMessages, options, callbacks);\n  }\n\n  abstract _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<ChatResult>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema: SerializableSchema<RunOutput>,\n    config?: StructuredOutputMethodOptions<false>\n  ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema: SerializableSchema<RunOutput>,\n    config?: StructuredOutputMethodOptions<true>\n  ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | ZodV4Like<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<false>\n  ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | ZodV4Like<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<true>\n  ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | ZodV3Like<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<false>\n  ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | ZodV3Like<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<true>\n  ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<boolean>\n  ):\n    | Runnable<BaseLanguageModelInput, RunOutput>\n    | Runnable<\n        BaseLanguageModelInput,\n        {\n          raw: BaseMessage;\n          parsed: RunOutput;\n        }\n      > {\n    if (typeof this.bindTools !== \"function\") {\n      throw new Error(\n        `Chat model must implement \".bindTools()\" to use withStructuredOutput.`\n      );\n    }\n    if (config?.strict) {\n      throw new Error(\n        `\"strict\" mode is not supported for this model by default.`\n      );\n    }\n\n    const schema = outputSchema;\n    const name = config?.name;\n    const description =\n      getSchemaDescription(schema) ?? \"A function available to call.\";\n    const method = config?.method;\n    const includeRaw = config?.includeRaw;\n    if (method === \"jsonMode\") {\n      throw new Error(\n        `Base withStructuredOutput implementation only supports \"functionCalling\" as a method.`\n      );\n    }\n\n    let functionName = name ?? \"extract\";\n    if (\n      !isInteropZodSchema(schema) &&\n      !isSerializableSchema(schema) &&\n      \"name\" in schema\n    ) {\n      functionName = schema.name;\n    }\n\n    const asJsonSchema =\n      isInteropZodSchema(schema) || isSerializableSchema(schema)\n        ? toJsonSchema(schema)\n        : schema;\n\n    const tools: ToolDefinition[] = [\n      {\n        type: \"function\",\n        function: {\n          name: functionName,\n          description,\n          parameters: asJsonSchema,\n        },\n      },\n    ];\n\n    const llm = this.bindTools(tools);\n    const outputParser = RunnableLambda.from<OutputMessageType, RunOutput>(\n      (input: BaseMessageChunk): RunOutput => {\n        if (!AIMessageChunk.isInstance(input)) {\n          throw new Error(\"Input is not an AIMessageChunk.\");\n        }\n        if (!input.tool_calls || input.tool_calls.length === 0) {\n          throw new Error(\"No tool calls found in the response.\");\n        }\n        const toolCall = input.tool_calls.find(\n          (tc) => tc.name === functionName\n        );\n        if (!toolCall) {\n          throw new Error(`No tool call found with name ${functionName}.`);\n        }\n        return toolCall.args as RunOutput;\n      }\n    );\n\n    return assembleStructuredOutputPipeline(\n      llm,\n      outputParser,\n      includeRaw,\n      includeRaw ? \"StructuredOutputRunnable\" : \"StructuredOutput\"\n    );\n  }\n}\n\n/**\n * An abstract class that extends BaseChatModel and provides a simple\n * implementation of _generate.\n */\nexport abstract class SimpleChatModel<\n  CallOptions extends BaseChatModelCallOptions = BaseChatModelCallOptions,\n> extends BaseChatModel<CallOptions> {\n  abstract _call(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<string>;\n\n  async _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): Promise<ChatResult> {\n    const text = await this._call(messages, options, runManager);\n    const message = new AIMessage(text);\n    if (typeof message.content !== \"string\") {\n      throw new Error(\n        \"Cannot generate with a simple chat model when output is not a string.\"\n      );\n    }\n    return {\n      generations: [\n        {\n          text: message.content,\n          message,\n        },\n      ],\n    };\n  }\n}\n"],"mappings":"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"}