@langchain/core
Version:
Core LangChain.js abstractions and schemas
1 lines • 59.8 kB
Source Map (JSON)
{"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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"}