@langchain/core 1.2.11 → 1.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","names":["candidate","uuidv7"],"sources":["../../src/callbacks/manager.ts"],"sourcesContent":["import { v7 as uuidv7 } from \"../utils/uuid/index.js\";\nimport { AgentAction, AgentFinish } from \"../agents.js\";\nimport type { ChainValues } from \"../utils/types/index.js\";\nimport { LLMResult } from \"../outputs.js\";\nimport {\n BaseCallbackHandler,\n CallbackHandlerMethods,\n HandleLLMNewTokenCallbackFields,\n isBaseCallbackHandler,\n NewTokenIndices,\n} from \"./base.js\";\nimport { ConsoleCallbackHandler } from \"../tracers/console.js\";\nimport { type BaseMessage } from \"../messages/base.js\";\nimport { getBufferString } from \"../messages/utils.js\";\nimport { getEnvironmentVariable } from \"../utils/env.js\";\nimport { LangChainTracer } from \"../tracers/tracer_langchain.js\";\nimport { consumeCallback } from \"./promises.js\";\nimport { Serialized } from \"../load/serializable.js\";\nimport type { DocumentInterface } from \"../documents/document.js\";\nimport type { ChatModelStreamEvent } from \"../language_models/event.js\";\nimport { isTracingEnabled } from \"../utils/callbacks.js\";\nimport { isBaseTracer } from \"../tracers/base.js\";\nimport {\n getContextVariable,\n _getConfigureHooks,\n} from \"../singletons/async_local_storage/context.js\";\n\ntype BaseCallbackManagerMethods = {\n [K in keyof CallbackHandlerMethods]?: (\n ...args: Parameters<Required<CallbackHandlerMethods>[K]>\n ) => Promise<unknown>;\n};\n\nexport interface CallbackManagerOptions {\n verbose?: boolean;\n tracing?: boolean;\n tracerInheritableMetadata?: Record<string, unknown>;\n tracerInheritableTags?: string[];\n}\n\nexport type Callbacks =\n | CallbackManager\n | (BaseCallbackHandler | CallbackHandlerMethods)[];\n\nfunction getTracerRunStoreKey(tracer: LangChainTracer): object {\n const candidate = tracer as LangChainTracer & {\n _getRunStoreKey?: () => object;\n };\n return candidate._getRunStoreKey?.() ?? tracer;\n}\n\nfunction mergeTracerConfig(\n target: LangChainTracer,\n source: LangChainTracer\n): LangChainTracer {\n if (target === source) {\n return target;\n }\n return target.copyWithTracingConfig({\n metadata: source.tracingMetadata,\n tags: source.tracingTags,\n });\n}\n\nfunction coalesceTracers(\n handlers: BaseCallbackHandler[],\n inheritableHandlers: BaseCallbackHandler[]\n): {\n handlers: BaseCallbackHandler[];\n inheritableHandlers: BaseCallbackHandler[];\n} {\n const inheritableSet = new Set<BaseCallbackHandler>(inheritableHandlers);\n const groups = new Map<\n object,\n { index: number; tracer: LangChainTracer; hasInheritable: boolean }\n >();\n const coalescedHandlers: BaseCallbackHandler[] = [];\n\n // Fold a tracer into its run-store group, keeping a single representative per\n // store (one tracer per store avoids the double-\"end\" throw). The\n // representative's tracing config is drawn from inheritable entries once any\n // exist, so a local-only tracer sharing the store cannot leak its tags or\n // metadata into child runs, which inherit `inheritableHandlers`. Stores with\n // only local entries keep merging those local entries.\n const fold = (handler: LangChainTracer) => {\n const key = getTracerRunStoreKey(handler);\n const isInheritable = inheritableSet.has(handler);\n const group = groups.get(key);\n if (group === undefined) {\n groups.set(key, {\n index: coalescedHandlers.length,\n tracer: handler,\n hasInheritable: isInheritable,\n });\n coalescedHandlers.push(handler);\n return;\n }\n\n if (isInheritable && !group.hasInheritable) {\n // First inheritable entry for this store: drop any local-only config\n // merged so far and restart from an inheritable baseline.\n group.tracer = handler;\n group.hasInheritable = true;\n } else if (isInheritable || !group.hasInheritable) {\n group.tracer = mergeTracerConfig(group.tracer, handler);\n }\n // A local entry on a store that already has inheritable config contributes\n // nothing, so its config cannot ride into children.\n coalescedHandlers[group.index] = group.tracer;\n };\n\n for (const handler of handlers) {\n if (handler instanceof LangChainTracer) {\n fold(handler);\n } else {\n coalescedHandlers.push(handler);\n }\n }\n\n // `inheritableHandlers` is a subset of `handlers` by identity, so its tracers\n // were already folded above. This only promotes an inheritable-only orphan\n // (an alias broken upstream) back into `handlers`.\n for (const handler of inheritableHandlers) {\n if (\n handler instanceof LangChainTracer &&\n !groups.has(getTracerRunStoreKey(handler))\n ) {\n fold(handler);\n }\n }\n\n const seenTracerStores = new Set<object>();\n const coalescedInheritableHandlers = inheritableHandlers.flatMap(\n (handler) => {\n if (!(handler instanceof LangChainTracer)) {\n return [handler];\n }\n\n const key = getTracerRunStoreKey(handler);\n if (seenTracerStores.has(key)) {\n return [];\n }\n seenTracerStores.add(key);\n return [groups.get(key)?.tracer ?? handler];\n }\n );\n\n return {\n handlers: coalescedHandlers,\n inheritableHandlers: coalescedInheritableHandlers,\n };\n}\n\nexport interface BaseCallbackConfig {\n /**\n * Name for the tracer run for this call. Defaults to the name of the class.\n */\n runName?: string;\n\n /**\n * Tags for this call and any sub-calls (eg. a Chain calling an LLM).\n * You can use these to filter calls.\n */\n tags?: string[];\n\n /**\n * Metadata for this call and any sub-calls (eg. a Chain calling an LLM).\n * Keys should be strings, values should be JSON-serializable.\n */\n metadata?: Record<string, unknown>;\n\n /**\n * Callbacks for this call and any sub-calls (eg. a Chain calling an LLM).\n * Tags are passed to all callbacks, metadata is passed to handle*Start callbacks.\n */\n callbacks?: Callbacks;\n\n /**\n * Unique identifier for the tracer run for this call. If not provided, a new UUID\n * will be generated.\n */\n runId?: string;\n}\n\nexport function parseCallbackConfigArg(\n arg: Callbacks | BaseCallbackConfig | undefined\n): BaseCallbackConfig {\n if (!arg) {\n return {};\n } else if (Array.isArray(arg) || \"name\" in arg) {\n return { callbacks: arg };\n } else {\n return arg;\n }\n}\n\n/**\n * Manage callbacks from different components of LangChain.\n */\nexport abstract class BaseCallbackManager {\n abstract addHandler(handler: BaseCallbackHandler): void;\n\n abstract removeHandler(handler: BaseCallbackHandler): void;\n\n abstract setHandlers(handlers: BaseCallbackHandler[]): void;\n\n setHandler(handler: BaseCallbackHandler): void {\n return this.setHandlers([handler]);\n }\n}\n\n/**\n * Base class for run manager in LangChain.\n */\nexport class BaseRunManager {\n constructor(\n public readonly runId: string,\n public readonly handlers: BaseCallbackHandler[],\n protected readonly inheritableHandlers: BaseCallbackHandler[],\n protected readonly tags: string[],\n protected readonly inheritableTags: string[],\n protected readonly metadata: Record<string, unknown>,\n protected readonly inheritableMetadata: Record<string, unknown>,\n protected readonly _parentRunId?: string\n ) {}\n\n get parentRunId() {\n return this._parentRunId;\n }\n\n async handleText(text: string): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n try {\n await handler.handleText?.(\n text,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleText: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleCustomEvent(\n eventName: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n data: any,\n _runId?: string,\n _tags?: string[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _metadata?: Record<string, any>\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n try {\n await handler.handleCustomEvent?.(\n eventName,\n data,\n this.runId,\n this.tags,\n this.metadata\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleCustomEvent: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\n/**\n * Manages callbacks for retriever runs.\n */\nexport class CallbackManagerForRetrieverRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n getChild(tag?: string): CallbackManager {\n // oxlint-disable-next-line @typescript-eslint/no-use-before-define\n const manager = new CallbackManager(this.runId);\n manager.setHandlers(this.inheritableHandlers);\n manager.addTags(this.inheritableTags);\n manager.addMetadata(this.inheritableMetadata);\n if (tag) {\n manager.addTags([tag], false);\n }\n return manager;\n }\n\n async handleRetrieverEnd(documents: DocumentInterface[]): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreRetriever) {\n try {\n await handler.handleRetrieverEnd?.(\n documents,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleRetriever`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleRetrieverError(err: Error | unknown): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreRetriever) {\n try {\n await handler.handleRetrieverError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (error) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleRetrieverError: ${error}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\nexport class CallbackManagerForLLMRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n async handleLLMNewToken(\n token: string,\n idx?: NewTokenIndices,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: HandleLLMNewTokenCallbackFields\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleLLMNewToken?.(\n token,\n idx ?? { prompt: 0, completion: 0 },\n this.runId,\n this._parentRunId,\n this.tags,\n fields\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMNewToken: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleChatModelStreamEvent(event: ChatModelStreamEvent): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleChatModelStreamEvent?.(\n event,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChatModelStreamEvent: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleLLMError(\n err: Error | unknown,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n extraParams?: Record<string, unknown>\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleLLMError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags,\n extraParams\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMError: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleLLMEnd(\n output: LLMResult,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n extraParams?: Record<string, unknown>\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleLLMEnd?.(\n output,\n this.runId,\n this._parentRunId,\n this.tags,\n extraParams\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\nexport class CallbackManagerForChainRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n getChild(tag?: string): CallbackManager {\n // oxlint-disable-next-line @typescript-eslint/no-use-before-define\n const manager = new CallbackManager(this.runId);\n manager.setHandlers(this.inheritableHandlers);\n manager.addTags(this.inheritableTags);\n manager.addMetadata(this.inheritableMetadata);\n if (tag) {\n manager.addTags([tag], false);\n }\n return manager;\n }\n\n async handleChainError(\n err: Error | unknown,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n kwargs?: { inputs?: Record<string, unknown> }\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreChain) {\n try {\n await handler.handleChainError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags,\n kwargs\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChainError: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleChainEnd(\n output: ChainValues,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n kwargs?: { inputs?: Record<string, unknown> }\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreChain) {\n try {\n await handler.handleChainEnd?.(\n output,\n this.runId,\n this._parentRunId,\n this.tags,\n kwargs\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChainEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleAgentAction(action: AgentAction): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleAgentAction?.(\n action,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleAgentAction: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleAgentEnd(action: AgentFinish): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleAgentEnd?.(\n action,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleAgentEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\nexport class CallbackManagerForToolRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n getChild(tag?: string): CallbackManager {\n // oxlint-disable-next-line @typescript-eslint/no-use-before-define\n const manager = new CallbackManager(this.runId);\n manager.setHandlers(this.inheritableHandlers);\n manager.addTags(this.inheritableTags);\n manager.addMetadata(this.inheritableMetadata);\n if (tag) {\n manager.addTags([tag], false);\n }\n return manager;\n }\n\n async handleToolError(err: Error | unknown): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleToolError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleToolError: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleToolEvent(chunk: unknown): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleToolEvent?.(\n chunk,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n if (handler.raiseError) throw err;\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n async handleToolEnd(output: any): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleToolEnd?.(\n output,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleToolEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\n/**\n * @example\n * ```typescript\n * const prompt = PromptTemplate.fromTemplate(\"What is the answer to {question}?\");\n *\n * // Example of using LLMChain with OpenAI and a simple prompt\n * const chain = new LLMChain({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 }),\n * prompt,\n * });\n *\n * // Running the chain with a single question\n * const result = await chain.call({\n * question: \"What is the airspeed velocity of an unladen swallow?\",\n * });\n * console.log(\"The answer is:\", result);\n * ```\n */\nexport class CallbackManager\n extends BaseCallbackManager\n implements BaseCallbackManagerMethods\n{\n handlers: BaseCallbackHandler[] = [];\n\n inheritableHandlers: BaseCallbackHandler[] = [];\n\n tags: string[] = [];\n\n inheritableTags: string[] = [];\n\n metadata: Record<string, unknown> = {};\n\n inheritableMetadata: Record<string, unknown> = {};\n\n name = \"callback_manager\";\n\n public _parentRunId?: string;\n\n constructor(\n parentRunId?: string,\n options?: {\n handlers?: BaseCallbackHandler[];\n inheritableHandlers?: BaseCallbackHandler[];\n tags?: string[];\n inheritableTags?: string[];\n metadata?: Record<string, unknown>;\n inheritableMetadata?: Record<string, unknown>;\n }\n ) {\n super();\n this.handlers = options?.handlers ?? this.handlers;\n this.inheritableHandlers =\n options?.inheritableHandlers ?? this.inheritableHandlers;\n this.tags = options?.tags ?? this.tags;\n this.inheritableTags = options?.inheritableTags ?? this.inheritableTags;\n this.metadata = options?.metadata ?? this.metadata;\n this.inheritableMetadata =\n options?.inheritableMetadata ?? this.inheritableMetadata;\n this._parentRunId = parentRunId;\n }\n\n /**\n * Gets the parent run ID, if any.\n *\n * @returns The parent run ID.\n */\n getParentRunId() {\n return this._parentRunId;\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string | undefined = undefined,\n _parentRunId: string | undefined = undefined,\n extraParams: Record<string, unknown> | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined\n ): Promise<CallbackManagerForLLMRun[]> {\n return Promise.all(\n prompts.map(async (prompt, idx) => {\n // Can't have duplicate runs with the same run ID (if provided)\n const runId_ = idx === 0 && runId ? runId : uuidv7();\n\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreLLM) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForLLMStart(\n llm,\n [prompt],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleLLMStart?.(\n llm,\n [prompt],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n\n return new CallbackManagerForLLMRun(\n runId_,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n })\n );\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string | undefined = undefined,\n _parentRunId: string | undefined = undefined,\n extraParams: Record<string, unknown> | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined\n ): Promise<CallbackManagerForLLMRun[]> {\n return Promise.all(\n messages.map(async (messageGroup, idx) => {\n // Can't have duplicate runs with the same run ID (if provided)\n const runId_ = idx === 0 && runId ? runId : uuidv7();\n\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreLLM) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForChatModelStart(\n llm,\n [messageGroup],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n if (handler.handleChatModelStart) {\n await handler.handleChatModelStart?.(\n llm,\n [messageGroup],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n } else if (handler.handleLLMStart) {\n const messageString = getBufferString(messageGroup);\n await handler.handleLLMStart?.(\n llm,\n [messageString],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n }\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n\n return new CallbackManagerForLLMRun(\n runId_,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n })\n );\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId = uuidv7(),\n runType: string | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined,\n _parentRunId: string | undefined = undefined,\n extra: Record<string, unknown> | undefined = undefined\n ): Promise<CallbackManagerForChainRun> {\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreChain) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForChainStart(\n chain,\n inputs,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runType,\n runName,\n extra\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleChainStart?.(\n chain,\n inputs,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runType,\n runName,\n extra\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChainStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n return new CallbackManagerForChainRun(\n runId,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId = uuidv7(),\n _parentRunId: string | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined,\n toolCallId: string | undefined = undefined\n ): Promise<CallbackManagerForToolRun> {\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreAgent) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForToolStart(\n tool,\n input,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleToolStart?.(\n tool,\n input,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName,\n toolCallId\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleToolStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n return new CallbackManagerForToolRun(\n runId,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string = uuidv7(),\n _parentRunId: string | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined\n ): Promise<CallbackManagerForRetrieverRun> {\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreRetriever) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForRetrieverStart(\n retriever,\n query,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleRetrieverStart?.(\n retriever,\n query,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleRetrieverStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n return new CallbackManagerForRetrieverRun(\n runId,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n }\n\n async handleCustomEvent?(\n eventName: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n data: any,\n runId: string,\n _tags?: string[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _metadata?: Record<string, any>\n ): // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Promise<any> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreCustomEvent) {\n try {\n await handler.handleCustomEvent?.(\n eventName,\n data,\n runId,\n this.tags,\n this.metadata\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleCustomEvent: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n addHandler(handler: BaseCallbackHandler, inherit = true): void {\n this.handlers.push(handler);\n if (inherit) {\n this.inheritableHandlers.push(handler);\n }\n }\n\n removeHandler(handler: BaseCallbackHandler): void {\n this.handlers = this.handlers.filter((_handler) => _handler !== handler);\n this.inheritableHandlers = this.inheritableHandlers.filter(\n (_handler) => _handler !== handler\n );\n }\n\n setHandlers(handlers: BaseCallbackHandler[], inherit = true): void {\n this.handlers = [];\n this.inheritableHandlers = [];\n for (const handler of handlers) {\n this.addHandler(handler, inherit);\n }\n }\n\n addTags(tags: string[], inherit = true): void {\n this.removeTags(tags); // Remove duplicates\n this.tags.push(...tags);\n if (inherit) {\n this.inheritableTags.push(...tags);\n }\n }\n\n removeTags(tags: string[]): void {\n this.tags = this.tags.filter((tag) => !tags.includes(tag));\n this.inheritableTags = this.inheritableTags.filter(\n (tag) => !tags.includes(tag)\n );\n }\n\n addMetadata(metadata: Record<string, unknown>, inherit = true): void {\n this.metadata = { ...this.metadata, ...metadata };\n if (inherit) {\n this.inheritableMetadata = { ...this.inheritableMetadata, ...metadata };\n }\n }\n\n removeMetadata(metadata: Record<string, unknown>): void {\n for (const key of Object.keys(metadata)) {\n delete this.metadata[key];\n delete this.inheritableMetadata[key];\n }\n }\n\n copy(\n additionalHandlers: BaseCallbackHandler[] = [],\n inherit = true\n ): CallbackManager {\n const manager = new CallbackManager(this._parentRunId);\n for (const handler of this.handlers) {\n const inheritable = this.inheritableHandlers.includes(handler);\n manager.addHandler(handler, inheritable);\n }\n for (const tag of this.tags) {\n const inheritable = this.inheritableTags.includes(tag);\n manager.addTags([tag], inheritable);\n }\n for (const key of Object.keys(this.metadata)) {\n const inheritable = Object.keys(this.inheritableMetadata).includes(key);\n manager.addMetadata({ [key]: this.metadata[key] }, inheritable);\n }\n for (const handler of additionalHandlers) {\n if (\n // Prevent multiple copies of console_callback_handler\n manager.handlers\n .filter((h) => h.name === \"console_callback_handler\")\n .some((h) => h.name === handler.name)\n ) {\n continue;\n }\n manager.addHandler(handler, inherit);\n }\n return manager;\n }\n\n static fromHandlers(handlers: CallbackHandlerMethods) {\n class Handler extends BaseCallbackHandler {\n name = uuidv7();\n\n constructor() {\n super();\n Object.assign(this, handlers);\n }\n }\n\n const manager = new this();\n manager.addHandler(new Handler());\n return manager;\n }\n\n static configure(\n inheritableHandlers?: Callbacks,\n localHandlers?: Callbacks,\n inheritableTags?: string[],\n localTags?: string[],\n inheritableMetadata?: Record<string, unknown>,\n localMetadata?: Record<string, unknown>,\n options?: CallbackManagerOptions\n ): CallbackManager | undefined {\n return this._configureSync(\n inheritableHandlers,\n localHandlers,\n inheritableTags,\n localTags,\n inheritableMetadata,\n localMetadata,\n options\n );\n }\n\n // TODO: Deprecate async method in favor of this one.\n static _configureSync(\n inheritableHandlers?: Callbacks,\n localHandlers?: Callbacks,\n inheritableTags?: string[],\n localTags?: string[],\n inheritableMetadata?: Record<string, unknown>,\n localMetadata?: Record<string, unknown>,\n options?: CallbackManagerOptions\n ) {\n let callbackManager: CallbackManager | undefined;\n if (inheritableHandlers || localHandlers) {\n if (Array.isArray(inheritableHandlers) || !inheritableHandlers) {\n callbackManager = new CallbackManager();\n callbackManager.setHandlers(\n inheritableHandlers?.map(ensureHandler) ?? [],\n true\n );\n } else {\n callbackManager = inheritableHandlers;\n }\n\n callbackManager = callbackManager.copy(\n Array.isArray(localHandlers)\n ? localHandlers.map(ensureHandler)\n : localHandlers?.handlers,\n false\n );\n }\n\n const verboseEnabled =\n getEnvironmentVariable(\"LANGCHAIN_VERBOSE\") === \"true\" ||\n options?.verbose;\n\n const traceableRunTree = LangChainTracer.getTraceableRunTree();\n const tracingV2Enabled =\n traceableRunTree?.tracingEnabled ?? isTracingEnabled();\n\n // If tracing is explicitly disabled by the RunTree (e.g. via\n // traceable({ tracingEnabled: false })), remove any inherited\n // LangChainTracer handlers so that child runs don't trace either.\n if (traceableRunTree?.tracingEnabled === false && callbackManager) {\n const inheritedTracers = callbackManager.handlers.filter(\n (handler) => handler.name === \"langchain_tracer\"\n );\n for (const tracer of inheritedTracers) {\n callbackManager.removeHandler(tracer);\n }\n }\n\n const tracingEnabled =\n tracingV2Enabled ||\n (getEnvironmentVariable(\"LANGCHAIN_TRACING\") ?? false);\n if (verboseEnabled || tracingEnabled) {\n if (!callbackManager) {\n callbackManager = new CallbackManager();\n }\n if (\n verboseEnabled &&\n !callbackManager.handlers.some(\n (handler) => handler.name === ConsoleCallbackHandler.prototype.name\n )\n ) {\n const consoleHandler = new ConsoleCallbackHandler();\n callbackManager.addHandler(consoleHandler, true);\n }\n if (\n tracingEnabled &&\n !callbackManager.handlers.some(\n (handler) => handler.name === \"langchain_tracer\"\n )\n ) {\n if (tracingV2Enabled) {\n const tracerV2 = new LangChainTracer();\n callbackManager.addHandler(tracerV2, true);\n }\n }\n if (tracingV2Enabled) {\n // handoff between langchain and langsmith/traceable\n // override the parent run ID\n if (traceableRunTree && callbackManager._parentRunId === undefined) {\n callbackManager._parentRunId = traceableRunTree.id;\n const tracerV2 = callbackManager.handlers.find(\n (handler) => handler.name === \"langchain_tracer\"\n ) as LangChainTracer | undefined;\n tracerV2?.updateFromRunTree(traceableRunTree);\n }\n }\n }\n\n for (const {\n contextVar,\n inheritable = true,\n handlerClass,\n envVar,\n } of _getConfigureHooks()) {\n const createIfNotInContext =\n envVar && getEnvironmentVariable(envVar) === \"true\" && handlerClass;\n let handler: BaseCallbackHandler | undefined;\n const contextVarValue =\n contextVar !== undefined ? getContextVariable(contextVar) : undefined;\n if (contextVarValue && isBaseCallbackHandler(contextVarValue)) {\n handler = contextVarValue;\n } else if (createIfNotInContext) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n handler = new (handlerClass as any)({});\n }\n if (handler !== undefined) {\n if (!callbackManager) {\n callbackManager = new CallbackManager();\n }\n\n if (!callbackManager.handlers.some((h) => h.name === handler!.name)) {\n callbackManager.addHandler(handler, inheritable);\n }\n }\n }\n\n if (inheritableTags || localTags) {\n if (callbackManager) {\n callbackManager.addTags(inheritableTags ?? []);\n callbackManager.addTags(localTags ?? [], false);\n }\n }\n if (inheritableMetadata || localMetadata) {\n if (callbackManager) {\n callbackManager.addMetadata(inheritableMetadata ?? {});\n callbackManager.addMetadata(localMetadata ?? {}, false);\n }\n }\n const tracerInheritableMetadata = options?.tracerInheritableMetadata;\n const tracerInheritableTags = options?.tracerInheritableTags;\n\n if (\n callbackManager &&\n (tracerInheritableMetadata || tracerInheritableTags)\n ) {\n const replacements = new Map<BaseCallbackHandler, BaseCallbackHandler>();\n const applyTracingConfig = (\n handler: BaseCallbackHandler\n ): BaseCallbackHandler => {\n if (!(handler instanceof LangChainTracer)) {\n return handler;\n }\n const existing = replacements.get(handler);\n if (existing !== undefined) {\n return existing;\n }\n const replacement = handler.copyWithTracingConfig({\n metadata: tracerInheritableMetadata,\n tags: tracerInheritableTags,\n });\n replacements.set(handler, replacement);\n return replacement;\n };\n\n callbackManager.handlers =\n callbackManager.handlers.map(applyTracingConfig);\n callbackManager.inheritableHandlers =\n callbackManager.inheritableHandlers.map(applyTracingConfig);\n }\n\n if (callbackManager) {\n const coalesced = coalesceTracers(\n callbackManager.handlers,\n callbackManager.inheritableHandlers\n );\n callbackManager.handlers = coalesced.handlers;\n callbackManager.inheritableHandlers = coalesced.inheritableHandlers;\n }\n\n return callbackManager;\n }\n}\n\nexport function ensureHandler(\n handler: BaseCallbackHandler | CallbackHandlerMethods\n): BaseCallbackHandler {\n if (\"name\" in handler) {\n return handler;\n }\n\n return BaseCallbackHandler.fromMethods(handler);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","names":["candidate","uuidv7"],"sources":["../../src/callbacks/manager.ts"],"sourcesContent":["import { v7 as uuidv7 } from \"../utils/uuid/index.js\";\nimport { AgentAction, AgentFinish } from \"../agents.js\";\nimport type { ChainValues } from \"../utils/types/index.js\";\nimport { LLMResult } from \"../outputs.js\";\nimport {\n BaseCallbackHandler,\n CallbackHandlerMethods,\n HandleLLMNewTokenCallbackFields,\n isBaseCallbackHandler,\n NewTokenIndices,\n} from \"./base.js\";\nimport { ConsoleCallbackHandler } from \"../tracers/console.js\";\nimport { type BaseMessage } from \"../messages/base.js\";\nimport { getBufferString } from \"../messages/utils.js\";\nimport { getEnvironmentVariable } from \"../utils/env.js\";\nimport { LangChainTracer } from \"../tracers/tracer_langchain.js\";\nimport { consumeCallback } from \"./promises.js\";\nimport { Serialized } from \"../load/serializable.js\";\nimport type { DocumentInterface } from \"../documents/document.js\";\nimport type { ChatModelStreamEvent } from \"../language_models/event.js\";\nimport { isTracingEnabled } from \"../utils/callbacks.js\";\nimport { isBaseTracer } from \"../tracers/base.js\";\nimport {\n getContextVariable,\n _getConfigureHooks,\n} from \"../singletons/async_local_storage/context.js\";\n\ntype BaseCallbackManagerMethods = {\n [K in keyof CallbackHandlerMethods]?: (\n ...args: Parameters<Required<CallbackHandlerMethods>[K]>\n ) => Promise<unknown>;\n};\n\nexport interface CallbackManagerOptions {\n verbose?: boolean;\n tracing?: boolean;\n tracerInheritableMetadata?: Record<string, unknown>;\n tracerInheritableTags?: string[];\n}\n\nexport type Callbacks =\n | CallbackManager\n | (BaseCallbackHandler | CallbackHandlerMethods)[];\n\nfunction getTracerRunStoreKey(tracer: LangChainTracer): object {\n const candidate = tracer as LangChainTracer & {\n _getRunStoreKey?: () => object;\n };\n return candidate._getRunStoreKey?.() ?? tracer;\n}\n\nfunction mergeTracerConfig(\n target: LangChainTracer,\n source: LangChainTracer\n): LangChainTracer {\n if (target === source) {\n return target;\n }\n return target.copyWithTracingConfig({\n metadata: source.tracingMetadata,\n tags: source.tracingTags,\n });\n}\n\nfunction coalesceTracers(\n handlers: BaseCallbackHandler[],\n inheritableHandlers: BaseCallbackHandler[]\n): {\n handlers: BaseCallbackHandler[];\n inheritableHandlers: BaseCallbackHandler[];\n} {\n const inheritableSet = new Set<BaseCallbackHandler>(inheritableHandlers);\n const groups = new Map<\n object,\n { index: number; tracer: LangChainTracer; hasInheritable: boolean }\n >();\n const coalescedHandlers: BaseCallbackHandler[] = [];\n\n // Fold a tracer into its run-store group, keeping a single representative per\n // store (one tracer per store avoids the double-\"end\" throw). The\n // representative's tracing config is drawn from inheritable entries once any\n // exist, so a local-only tracer sharing the store cannot leak its tags or\n // metadata into child runs, which inherit `inheritableHandlers`. Stores with\n // only local entries keep merging those local entries.\n const fold = (handler: LangChainTracer) => {\n const key = getTracerRunStoreKey(handler);\n const isInheritable = inheritableSet.has(handler);\n const group = groups.get(key);\n if (group === undefined) {\n groups.set(key, {\n index: coalescedHandlers.length,\n tracer: handler,\n hasInheritable: isInheritable,\n });\n coalescedHandlers.push(handler);\n return;\n }\n\n if (isInheritable && !group.hasInheritable) {\n // First inheritable entry for this store: drop any local-only config\n // merged so far and restart from an inheritable baseline.\n group.tracer = handler;\n group.hasInheritable = true;\n } else if (isInheritable || !group.hasInheritable) {\n group.tracer = mergeTracerConfig(group.tracer, handler);\n }\n // A local entry on a store that already has inheritable config contributes\n // nothing, so its config cannot ride into children.\n coalescedHandlers[group.index] = group.tracer;\n };\n\n for (const handler of handlers) {\n if (handler instanceof LangChainTracer) {\n fold(handler);\n } else {\n coalescedHandlers.push(handler);\n }\n }\n\n // `inheritableHandlers` is a subset of `handlers` by identity, so its tracers\n // were already folded above. This only promotes an inheritable-only orphan\n // (an alias broken upstream) back into `handlers`.\n for (const handler of inheritableHandlers) {\n if (\n handler instanceof LangChainTracer &&\n !groups.has(getTracerRunStoreKey(handler))\n ) {\n fold(handler);\n }\n }\n\n const seenTracerStores = new Set<object>();\n const coalescedInheritableHandlers = inheritableHandlers.flatMap(\n (handler) => {\n if (!(handler instanceof LangChainTracer)) {\n return [handler];\n }\n\n const key = getTracerRunStoreKey(handler);\n if (seenTracerStores.has(key)) {\n return [];\n }\n seenTracerStores.add(key);\n return [groups.get(key)?.tracer ?? handler];\n }\n );\n\n return {\n handlers: coalescedHandlers,\n inheritableHandlers: coalescedInheritableHandlers,\n };\n}\n\nexport interface BaseCallbackConfig {\n /**\n * Name for the tracer run for this call. Defaults to the name of the class.\n */\n runName?: string;\n\n /**\n * Tags for this call and any sub-calls (eg. a Chain calling an LLM).\n * You can use these to filter calls.\n */\n tags?: string[];\n\n /**\n * Metadata for this call and any sub-calls (eg. a Chain calling an LLM).\n * Keys should be strings, values should be JSON-serializable.\n */\n metadata?: Record<string, unknown>;\n\n /**\n * Callbacks for this call and any sub-calls (eg. a Chain calling an LLM).\n * Tags are passed to all callbacks, metadata is passed to handle*Start callbacks.\n */\n callbacks?: Callbacks;\n\n /**\n * Unique identifier for the tracer run for this call. If not provided, a new UUID\n * will be generated.\n */\n runId?: string;\n}\n\nexport function parseCallbackConfigArg(\n arg: Callbacks | BaseCallbackConfig | undefined\n): BaseCallbackConfig {\n if (!arg) {\n return {};\n } else if (Array.isArray(arg) || \"name\" in arg) {\n return { callbacks: arg };\n } else {\n return arg;\n }\n}\n\n/**\n * Manage callbacks from different components of LangChain.\n */\nexport abstract class BaseCallbackManager {\n abstract addHandler(handler: BaseCallbackHandler): void;\n\n abstract removeHandler(handler: BaseCallbackHandler): void;\n\n abstract setHandlers(handlers: BaseCallbackHandler[]): void;\n\n setHandler(handler: BaseCallbackHandler): void {\n return this.setHandlers([handler]);\n }\n}\n\n/**\n * Base class for run manager in LangChain.\n */\nexport class BaseRunManager {\n constructor(\n public readonly runId: string,\n public readonly handlers: BaseCallbackHandler[],\n protected readonly inheritableHandlers: BaseCallbackHandler[],\n protected readonly tags: string[],\n protected readonly inheritableTags: string[],\n protected readonly metadata: Record<string, unknown>,\n protected readonly inheritableMetadata: Record<string, unknown>,\n protected readonly _parentRunId?: string\n ) {}\n\n get parentRunId() {\n return this._parentRunId;\n }\n\n async handleText(text: string): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n try {\n await handler.handleText?.(\n text,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleText: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleCustomEvent(\n eventName: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n data: any,\n _runId?: string,\n _tags?: string[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _metadata?: Record<string, any>\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n try {\n await handler.handleCustomEvent?.(\n eventName,\n data,\n this.runId,\n this.tags,\n this.metadata\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleCustomEvent: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\n/**\n * Manages callbacks for retriever runs.\n */\nexport class CallbackManagerForRetrieverRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n getChild(tag?: string): CallbackManager {\n // oxlint-disable-next-line @typescript-eslint/no-use-before-define\n const manager = new CallbackManager(this.runId);\n manager.setHandlers(this.inheritableHandlers);\n manager.addTags(this.inheritableTags);\n manager.addMetadata(this.inheritableMetadata);\n if (tag) {\n manager.addTags([tag], false);\n }\n return manager;\n }\n\n async handleRetrieverEnd(documents: DocumentInterface[]): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreRetriever) {\n try {\n await handler.handleRetrieverEnd?.(\n documents,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleRetriever`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleRetrieverError(err: Error | unknown): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreRetriever) {\n try {\n await handler.handleRetrieverError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (error) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleRetrieverError: ${error}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\nexport class CallbackManagerForLLMRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n async handleLLMNewToken(\n token: string,\n idx?: NewTokenIndices,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n fields?: HandleLLMNewTokenCallbackFields\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleLLMNewToken?.(\n token,\n idx ?? { prompt: 0, completion: 0 },\n this.runId,\n this._parentRunId,\n this.tags,\n fields\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMNewToken: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleChatModelStreamEvent(event: ChatModelStreamEvent): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleChatModelStreamEvent?.(\n event,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChatModelStreamEvent: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleLLMError(\n err: Error | unknown,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n extraParams?: Record<string, unknown>\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleLLMError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags,\n extraParams\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMError: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleLLMEnd(\n output: LLMResult,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n extraParams?: Record<string, unknown>\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreLLM) {\n try {\n await handler.handleLLMEnd?.(\n output,\n this.runId,\n this._parentRunId,\n this.tags,\n extraParams\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\nexport class CallbackManagerForChainRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n getChild(tag?: string): CallbackManager {\n // oxlint-disable-next-line @typescript-eslint/no-use-before-define\n const manager = new CallbackManager(this.runId);\n manager.setHandlers(this.inheritableHandlers);\n manager.addTags(this.inheritableTags);\n manager.addMetadata(this.inheritableMetadata);\n if (tag) {\n manager.addTags([tag], false);\n }\n return manager;\n }\n\n async handleChainError(\n err: Error | unknown,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n kwargs?: { inputs?: Record<string, unknown> }\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreChain) {\n try {\n await handler.handleChainError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags,\n kwargs\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChainError: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleChainEnd(\n output: ChainValues,\n _runId?: string,\n _parentRunId?: string,\n _tags?: string[],\n kwargs?: { inputs?: Record<string, unknown> }\n ): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreChain) {\n try {\n await handler.handleChainEnd?.(\n output,\n this.runId,\n this._parentRunId,\n this.tags,\n kwargs\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChainEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleAgentAction(action: AgentAction): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleAgentAction?.(\n action,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleAgentAction: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleAgentEnd(action: AgentFinish): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleAgentEnd?.(\n action,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleAgentEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\nexport class CallbackManagerForToolRun\n extends BaseRunManager\n implements BaseCallbackManagerMethods\n{\n getChild(tag?: string): CallbackManager {\n // oxlint-disable-next-line @typescript-eslint/no-use-before-define\n const manager = new CallbackManager(this.runId);\n manager.setHandlers(this.inheritableHandlers);\n manager.addTags(this.inheritableTags);\n manager.addMetadata(this.inheritableMetadata);\n if (tag) {\n manager.addTags([tag], false);\n }\n return manager;\n }\n\n async handleToolError(err: Error | unknown): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleToolError?.(\n err,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleToolError: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n async handleToolEvent(chunk: unknown): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleToolEvent?.(\n chunk,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n if (handler.raiseError) throw err;\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n async handleToolEnd(output: any): Promise<void> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreAgent) {\n try {\n await handler.handleToolEnd?.(\n output,\n this.runId,\n this._parentRunId,\n this.tags\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleToolEnd: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n}\n\n/**\n * @example\n * ```typescript\n * const prompt = PromptTemplate.fromTemplate(\"What is the answer to {question}?\");\n *\n * // Example of using LLMChain with OpenAI and a simple prompt\n * const chain = new LLMChain({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 }),\n * prompt,\n * });\n *\n * // Running the chain with a single question\n * const result = await chain.call({\n * question: \"What is the airspeed velocity of an unladen swallow?\",\n * });\n * console.log(\"The answer is:\", result);\n * ```\n */\nexport class CallbackManager\n extends BaseCallbackManager\n implements BaseCallbackManagerMethods\n{\n handlers: BaseCallbackHandler[] = [];\n\n inheritableHandlers: BaseCallbackHandler[] = [];\n\n tags: string[] = [];\n\n inheritableTags: string[] = [];\n\n metadata: Record<string, unknown> = {};\n\n inheritableMetadata: Record<string, unknown> = {};\n\n name = \"callback_manager\";\n\n public _parentRunId?: string;\n\n constructor(\n parentRunId?: string,\n options?: {\n handlers?: BaseCallbackHandler[];\n inheritableHandlers?: BaseCallbackHandler[];\n tags?: string[];\n inheritableTags?: string[];\n metadata?: Record<string, unknown>;\n inheritableMetadata?: Record<string, unknown>;\n }\n ) {\n super();\n this.handlers = options?.handlers ?? this.handlers;\n this.inheritableHandlers =\n options?.inheritableHandlers ?? this.inheritableHandlers;\n this.tags = options?.tags ?? this.tags;\n this.inheritableTags = options?.inheritableTags ?? this.inheritableTags;\n this.metadata = options?.metadata ?? this.metadata;\n this.inheritableMetadata =\n options?.inheritableMetadata ?? this.inheritableMetadata;\n this._parentRunId = parentRunId;\n }\n\n /**\n * Gets the parent run ID, if any.\n *\n * @returns The parent run ID.\n */\n getParentRunId() {\n return this._parentRunId;\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string | undefined = undefined,\n _parentRunId: string | undefined = undefined,\n extraParams: Record<string, unknown> | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined\n ): Promise<CallbackManagerForLLMRun[]> {\n return Promise.all(\n prompts.map(async (prompt, idx) => {\n // Can't have duplicate runs with the same run ID (if provided)\n const runId_ = idx === 0 && runId ? runId : uuidv7();\n\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreLLM) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForLLMStart(\n llm,\n [prompt],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleLLMStart?.(\n llm,\n [prompt],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n\n return new CallbackManagerForLLMRun(\n runId_,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n })\n );\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string | undefined = undefined,\n _parentRunId: string | undefined = undefined,\n extraParams: Record<string, unknown> | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined\n ): Promise<CallbackManagerForLLMRun[]> {\n return Promise.all(\n messages.map(async (messageGroup, idx) => {\n // Can't have duplicate runs with the same run ID (if provided)\n const runId_ = idx === 0 && runId ? runId : uuidv7();\n\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreLLM) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForChatModelStart(\n llm,\n [messageGroup],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n if (handler.handleChatModelStart) {\n await handler.handleChatModelStart?.(\n llm,\n [messageGroup],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n } else if (handler.handleLLMStart) {\n const messageString = getBufferString(messageGroup);\n await handler.handleLLMStart?.(\n llm,\n [messageString],\n runId_,\n this._parentRunId,\n extraParams,\n this.tags,\n this.metadata,\n runName\n );\n }\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleLLMStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n\n return new CallbackManagerForLLMRun(\n runId_,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n })\n );\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId = uuidv7(),\n runType: string | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined,\n _parentRunId: string | undefined = undefined,\n extra: Record<string, unknown> | undefined = undefined\n ): Promise<CallbackManagerForChainRun> {\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreChain) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForChainStart(\n chain,\n inputs,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runType,\n runName,\n extra\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleChainStart?.(\n chain,\n inputs,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runType,\n runName,\n extra\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleChainStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n return new CallbackManagerForChainRun(\n runId,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string | Record<string, unknown>,\n runId = uuidv7(),\n _parentRunId: string | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined,\n toolCallId: string | undefined = undefined\n ): Promise<CallbackManagerForToolRun> {\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreAgent) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForToolStart(\n tool,\n input,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleToolStart?.(\n tool,\n typeof input === \"string\" ? input : JSON.stringify(input),\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName,\n toolCallId\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleToolStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n return new CallbackManagerForToolRun(\n runId,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string = uuidv7(),\n _parentRunId: string | undefined = undefined,\n _tags: string[] | undefined = undefined,\n _metadata: Record<string, unknown> | undefined = undefined,\n runName: string | undefined = undefined\n ): Promise<CallbackManagerForRetrieverRun> {\n await Promise.all(\n this.handlers.map((handler) => {\n if (handler.ignoreRetriever) {\n return;\n }\n if (isBaseTracer(handler)) {\n // Create and add run to the run map.\n // We do this synchronously to avoid race conditions\n // when callbacks are backgrounded.\n handler._createRunForRetrieverStart(\n retriever,\n query,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName\n );\n }\n return consumeCallback(async () => {\n try {\n await handler.handleRetrieverStart?.(\n retriever,\n query,\n runId,\n this._parentRunId,\n this.tags,\n this.metadata,\n runName\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleRetrieverStart: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }, handler.awaitHandlers);\n })\n );\n return new CallbackManagerForRetrieverRun(\n runId,\n this.handlers,\n this.inheritableHandlers,\n this.tags,\n this.inheritableTags,\n this.metadata,\n this.inheritableMetadata,\n this._parentRunId\n );\n }\n\n async handleCustomEvent?(\n eventName: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n data: any,\n runId: string,\n _tags?: string[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _metadata?: Record<string, any>\n ): // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Promise<any> {\n await Promise.all(\n this.handlers.map((handler) =>\n consumeCallback(async () => {\n if (!handler.ignoreCustomEvent) {\n try {\n await handler.handleCustomEvent?.(\n eventName,\n data,\n runId,\n this.tags,\n this.metadata\n );\n } catch (err) {\n const logFunction = handler.raiseError\n ? console.error\n : console.warn;\n logFunction(\n `Error in handler ${handler.constructor.name}, handleCustomEvent: ${err}`\n );\n if (handler.raiseError) {\n throw err;\n }\n }\n }\n }, handler.awaitHandlers)\n )\n );\n }\n\n addHandler(handler: BaseCallbackHandler, inherit = true): void {\n this.handlers.push(handler);\n if (inherit) {\n this.inheritableHandlers.push(handler);\n }\n }\n\n removeHandler(handler: BaseCallbackHandler): void {\n this.handlers = this.handlers.filter((_handler) => _handler !== handler);\n this.inheritableHandlers = this.inheritableHandlers.filter(\n (_handler) => _handler !== handler\n );\n }\n\n setHandlers(handlers: BaseCallbackHandler[], inherit = true): void {\n this.handlers = [];\n this.inheritableHandlers = [];\n for (const handler of handlers) {\n this.addHandler(handler, inherit);\n }\n }\n\n addTags(tags: string[], inherit = true): void {\n this.removeTags(tags); // Remove duplicates\n this.tags.push(...tags);\n if (inherit) {\n this.inheritableTags.push(...tags);\n }\n }\n\n removeTags(tags: string[]): void {\n this.tags = this.tags.filter((tag) => !tags.includes(tag));\n this.inheritableTags = this.inheritableTags.filter(\n (tag) => !tags.includes(tag)\n );\n }\n\n addMetadata(metadata: Record<string, unknown>, inherit = true): void {\n this.metadata = { ...this.metadata, ...metadata };\n if (inherit) {\n this.inheritableMetadata = { ...this.inheritableMetadata, ...metadata };\n }\n }\n\n removeMetadata(metadata: Record<string, unknown>): void {\n for (const key of Object.keys(metadata)) {\n delete this.metadata[key];\n delete this.inheritableMetadata[key];\n }\n }\n\n copy(\n additionalHandlers: BaseCallbackHandler[] = [],\n inherit = true\n ): CallbackManager {\n const manager = new CallbackManager(this._parentRunId);\n for (const handler of this.handlers) {\n const inheritable = this.inheritableHandlers.includes(handler);\n manager.addHandler(handler, inheritable);\n }\n for (const tag of this.tags) {\n const inheritable = this.inheritableTags.includes(tag);\n manager.addTags([tag], inheritable);\n }\n for (const key of Object.keys(this.metadata)) {\n const inheritable = Object.keys(this.inheritableMetadata).includes(key);\n manager.addMetadata({ [key]: this.metadata[key] }, inheritable);\n }\n for (const handler of additionalHandlers) {\n if (\n // Prevent multiple copies of console_callback_handler\n manager.handlers\n .filter((h) => h.name === \"console_callback_handler\")\n .some((h) => h.name === handler.name)\n ) {\n continue;\n }\n manager.addHandler(handler, inherit);\n }\n return manager;\n }\n\n static fromHandlers(handlers: CallbackHandlerMethods) {\n class Handler extends BaseCallbackHandler {\n name = uuidv7();\n\n constructor() {\n super();\n Object.assign(this, handlers);\n }\n }\n\n const manager = new this();\n manager.addHandler(new Handler());\n return manager;\n }\n\n static configure(\n inheritableHandlers?: Callbacks,\n localHandlers?: Callbacks,\n inheritableTags?: string[],\n localTags?: string[],\n inheritableMetadata?: Record<string, unknown>,\n localMetadata?: Record<string, unknown>,\n options?: CallbackManagerOptions\n ): CallbackManager | undefined {\n return this._configureSync(\n inheritableHandlers,\n localHandlers,\n inheritableTags,\n localTags,\n inheritableMetadata,\n localMetadata,\n options\n );\n }\n\n // TODO: Deprecate async method in favor of this one.\n static _configureSync(\n inheritableHandlers?: Callbacks,\n localHandlers?: Callbacks,\n inheritableTags?: string[],\n localTags?: string[],\n inheritableMetadata?: Record<string, unknown>,\n localMetadata?: Record<string, unknown>,\n options?: CallbackManagerOptions\n ) {\n let callbackManager: CallbackManager | undefined;\n if (inheritableHandlers || localHandlers) {\n if (Array.isArray(inheritableHandlers) || !inheritableHandlers) {\n callbackManager = new CallbackManager();\n callbackManager.setHandlers(\n inheritableHandlers?.map(ensureHandler) ?? [],\n true\n );\n } else {\n callbackManager = inheritableHandlers;\n }\n\n callbackManager = callbackManager.copy(\n Array.isArray(localHandlers)\n ? localHandlers.map(ensureHandler)\n : localHandlers?.handlers,\n false\n );\n }\n\n const verboseEnabled =\n getEnvironmentVariable(\"LANGCHAIN_VERBOSE\") === \"true\" ||\n options?.verbose;\n\n const traceableRunTree = LangChainTracer.getTraceableRunTree();\n const tracingV2Enabled =\n traceableRunTree?.tracingEnabled ?? isTracingEnabled();\n\n // If tracing is explicitly disabled by the RunTree (e.g. via\n // traceable({ tracingEnabled: false })), remove any inherited\n // LangChainTracer handlers so that child runs don't trace either.\n if (traceableRunTree?.tracingEnabled === false && callbackManager) {\n const inheritedTracers = callbackManager.handlers.filter(\n (handler) => handler.name === \"langchain_tracer\"\n );\n for (const tracer of inheritedTracers) {\n callbackManager.removeHandler(tracer);\n }\n }\n\n const tracingEnabled =\n tracingV2Enabled ||\n (getEnvironmentVariable(\"LANGCHAIN_TRACING\") ?? false);\n if (verboseEnabled || tracingEnabled) {\n if (!callbackManager) {\n callbackManager = new CallbackManager();\n }\n if (\n verboseEnabled &&\n !callbackManager.handlers.some(\n (handler) => handler.name === ConsoleCallbackHandler.prototype.name\n )\n ) {\n const consoleHandler = new ConsoleCallbackHandler();\n callbackManager.addHandler(consoleHandler, true);\n }\n if (\n tracingEnabled &&\n !callbackManager.handlers.some(\n (handler) => handler.name === \"langchain_tracer\"\n )\n ) {\n if (tracingV2Enabled) {\n const tracerV2 = new LangChainTracer();\n callbackManager.addHandler(tracerV2, true);\n }\n }\n if (tracingV2Enabled) {\n // handoff between langchain and langsmith/traceable\n // override the parent run ID\n if (traceableRunTree && callbackManager._parentRunId === undefined) {\n callbackManager._parentRunId = traceableRunTree.id;\n const tracerV2 = callbackManager.handlers.find(\n (handler) => handler.name === \"langchain_tracer\"\n ) as LangChainTracer | undefined;\n tracerV2?.updateFromRunTree(traceableRunTree);\n }\n }\n }\n\n for (const {\n contextVar,\n inheritable = true,\n handlerClass,\n envVar,\n } of _getConfigureHooks()) {\n const createIfNotInContext =\n envVar && getEnvironmentVariable(envVar) === \"true\" && handlerClass;\n let handler: BaseCallbackHandler | undefined;\n const contextVarValue =\n contextVar !== undefined ? getContextVariable(contextVar) : undefined;\n if (contextVarValue && isBaseCallbackHandler(contextVarValue)) {\n handler = contextVarValue;\n } else if (createIfNotInContext) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n handler = new (handlerClass as any)({});\n }\n if (handler !== undefined) {\n if (!callbackManager) {\n callbackManager = new CallbackManager();\n }\n\n if (!callbackManager.handlers.some((h) => h.name === handler!.name)) {\n callbackManager.addHandler(handler, inheritable);\n }\n }\n }\n\n if (inheritableTags || localTags) {\n if (callbackManager) {\n callbackManager.addTags(inheritableTags ?? []);\n callbackManager.addTags(localTags ?? [], false);\n }\n }\n if (inheritableMetadata || localMetadata) {\n if (callbackManager) {\n callbackManager.addMetadata(inheritableMetadata ?? {});\n callbackManager.addMetadata(localMetadata ?? {}, false);\n }\n }\n const tracerInheritableMetadata = options?.tracerInheritableMetadata;\n const tracerInheritableTags = options?.tracerInheritableTags;\n\n if (\n callbackManager &&\n (tracerInheritableMetadata || tracerInheritableTags)\n ) {\n const replacements = new Map<BaseCallbackHandler, BaseCallbackHandler>();\n const applyTracingConfig = (\n handler: BaseCallbackHandler\n ): BaseCallbackHandler => {\n if (!(handler instanceof LangChainTracer)) {\n return handler;\n }\n const existing = replacements.get(handler);\n if (existing !== undefined) {\n return existing;\n }\n const replacement = handler.copyWithTracingConfig({\n metadata: tracerInheritableMetadata,\n tags: tracerInheritableTags,\n });\n replacements.set(handler, replacement);\n return replacement;\n };\n\n callbackManager.handlers =\n callbackManager.handlers.map(applyTracingConfig);\n callbackManager.inheritableHandlers =\n callbackManager.inheritableHandlers.map(applyTracingConfig);\n }\n\n if (callbackManager) {\n const coalesced = coalesceTracers(\n callbackManager.handlers,\n callbackManager.inheritableHandlers\n );\n callbackManager.handlers = coalesced.handlers;\n callbackManager.inheritableHandlers = coalesced.inheritableHandlers;\n }\n\n return callbackManager;\n }\n}\n\nexport function ensureHandler(\n handler: BaseCallbackHandler | CallbackHandlerMethods\n): BaseCallbackHandler {\n if (\"name\" in handler) {\n return handler;\n }\n\n return BaseCallbackHandler.fromMethods(handler);\n}\n"],"mappings":"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"}
@@ -139,7 +139,7 @@ var BaseLangChain = class extends require_base.Runnable {
139
139
  this.callbacks = params.callbacks;
140
140
  this.tags = params.tags ?? [];
141
141
  this.metadata = params.metadata ?? {};
142
- this._addVersion("@langchain/core", "1.2.11");
142
+ this._addVersion("@langchain/core", "1.2.13");
143
143
  }
144
144
  _addVersion(pkg, version) {
145
145
  const existing = this.metadata?.versions;
@@ -138,7 +138,7 @@ var BaseLangChain = class extends Runnable {
138
138
  this.callbacks = params.callbacks;
139
139
  this.tags = params.tags ?? [];
140
140
  this.metadata = params.metadata ?? {};
141
- this._addVersion("@langchain/core", "1.2.11");
141
+ this._addVersion("@langchain/core", "1.2.13");
142
142
  }
143
143
  _addVersion(pkg, version) {
144
144
  const existing = this.metadata?.versions;
@@ -124,6 +124,7 @@ function _contentBlockToString(block) {
124
124
  default: return block.type ? `[${block.type}]` : "";
125
125
  }
126
126
  }
127
+ const TOOL_CALL_ID_DISPLAY_LIMIT = 64;
127
128
  /**
128
129
  * This function is used by memory classes to get a string representation
129
130
  * of the chat message history, based on the message content and role.
@@ -136,6 +137,7 @@ function _contentBlockToString(block) {
136
137
  * ```
137
138
  *
138
139
  * This avoids token inflation from metadata when stringifying message objects directly.
140
+ * Tool-call IDs longer than 64 characters are shortened only in the rendered string.
139
141
  */
140
142
  function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
141
143
  const string_messages = [];
@@ -152,8 +154,13 @@ function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
152
154
  let message = `${role}: ${nameStr}${readableContent}`;
153
155
  if (m.type === "ai") {
154
156
  const aiMessage = m;
155
- if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) message += JSON.stringify(aiMessage.tool_calls);
156
- else if (aiMessage.additional_kwargs && "function_call" in aiMessage.additional_kwargs) message += JSON.stringify(aiMessage.additional_kwargs.function_call);
157
+ if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) {
158
+ const toolCalls = aiMessage.tool_calls;
159
+ message += JSON.stringify(toolCalls.some((call) => (call.id?.length ?? 0) > TOOL_CALL_ID_DISPLAY_LIMIT) ? toolCalls.map((call) => call.id && call.id.length > TOOL_CALL_ID_DISPLAY_LIMIT ? {
160
+ ...call,
161
+ id: `${call.id.slice(0, TOOL_CALL_ID_DISPLAY_LIMIT)}...`
162
+ } : call) : toolCalls);
163
+ } else if (aiMessage.additional_kwargs && "function_call" in aiMessage.additional_kwargs) message += JSON.stringify(aiMessage.additional_kwargs.function_call);
157
164
  }
158
165
  string_messages.push(message);
159
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["_isToolCall","HumanMessage","AIMessage","SystemMessage","ToolMessage","RemoveMessage","addLangChainErrorFields","isBaseMessage","_isMessageFieldWithRole","FunctionMessage","ChatMessage","HumanMessageChunk","AIMessageChunk","SystemMessageChunk","FunctionMessageChunk","ChatMessageChunk","parsePartialJson"],"sources":["../../src/messages/utils.ts"],"sourcesContent":["import { addLangChainErrorFields } from \"../errors/index.js\";\nimport { SerializedConstructor } from \"../load/serializable.js\";\nimport { _isToolCall } from \"../tools/utils.js\";\nimport { parsePartialJson } from \"../utils/json.js\";\nimport { AIMessage, AIMessageChunk, AIMessageChunkFields } from \"./ai.js\";\nimport {\n BaseMessageLike,\n BaseMessage,\n isBaseMessage,\n StoredMessage,\n StoredMessageV1,\n BaseMessageFields,\n _isMessageFieldWithRole,\n} from \"./base.js\";\nimport { ChatMessage, ChatMessageFields, ChatMessageChunk } from \"./chat.js\";\nimport {\n FunctionMessage,\n FunctionMessageChunk,\n FunctionMessageFields,\n} from \"./function.js\";\nimport { HumanMessage, HumanMessageChunk } from \"./human.js\";\nimport { RemoveMessage } from \"./modifier.js\";\nimport { SystemMessage, SystemMessageChunk } from \"./system.js\";\nimport {\n InvalidToolCall,\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n ToolMessageFields,\n} from \"./tool.js\";\n\nexport type $Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\n/**\n * Provider streaming marker for raw (non-JSON) tool input.\n * Not part of the public {@link ToolCallChunk} type; integrations may attach\n * `isCustomTool` at runtime and pass chunks typed as this alias.\n */\nexport type RawInputToolCallChunk = ToolCallChunk & { isCustomTool?: boolean };\n\nfunction chunkUsesRawInputArgs(chunk: ToolCallChunk): boolean {\n return (chunk as RawInputToolCallChunk).isCustomTool === true;\n}\n\n/**\n * Extracts the explicitly declared keys from a type T.\n *\n * @template T - The type to extract keys from\n * @returns A union of keys that are not string, number, or symbol\n */\ntype $KnownKeys<T> = {\n [K in keyof T]: string extends K\n ? never\n : number extends K\n ? never\n : symbol extends K\n ? never\n : K;\n}[keyof T];\n\n/**\n * Detects if T has an index signature.\n *\n * @template T - The type to check for index signatures\n * @returns True if T has an index signature, false otherwise\n */\ntype $HasIndexSignature<T> = string extends keyof T\n ? true\n : number extends keyof T\n ? true\n : symbol extends keyof T\n ? true\n : false;\n\n/**\n * Detects if T has an index signature and no known keys.\n *\n * @template T - The type to check for index signatures and no known keys\n * @returns True if T has an index signature and no known keys, false otherwise\n */\ntype $OnlyIndexSignatures<T> =\n $HasIndexSignature<T> extends true\n ? [$KnownKeys<T>] extends [never]\n ? true\n : false\n : false;\n\n/**\n * Recursively merges two object types T and U, with U taking precedence over T.\n *\n * This utility type performs a deep merge of two object types:\n * - For keys that exist in both T and U:\n * - If both values are objects (Record<string, unknown>), recursively merge them\n * - Otherwise, U's value takes precedence\n * - For keys that exist only in T, use T's value\n * - For keys that exist only in U, use U's value\n *\n * @template T - The first object type to merge\n * @template U - The second object type to merge (takes precedence over T)\n *\n * @example\n * ```ts\n * type ObjectA = {\n * shared: { a: string; b: number };\n * onlyInA: boolean;\n * };\n *\n * type ObjectB = {\n * shared: { b: string; c: Date };\n * onlyInB: symbol;\n * };\n *\n * type Merged = $MergeObjects<ObjectA, ObjectB>;\n * // Result: {\n * // shared: { a: string; b: string; c: Date };\n * // onlyInA: boolean;\n * // onlyInB: symbol;\n * // }\n * ```\n */\nexport type $MergeObjects<T, U> =\n // If U is purely index-signature based, prefer U as a whole\n $OnlyIndexSignatures<U> extends true\n ? U\n : // If T is purely index-signature based, prefer U as a whole (prevents leaking broad index signatures)\n $OnlyIndexSignatures<T> extends true\n ? U\n : {\n [K in keyof T | keyof U]: K extends keyof T\n ? K extends keyof U\n ? T[K] extends Record<string, unknown>\n ? U[K] extends Record<string, unknown>\n ? $MergeObjects<T[K], U[K]>\n : U[K]\n : U[K]\n : T[K]\n : K extends keyof U\n ? U[K]\n : never;\n };\n\n/**\n * Merges two discriminated unions A and B based on a discriminator key (defaults to \"type\").\n * For each possible value of the discriminator across both unions:\n * - If B has a member with that discriminator value, use B's member\n * - Otherwise use A's member with that discriminator value\n * This effectively merges the unions while giving B's members precedence over A's members.\n *\n * @template A - First discriminated union type that extends Record<Key, PropertyKey>\n * @template B - Second discriminated union type that extends Record<Key, PropertyKey>\n * @template Key - The discriminator key property, defaults to \"type\"\n */\nexport type $MergeDiscriminatedUnion<\n A extends Record<Key, PropertyKey>,\n B extends Record<Key, PropertyKey>,\n Key extends PropertyKey = \"type\",\n> = {\n // Create a mapped type over all possible discriminator values from both A and B\n [T in A[Key] | B[Key]]: [Extract<B, Record<Key, T>>] extends [never] // Check if B has a member with this discriminator value\n ? // If B doesn't have this discriminator value, use A's member\n Extract<A, Record<Key, T>>\n : // If B does have this discriminator value, merge A's and B's members (B takes precedence)\n [Extract<A, Record<Key, T>>] extends [never]\n ? Extract<B, Record<Key, T>>\n : $MergeObjects<Extract<A, Record<Key, T>>, Extract<B, Record<Key, T>>>;\n // Index into the mapped type with all possible discriminator values\n // This converts the mapped type back into a union\n}[A[Key] | B[Key]];\n\nexport type Constructor<T> = new (...args: unknown[]) => T;\n\n/**\n * Immediately-invoked function expression.\n *\n * @param fn - The function to execute\n * @returns The result of the function\n */\nexport const iife = <T>(fn: () => T) => fn();\n\nfunction _coerceToolCall(\n toolCall: ToolCall | Record<string, unknown>\n): ToolCall {\n if (_isToolCall(toolCall)) {\n return toolCall;\n } else if (\n typeof toolCall.id === \"string\" &&\n toolCall.type === \"function\" &&\n typeof toolCall.function === \"object\" &&\n toolCall.function !== null &&\n \"arguments\" in toolCall.function &&\n typeof toolCall.function.arguments === \"string\" &&\n \"name\" in toolCall.function &&\n typeof toolCall.function.name === \"string\"\n ) {\n // Handle OpenAI tool call format\n return {\n id: toolCall.id,\n args: JSON.parse(toolCall.function.arguments),\n name: toolCall.function.name,\n type: \"tool_call\",\n };\n } else {\n // TODO: Throw an error?\n return toolCall as unknown as ToolCall;\n }\n}\n\nfunction isSerializedConstructor(x: unknown): x is SerializedConstructor {\n return (\n typeof x === \"object\" &&\n x != null &&\n (x as SerializedConstructor).lc === 1 &&\n Array.isArray((x as SerializedConstructor).id) &&\n (x as SerializedConstructor).kwargs != null &&\n typeof (x as SerializedConstructor).kwargs === \"object\"\n );\n}\n\nfunction _constructMessageFromParams(\n params:\n | (BaseMessageFields & { type: string } & Record<string, unknown>)\n | SerializedConstructor\n) {\n let type: string;\n let rest: BaseMessageFields & Record<string, unknown>;\n // Support serialized messages\n if (isSerializedConstructor(params)) {\n const className = params.id.at(-1);\n if (className === \"HumanMessage\" || className === \"HumanMessageChunk\") {\n type = \"user\";\n } else if (className === \"AIMessage\" || className === \"AIMessageChunk\") {\n type = \"assistant\";\n } else if (\n className === \"SystemMessage\" ||\n className === \"SystemMessageChunk\"\n ) {\n type = \"system\";\n } else if (\n className === \"FunctionMessage\" ||\n className === \"FunctionMessageChunk\"\n ) {\n type = \"function\";\n } else if (\n className === \"ToolMessage\" ||\n className === \"ToolMessageChunk\"\n ) {\n type = \"tool\";\n } else {\n type = \"unknown\";\n }\n rest = params.kwargs as BaseMessageFields;\n } else {\n const { type: extractedType, ...otherParams } = params;\n type = extractedType;\n rest = otherParams;\n }\n if (type === \"human\" || type === \"user\") {\n return new HumanMessage(rest);\n } else if (type === \"ai\" || type === \"assistant\") {\n const { tool_calls: rawToolCalls, ...other } = rest;\n if (!Array.isArray(rawToolCalls)) {\n return new AIMessage(rest);\n }\n const tool_calls = rawToolCalls.map(_coerceToolCall);\n return new AIMessage({ ...other, tool_calls });\n } else if (type === \"system\") {\n return new SystemMessage(rest);\n } else if (type === \"developer\") {\n return new SystemMessage({\n ...rest,\n additional_kwargs: {\n ...rest.additional_kwargs,\n __openai_role__: \"developer\",\n },\n });\n } else if (type === \"tool\" && \"tool_call_id\" in rest) {\n return new ToolMessage({\n ...rest,\n content: rest.content,\n tool_call_id: rest.tool_call_id as string,\n name: rest.name,\n });\n } else if (type === \"remove\" && \"id\" in rest && typeof rest.id === \"string\") {\n return new RemoveMessage({ ...rest, id: rest.id });\n } else {\n const error = addLangChainErrorFields(\n new Error(\n `Unable to coerce message from array: only human, AI, system, developer, or tool message coercion is currently supported.\\n\\nReceived: ${JSON.stringify(\n params,\n null,\n 2\n )}`\n ),\n \"MESSAGE_COERCION_FAILURE\"\n );\n throw error;\n }\n}\n\nexport function coerceMessageLikeToMessage(\n messageLike: BaseMessageLike\n): BaseMessage {\n if (typeof messageLike === \"string\") {\n return new HumanMessage(messageLike);\n } else if (isBaseMessage(messageLike)) {\n return messageLike;\n }\n if (Array.isArray(messageLike)) {\n const [type, content] = messageLike;\n return _constructMessageFromParams({ type, content });\n } else if (_isMessageFieldWithRole(messageLike)) {\n const { role: type, ...rest } = messageLike;\n return _constructMessageFromParams({ ...rest, type });\n } else {\n return _constructMessageFromParams(messageLike);\n }\n}\n\n/**\n * Renders a single content block to a compact string representation.\n * Text blocks are returned as-is; multimodal blocks (image, audio, video, file)\n * become short placeholders like `[image]` so their existence is preserved\n * without inflating token counts with base64 data or metadata.\n */\nfunction _contentBlockToString(\n block: string | { type?: string; [key: string]: unknown }\n): string {\n if (typeof block === \"string\") return block;\n switch (block.type) {\n case \"text\":\n return (block as { text: string }).text ?? \"\";\n case \"text-plain\":\n return (block as { text?: string }).text ?? \"[text-plain file]\";\n case \"image\":\n case \"image_url\":\n return \"[image]\";\n case \"audio\":\n case \"input_audio\":\n return \"[audio]\";\n case \"video\":\n return \"[video]\";\n case \"file\":\n return \"[file]\";\n case \"reasoning\":\n case \"tool_call\":\n case \"tool_call_chunk\":\n case \"invalid_tool_call\":\n case \"server_tool_call\":\n case \"server_tool_call_chunk\":\n case \"server_tool_call_result\":\n case \"non_standard\":\n return \"\";\n default:\n return block.type ? `[${block.type}]` : \"\";\n }\n}\n\n/**\n * This function is used by memory classes to get a string representation\n * of the chat message history, based on the message content and role.\n *\n * Produces compact output like:\n * ```\n * Human: What's the weather?\n * AI: Let me check...[tool_calls]\n * Tool: 72°F and sunny\n * ```\n *\n * This avoids token inflation from metadata when stringifying message objects directly.\n */\nexport function getBufferString(\n messages: BaseMessage[],\n humanPrefix = \"Human\",\n aiPrefix = \"AI\"\n): string {\n const string_messages: string[] = [];\n for (const m of messages) {\n let role: string;\n if (m.type === \"human\") {\n role = humanPrefix;\n } else if (m.type === \"ai\") {\n role = aiPrefix;\n } else if (m.type === \"system\") {\n role = \"System\";\n } else if (m.type === \"tool\") {\n role = \"Tool\";\n } else if (m.type === \"generic\") {\n role = (m as ChatMessage).role;\n } else {\n throw new Error(`Got unsupported message type: ${m.type}`);\n }\n const nameStr = m.name ? `${m.name}, ` : \"\";\n\n // Render content compactly: text as-is, multimodal blocks as placeholders\n const readableContent =\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map(_contentBlockToString).filter(Boolean).join(\"\")\n : \"\";\n\n let message = `${role}: ${nameStr}${readableContent}`;\n\n // Include tool calls for AI messages (matching Python's get_buffer_string behavior)\n if (m.type === \"ai\") {\n const aiMessage = m as AIMessage;\n if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) {\n message += JSON.stringify(aiMessage.tool_calls);\n } else if (\n aiMessage.additional_kwargs &&\n \"function_call\" in aiMessage.additional_kwargs\n ) {\n // Legacy behavior assumes only one function call per message\n message += JSON.stringify(aiMessage.additional_kwargs.function_call);\n }\n }\n\n string_messages.push(message);\n }\n return string_messages.join(\"\\n\");\n}\n\n/**\n * Maps messages from an older format (V1) to the current `StoredMessage`\n * format. If the message is already in the `StoredMessage` format, it is\n * returned as is. Otherwise, it transforms the V1 message into a\n * `StoredMessage`. This function is important for maintaining\n * compatibility with older message formats.\n */\nfunction mapV1MessageToStoredMessage(\n message: StoredMessage | StoredMessageV1\n): StoredMessage {\n // TODO: Remove this mapper when we deprecate the old message format.\n if ((message as StoredMessage).data !== undefined) {\n return message as StoredMessage;\n } else {\n const v1Message = message as StoredMessageV1;\n return {\n type: v1Message.type,\n data: {\n content: v1Message.text,\n role: v1Message.role,\n name: undefined,\n tool_call_id: undefined,\n },\n };\n }\n}\n\nexport function mapStoredMessageToChatMessage(message: StoredMessage) {\n const storedMessage = mapV1MessageToStoredMessage(message);\n switch (storedMessage.type) {\n case \"human\":\n return new HumanMessage(storedMessage.data);\n case \"ai\":\n return new AIMessage(storedMessage.data);\n case \"system\":\n return new SystemMessage(storedMessage.data);\n case \"function\":\n if (storedMessage.data.name === undefined) {\n throw new Error(\"Name must be defined for function messages\");\n }\n return new FunctionMessage(storedMessage.data as FunctionMessageFields);\n case \"tool\":\n if (storedMessage.data.tool_call_id === undefined) {\n throw new Error(\"Tool call ID must be defined for tool messages\");\n }\n return new ToolMessage(storedMessage.data as ToolMessageFields);\n case \"generic\": {\n if (storedMessage.data.role === undefined) {\n throw new Error(\"Role must be defined for chat messages\");\n }\n return new ChatMessage(storedMessage.data as ChatMessageFields);\n }\n default:\n throw new Error(`Got unexpected type: ${storedMessage.type}`);\n }\n}\n\n/**\n * Transforms an array of `StoredMessage` instances into an array of\n * `BaseMessage` instances. It uses the `mapV1MessageToStoredMessage`\n * function to ensure all messages are in the `StoredMessage` format, then\n * creates new instances of the appropriate `BaseMessage` subclass based\n * on the type of each message. This function is used to prepare stored\n * messages for use in a chat context.\n */\nexport function mapStoredMessagesToChatMessages(\n messages: StoredMessage[]\n): BaseMessage[] {\n return messages.map(mapStoredMessageToChatMessage);\n}\n\n/**\n * Transforms an array of `BaseMessage` instances into an array of\n * `StoredMessage` instances. It does this by calling the `toDict` method\n * on each `BaseMessage`, which returns a `StoredMessage`. This function\n * is used to prepare chat messages for storage.\n */\nexport function mapChatMessagesToStoredMessages(\n messages: BaseMessage[]\n): StoredMessage[] {\n return messages.map((message) => message.toDict());\n}\n\nexport function convertToChunk(message: BaseMessage) {\n const type = message._getType();\n if (type === \"human\") {\n return new HumanMessageChunk({ ...message });\n } else if (type === \"ai\") {\n let aiChunkFields: AIMessageChunkFields = {\n ...message,\n };\n if (\"tool_calls\" in aiChunkFields) {\n aiChunkFields = {\n ...aiChunkFields,\n tool_call_chunks: aiChunkFields.tool_calls?.map((tc) => ({\n ...tc,\n type: \"tool_call_chunk\",\n index: undefined,\n args: JSON.stringify(tc.args),\n })),\n };\n }\n return new AIMessageChunk({ ...aiChunkFields });\n } else if (type === \"system\") {\n return new SystemMessageChunk({ ...message });\n } else if (type === \"function\") {\n return new FunctionMessageChunk({ ...message });\n } else if (ChatMessage.isInstance(message)) {\n return new ChatMessageChunk({ ...message });\n } else {\n throw new Error(\"Unknown message type.\");\n }\n}\n\n/**\n * Collapses an array of tool call chunks into complete tool calls.\n *\n * This function groups tool call chunks by their id and/or index, then attempts to\n * parse and validate the accumulated arguments for each group. Successfully parsed\n * tool calls are returned as valid `ToolCall` objects, while malformed ones are\n * returned as `InvalidToolCall` objects.\n *\n * @param chunks - An array of `ToolCallChunk` objects to collapse\n * @returns An object containing:\n * - `tool_call_chunks`: The original input chunks\n * - `tool_calls`: An array of successfully parsed and validated tool calls\n * - `invalid_tool_calls`: An array of tool calls that failed parsing or validation\n *\n * @remarks\n * Chunks are grouped using the following matching logic:\n * - If a chunk has both an id and index, it matches chunks with the same id and index\n * - If a chunk has only an id, it matches chunks with the same id\n * - If a chunk has only an index, it matches chunks with the same index\n *\n * For each group, the function:\n * 1. Concatenates all `args` strings from the chunks\n * 2. Attempts to parse the concatenated string as JSON\n * 3. Validates that the result is a non-null object with a valid id\n * 4. Creates either a `ToolCall` (if valid) or `InvalidToolCall` (if invalid)\n */\nexport function collapseToolCallChunks(chunks: ToolCallChunk[]): {\n tool_call_chunks: ToolCallChunk[];\n tool_calls: ToolCall[];\n invalid_tool_calls: InvalidToolCall[];\n} {\n const groupedToolCallChunks = chunks.reduce((acc, chunk) => {\n const matchedChunkIndex = acc.findIndex(([match]) => {\n // If chunk has an id and index, match if both are present\n if (\n \"id\" in chunk &&\n chunk.id &&\n \"index\" in chunk &&\n chunk.index !== undefined\n ) {\n return chunk.id === match.id && chunk.index === match.index;\n }\n // If chunk has an id, we match on id\n if (\"id\" in chunk && chunk.id) {\n return chunk.id === match.id;\n }\n // If chunk has an index, we match on index\n if (\"index\" in chunk && chunk.index !== undefined) {\n return chunk.index === match.index;\n }\n return false;\n });\n if (matchedChunkIndex !== -1) {\n acc[matchedChunkIndex].push(chunk);\n } else {\n acc.push([chunk]);\n }\n return acc;\n }, [] as ToolCallChunk[][]);\n\n const toolCalls: ToolCall[] = [];\n const invalidToolCalls: InvalidToolCall[] = [];\n for (const chunks of groupedToolCallChunks) {\n let parsedArgs: Record<string, unknown> | null = null;\n const usesRawInputArgs = chunks.some(chunkUsesRawInputArgs);\n const name = chunks[0]?.name ?? \"\";\n const joinedArgsRaw = chunks.map((c) => c.args || \"\").join(\"\");\n const joinedArgs = usesRawInputArgs ? joinedArgsRaw : joinedArgsRaw.trim();\n const argsStr = joinedArgs.length ? joinedArgs : \"{}\";\n const id = chunks.find((c) => c.id)?.id ?? chunks[0]?.id;\n if (usesRawInputArgs && id) {\n toolCalls.push({\n name,\n args: { input: joinedArgs },\n id,\n type: \"tool_call\",\n });\n continue;\n }\n try {\n parsedArgs = parsePartialJson(argsStr);\n if (\n !id ||\n parsedArgs === null ||\n typeof parsedArgs !== \"object\" ||\n Array.isArray(parsedArgs)\n ) {\n throw new Error(\"Malformed tool call chunk args.\");\n }\n toolCalls.push({\n name,\n args: parsedArgs,\n id,\n type: \"tool_call\",\n });\n } catch {\n invalidToolCalls.push({\n name,\n args: argsStr,\n id,\n error: \"Malformed args.\",\n type: \"invalid_tool_call\",\n });\n }\n }\n return {\n tool_call_chunks: chunks,\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["_isToolCall","HumanMessage","AIMessage","SystemMessage","ToolMessage","RemoveMessage","addLangChainErrorFields","isBaseMessage","_isMessageFieldWithRole","FunctionMessage","ChatMessage","HumanMessageChunk","AIMessageChunk","SystemMessageChunk","FunctionMessageChunk","ChatMessageChunk","parsePartialJson"],"sources":["../../src/messages/utils.ts"],"sourcesContent":["import { addLangChainErrorFields } from \"../errors/index.js\";\nimport { SerializedConstructor } from \"../load/serializable.js\";\nimport { _isToolCall } from \"../tools/utils.js\";\nimport { parsePartialJson } from \"../utils/json.js\";\nimport { AIMessage, AIMessageChunk, AIMessageChunkFields } from \"./ai.js\";\nimport {\n BaseMessageLike,\n BaseMessage,\n isBaseMessage,\n StoredMessage,\n StoredMessageV1,\n BaseMessageFields,\n _isMessageFieldWithRole,\n} from \"./base.js\";\nimport { ChatMessage, ChatMessageFields, ChatMessageChunk } from \"./chat.js\";\nimport {\n FunctionMessage,\n FunctionMessageChunk,\n FunctionMessageFields,\n} from \"./function.js\";\nimport { HumanMessage, HumanMessageChunk } from \"./human.js\";\nimport { RemoveMessage } from \"./modifier.js\";\nimport { SystemMessage, SystemMessageChunk } from \"./system.js\";\nimport {\n InvalidToolCall,\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n ToolMessageFields,\n} from \"./tool.js\";\n\nexport type $Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\n/**\n * Provider streaming marker for raw (non-JSON) tool input.\n * Not part of the public {@link ToolCallChunk} type; integrations may attach\n * `isCustomTool` at runtime and pass chunks typed as this alias.\n */\nexport type RawInputToolCallChunk = ToolCallChunk & { isCustomTool?: boolean };\n\nfunction chunkUsesRawInputArgs(chunk: ToolCallChunk): boolean {\n return (chunk as RawInputToolCallChunk).isCustomTool === true;\n}\n\n/**\n * Extracts the explicitly declared keys from a type T.\n *\n * @template T - The type to extract keys from\n * @returns A union of keys that are not string, number, or symbol\n */\ntype $KnownKeys<T> = {\n [K in keyof T]: string extends K\n ? never\n : number extends K\n ? never\n : symbol extends K\n ? never\n : K;\n}[keyof T];\n\n/**\n * Detects if T has an index signature.\n *\n * @template T - The type to check for index signatures\n * @returns True if T has an index signature, false otherwise\n */\ntype $HasIndexSignature<T> = string extends keyof T\n ? true\n : number extends keyof T\n ? true\n : symbol extends keyof T\n ? true\n : false;\n\n/**\n * Detects if T has an index signature and no known keys.\n *\n * @template T - The type to check for index signatures and no known keys\n * @returns True if T has an index signature and no known keys, false otherwise\n */\ntype $OnlyIndexSignatures<T> =\n $HasIndexSignature<T> extends true\n ? [$KnownKeys<T>] extends [never]\n ? true\n : false\n : false;\n\n/**\n * Recursively merges two object types T and U, with U taking precedence over T.\n *\n * This utility type performs a deep merge of two object types:\n * - For keys that exist in both T and U:\n * - If both values are objects (Record<string, unknown>), recursively merge them\n * - Otherwise, U's value takes precedence\n * - For keys that exist only in T, use T's value\n * - For keys that exist only in U, use U's value\n *\n * @template T - The first object type to merge\n * @template U - The second object type to merge (takes precedence over T)\n *\n * @example\n * ```ts\n * type ObjectA = {\n * shared: { a: string; b: number };\n * onlyInA: boolean;\n * };\n *\n * type ObjectB = {\n * shared: { b: string; c: Date };\n * onlyInB: symbol;\n * };\n *\n * type Merged = $MergeObjects<ObjectA, ObjectB>;\n * // Result: {\n * // shared: { a: string; b: string; c: Date };\n * // onlyInA: boolean;\n * // onlyInB: symbol;\n * // }\n * ```\n */\nexport type $MergeObjects<T, U> =\n // If U is purely index-signature based, prefer U as a whole\n $OnlyIndexSignatures<U> extends true\n ? U\n : // If T is purely index-signature based, prefer U as a whole (prevents leaking broad index signatures)\n $OnlyIndexSignatures<T> extends true\n ? U\n : {\n [K in keyof T | keyof U]: K extends keyof T\n ? K extends keyof U\n ? T[K] extends Record<string, unknown>\n ? U[K] extends Record<string, unknown>\n ? $MergeObjects<T[K], U[K]>\n : U[K]\n : U[K]\n : T[K]\n : K extends keyof U\n ? U[K]\n : never;\n };\n\n/**\n * Merges two discriminated unions A and B based on a discriminator key (defaults to \"type\").\n * For each possible value of the discriminator across both unions:\n * - If B has a member with that discriminator value, use B's member\n * - Otherwise use A's member with that discriminator value\n * This effectively merges the unions while giving B's members precedence over A's members.\n *\n * @template A - First discriminated union type that extends Record<Key, PropertyKey>\n * @template B - Second discriminated union type that extends Record<Key, PropertyKey>\n * @template Key - The discriminator key property, defaults to \"type\"\n */\nexport type $MergeDiscriminatedUnion<\n A extends Record<Key, PropertyKey>,\n B extends Record<Key, PropertyKey>,\n Key extends PropertyKey = \"type\",\n> = {\n // Create a mapped type over all possible discriminator values from both A and B\n [T in A[Key] | B[Key]]: [Extract<B, Record<Key, T>>] extends [never] // Check if B has a member with this discriminator value\n ? // If B doesn't have this discriminator value, use A's member\n Extract<A, Record<Key, T>>\n : // If B does have this discriminator value, merge A's and B's members (B takes precedence)\n [Extract<A, Record<Key, T>>] extends [never]\n ? Extract<B, Record<Key, T>>\n : $MergeObjects<Extract<A, Record<Key, T>>, Extract<B, Record<Key, T>>>;\n // Index into the mapped type with all possible discriminator values\n // This converts the mapped type back into a union\n}[A[Key] | B[Key]];\n\nexport type Constructor<T> = new (...args: unknown[]) => T;\n\n/**\n * Immediately-invoked function expression.\n *\n * @param fn - The function to execute\n * @returns The result of the function\n */\nexport const iife = <T>(fn: () => T) => fn();\n\nfunction _coerceToolCall(\n toolCall: ToolCall | Record<string, unknown>\n): ToolCall {\n if (_isToolCall(toolCall)) {\n return toolCall;\n } else if (\n typeof toolCall.id === \"string\" &&\n toolCall.type === \"function\" &&\n typeof toolCall.function === \"object\" &&\n toolCall.function !== null &&\n \"arguments\" in toolCall.function &&\n typeof toolCall.function.arguments === \"string\" &&\n \"name\" in toolCall.function &&\n typeof toolCall.function.name === \"string\"\n ) {\n // Handle OpenAI tool call format\n return {\n id: toolCall.id,\n args: JSON.parse(toolCall.function.arguments),\n name: toolCall.function.name,\n type: \"tool_call\",\n };\n } else {\n // TODO: Throw an error?\n return toolCall as unknown as ToolCall;\n }\n}\n\nfunction isSerializedConstructor(x: unknown): x is SerializedConstructor {\n return (\n typeof x === \"object\" &&\n x != null &&\n (x as SerializedConstructor).lc === 1 &&\n Array.isArray((x as SerializedConstructor).id) &&\n (x as SerializedConstructor).kwargs != null &&\n typeof (x as SerializedConstructor).kwargs === \"object\"\n );\n}\n\nfunction _constructMessageFromParams(\n params:\n | (BaseMessageFields & { type: string } & Record<string, unknown>)\n | SerializedConstructor\n) {\n let type: string;\n let rest: BaseMessageFields & Record<string, unknown>;\n // Support serialized messages\n if (isSerializedConstructor(params)) {\n const className = params.id.at(-1);\n if (className === \"HumanMessage\" || className === \"HumanMessageChunk\") {\n type = \"user\";\n } else if (className === \"AIMessage\" || className === \"AIMessageChunk\") {\n type = \"assistant\";\n } else if (\n className === \"SystemMessage\" ||\n className === \"SystemMessageChunk\"\n ) {\n type = \"system\";\n } else if (\n className === \"FunctionMessage\" ||\n className === \"FunctionMessageChunk\"\n ) {\n type = \"function\";\n } else if (\n className === \"ToolMessage\" ||\n className === \"ToolMessageChunk\"\n ) {\n type = \"tool\";\n } else {\n type = \"unknown\";\n }\n rest = params.kwargs as BaseMessageFields;\n } else {\n const { type: extractedType, ...otherParams } = params;\n type = extractedType;\n rest = otherParams;\n }\n if (type === \"human\" || type === \"user\") {\n return new HumanMessage(rest);\n } else if (type === \"ai\" || type === \"assistant\") {\n const { tool_calls: rawToolCalls, ...other } = rest;\n if (!Array.isArray(rawToolCalls)) {\n return new AIMessage(rest);\n }\n const tool_calls = rawToolCalls.map(_coerceToolCall);\n return new AIMessage({ ...other, tool_calls });\n } else if (type === \"system\") {\n return new SystemMessage(rest);\n } else if (type === \"developer\") {\n return new SystemMessage({\n ...rest,\n additional_kwargs: {\n ...rest.additional_kwargs,\n __openai_role__: \"developer\",\n },\n });\n } else if (type === \"tool\" && \"tool_call_id\" in rest) {\n return new ToolMessage({\n ...rest,\n content: rest.content,\n tool_call_id: rest.tool_call_id as string,\n name: rest.name,\n });\n } else if (type === \"remove\" && \"id\" in rest && typeof rest.id === \"string\") {\n return new RemoveMessage({ ...rest, id: rest.id });\n } else {\n const error = addLangChainErrorFields(\n new Error(\n `Unable to coerce message from array: only human, AI, system, developer, or tool message coercion is currently supported.\\n\\nReceived: ${JSON.stringify(\n params,\n null,\n 2\n )}`\n ),\n \"MESSAGE_COERCION_FAILURE\"\n );\n throw error;\n }\n}\n\nexport function coerceMessageLikeToMessage(\n messageLike: BaseMessageLike\n): BaseMessage {\n if (typeof messageLike === \"string\") {\n return new HumanMessage(messageLike);\n } else if (isBaseMessage(messageLike)) {\n return messageLike;\n }\n if (Array.isArray(messageLike)) {\n const [type, content] = messageLike;\n return _constructMessageFromParams({ type, content });\n } else if (_isMessageFieldWithRole(messageLike)) {\n const { role: type, ...rest } = messageLike;\n return _constructMessageFromParams({ ...rest, type });\n } else {\n return _constructMessageFromParams(messageLike);\n }\n}\n\n/**\n * Renders a single content block to a compact string representation.\n * Text blocks are returned as-is; multimodal blocks (image, audio, video, file)\n * become short placeholders like `[image]` so their existence is preserved\n * without inflating token counts with base64 data or metadata.\n */\nfunction _contentBlockToString(\n block: string | { type?: string; [key: string]: unknown }\n): string {\n if (typeof block === \"string\") return block;\n switch (block.type) {\n case \"text\":\n return (block as { text: string }).text ?? \"\";\n case \"text-plain\":\n return (block as { text?: string }).text ?? \"[text-plain file]\";\n case \"image\":\n case \"image_url\":\n return \"[image]\";\n case \"audio\":\n case \"input_audio\":\n return \"[audio]\";\n case \"video\":\n return \"[video]\";\n case \"file\":\n return \"[file]\";\n case \"reasoning\":\n case \"tool_call\":\n case \"tool_call_chunk\":\n case \"invalid_tool_call\":\n case \"server_tool_call\":\n case \"server_tool_call_chunk\":\n case \"server_tool_call_result\":\n case \"non_standard\":\n return \"\";\n default:\n return block.type ? `[${block.type}]` : \"\";\n }\n}\n\nconst TOOL_CALL_ID_DISPLAY_LIMIT = 64;\n\n/**\n * This function is used by memory classes to get a string representation\n * of the chat message history, based on the message content and role.\n *\n * Produces compact output like:\n * ```\n * Human: What's the weather?\n * AI: Let me check...[tool_calls]\n * Tool: 72°F and sunny\n * ```\n *\n * This avoids token inflation from metadata when stringifying message objects directly.\n * Tool-call IDs longer than 64 characters are shortened only in the rendered string.\n */\nexport function getBufferString(\n messages: BaseMessage[],\n humanPrefix = \"Human\",\n aiPrefix = \"AI\"\n): string {\n const string_messages: string[] = [];\n for (const m of messages) {\n let role: string;\n if (m.type === \"human\") {\n role = humanPrefix;\n } else if (m.type === \"ai\") {\n role = aiPrefix;\n } else if (m.type === \"system\") {\n role = \"System\";\n } else if (m.type === \"tool\") {\n role = \"Tool\";\n } else if (m.type === \"generic\") {\n role = (m as ChatMessage).role;\n } else {\n throw new Error(`Got unsupported message type: ${m.type}`);\n }\n const nameStr = m.name ? `${m.name}, ` : \"\";\n\n // Render content compactly: text as-is, multimodal blocks as placeholders\n const readableContent =\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map(_contentBlockToString).filter(Boolean).join(\"\")\n : \"\";\n\n let message = `${role}: ${nameStr}${readableContent}`;\n\n // Include tool calls for AI messages (matching Python's get_buffer_string behavior)\n if (m.type === \"ai\") {\n const aiMessage = m as AIMessage;\n if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) {\n const toolCalls = aiMessage.tool_calls;\n message += JSON.stringify(\n toolCalls.some(\n (call) => (call.id?.length ?? 0) > TOOL_CALL_ID_DISPLAY_LIMIT\n )\n ? toolCalls.map((call) =>\n call.id && call.id.length > TOOL_CALL_ID_DISPLAY_LIMIT\n ? {\n ...call,\n id: `${call.id.slice(0, TOOL_CALL_ID_DISPLAY_LIMIT)}...`,\n }\n : call\n )\n : toolCalls\n );\n } else if (\n aiMessage.additional_kwargs &&\n \"function_call\" in aiMessage.additional_kwargs\n ) {\n // Legacy behavior assumes only one function call per message\n message += JSON.stringify(aiMessage.additional_kwargs.function_call);\n }\n }\n\n string_messages.push(message);\n }\n return string_messages.join(\"\\n\");\n}\n\n/**\n * Maps messages from an older format (V1) to the current `StoredMessage`\n * format. If the message is already in the `StoredMessage` format, it is\n * returned as is. Otherwise, it transforms the V1 message into a\n * `StoredMessage`. This function is important for maintaining\n * compatibility with older message formats.\n */\nfunction mapV1MessageToStoredMessage(\n message: StoredMessage | StoredMessageV1\n): StoredMessage {\n // TODO: Remove this mapper when we deprecate the old message format.\n if ((message as StoredMessage).data !== undefined) {\n return message as StoredMessage;\n } else {\n const v1Message = message as StoredMessageV1;\n return {\n type: v1Message.type,\n data: {\n content: v1Message.text,\n role: v1Message.role,\n name: undefined,\n tool_call_id: undefined,\n },\n };\n }\n}\n\nexport function mapStoredMessageToChatMessage(message: StoredMessage) {\n const storedMessage = mapV1MessageToStoredMessage(message);\n switch (storedMessage.type) {\n case \"human\":\n return new HumanMessage(storedMessage.data);\n case \"ai\":\n return new AIMessage(storedMessage.data);\n case \"system\":\n return new SystemMessage(storedMessage.data);\n case \"function\":\n if (storedMessage.data.name === undefined) {\n throw new Error(\"Name must be defined for function messages\");\n }\n return new FunctionMessage(storedMessage.data as FunctionMessageFields);\n case \"tool\":\n if (storedMessage.data.tool_call_id === undefined) {\n throw new Error(\"Tool call ID must be defined for tool messages\");\n }\n return new ToolMessage(storedMessage.data as ToolMessageFields);\n case \"generic\": {\n if (storedMessage.data.role === undefined) {\n throw new Error(\"Role must be defined for chat messages\");\n }\n return new ChatMessage(storedMessage.data as ChatMessageFields);\n }\n default:\n throw new Error(`Got unexpected type: ${storedMessage.type}`);\n }\n}\n\n/**\n * Transforms an array of `StoredMessage` instances into an array of\n * `BaseMessage` instances. It uses the `mapV1MessageToStoredMessage`\n * function to ensure all messages are in the `StoredMessage` format, then\n * creates new instances of the appropriate `BaseMessage` subclass based\n * on the type of each message. This function is used to prepare stored\n * messages for use in a chat context.\n */\nexport function mapStoredMessagesToChatMessages(\n messages: StoredMessage[]\n): BaseMessage[] {\n return messages.map(mapStoredMessageToChatMessage);\n}\n\n/**\n * Transforms an array of `BaseMessage` instances into an array of\n * `StoredMessage` instances. It does this by calling the `toDict` method\n * on each `BaseMessage`, which returns a `StoredMessage`. This function\n * is used to prepare chat messages for storage.\n */\nexport function mapChatMessagesToStoredMessages(\n messages: BaseMessage[]\n): StoredMessage[] {\n return messages.map((message) => message.toDict());\n}\n\nexport function convertToChunk(message: BaseMessage) {\n const type = message._getType();\n if (type === \"human\") {\n return new HumanMessageChunk({ ...message });\n } else if (type === \"ai\") {\n let aiChunkFields: AIMessageChunkFields = {\n ...message,\n };\n if (\"tool_calls\" in aiChunkFields) {\n aiChunkFields = {\n ...aiChunkFields,\n tool_call_chunks: aiChunkFields.tool_calls?.map((tc) => ({\n ...tc,\n type: \"tool_call_chunk\",\n index: undefined,\n args: JSON.stringify(tc.args),\n })),\n };\n }\n return new AIMessageChunk({ ...aiChunkFields });\n } else if (type === \"system\") {\n return new SystemMessageChunk({ ...message });\n } else if (type === \"function\") {\n return new FunctionMessageChunk({ ...message });\n } else if (ChatMessage.isInstance(message)) {\n return new ChatMessageChunk({ ...message });\n } else {\n throw new Error(\"Unknown message type.\");\n }\n}\n\n/**\n * Collapses an array of tool call chunks into complete tool calls.\n *\n * This function groups tool call chunks by their id and/or index, then attempts to\n * parse and validate the accumulated arguments for each group. Successfully parsed\n * tool calls are returned as valid `ToolCall` objects, while malformed ones are\n * returned as `InvalidToolCall` objects.\n *\n * @param chunks - An array of `ToolCallChunk` objects to collapse\n * @returns An object containing:\n * - `tool_call_chunks`: The original input chunks\n * - `tool_calls`: An array of successfully parsed and validated tool calls\n * - `invalid_tool_calls`: An array of tool calls that failed parsing or validation\n *\n * @remarks\n * Chunks are grouped using the following matching logic:\n * - If a chunk has both an id and index, it matches chunks with the same id and index\n * - If a chunk has only an id, it matches chunks with the same id\n * - If a chunk has only an index, it matches chunks with the same index\n *\n * For each group, the function:\n * 1. Concatenates all `args` strings from the chunks\n * 2. Attempts to parse the concatenated string as JSON\n * 3. Validates that the result is a non-null object with a valid id\n * 4. Creates either a `ToolCall` (if valid) or `InvalidToolCall` (if invalid)\n */\nexport function collapseToolCallChunks(chunks: ToolCallChunk[]): {\n tool_call_chunks: ToolCallChunk[];\n tool_calls: ToolCall[];\n invalid_tool_calls: InvalidToolCall[];\n} {\n const groupedToolCallChunks = chunks.reduce((acc, chunk) => {\n const matchedChunkIndex = acc.findIndex(([match]) => {\n // If chunk has an id and index, match if both are present\n if (\n \"id\" in chunk &&\n chunk.id &&\n \"index\" in chunk &&\n chunk.index !== undefined\n ) {\n return chunk.id === match.id && chunk.index === match.index;\n }\n // If chunk has an id, we match on id\n if (\"id\" in chunk && chunk.id) {\n return chunk.id === match.id;\n }\n // If chunk has an index, we match on index\n if (\"index\" in chunk && chunk.index !== undefined) {\n return chunk.index === match.index;\n }\n return false;\n });\n if (matchedChunkIndex !== -1) {\n acc[matchedChunkIndex].push(chunk);\n } else {\n acc.push([chunk]);\n }\n return acc;\n }, [] as ToolCallChunk[][]);\n\n const toolCalls: ToolCall[] = [];\n const invalidToolCalls: InvalidToolCall[] = [];\n for (const chunks of groupedToolCallChunks) {\n let parsedArgs: Record<string, unknown> | null = null;\n const usesRawInputArgs = chunks.some(chunkUsesRawInputArgs);\n const name = chunks[0]?.name ?? \"\";\n const joinedArgsRaw = chunks.map((c) => c.args || \"\").join(\"\");\n const joinedArgs = usesRawInputArgs ? joinedArgsRaw : joinedArgsRaw.trim();\n const argsStr = joinedArgs.length ? joinedArgs : \"{}\";\n const id = chunks.find((c) => c.id)?.id ?? chunks[0]?.id;\n if (usesRawInputArgs && id) {\n toolCalls.push({\n name,\n args: { input: joinedArgs },\n id,\n type: \"tool_call\",\n });\n continue;\n }\n try {\n parsedArgs = parsePartialJson(argsStr);\n if (\n !id ||\n parsedArgs === null ||\n typeof parsedArgs !== \"object\" ||\n Array.isArray(parsedArgs)\n ) {\n throw new Error(\"Malformed tool call chunk args.\");\n }\n toolCalls.push({\n name,\n args: parsedArgs,\n id,\n type: \"tool_call\",\n });\n } catch {\n invalidToolCalls.push({\n name,\n args: argsStr,\n id,\n error: \"Malformed args.\",\n type: \"invalid_tool_call\",\n });\n }\n }\n return {\n tool_call_chunks: chunks,\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n };\n}\n"],"mappings":"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"}
@@ -104,6 +104,7 @@ declare function coerceMessageLikeToMessage(messageLike: BaseMessageLike): BaseM
104
104
  * ```
105
105
  *
106
106
  * This avoids token inflation from metadata when stringifying message objects directly.
107
+ * Tool-call IDs longer than 64 characters are shortened only in the rendered string.
107
108
  */
108
109
  declare function getBufferString(messages: BaseMessage[], humanPrefix?: string, aiPrefix?: string): string;
109
110
  declare function mapStoredMessageToChatMessage(message: StoredMessage): AIMessage<MessageStructure<MessageToolSet>> | ChatMessage<MessageStructure<MessageToolSet>> | FunctionMessage<MessageStructure<MessageToolSet>> | HumanMessage<MessageStructure<MessageToolSet>> | SystemMessage<MessageStructure<MessageToolSet>> | ToolMessage<MessageStructure<MessageToolSet>>;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.cts","names":[],"sources":["../../src/messages/utils.ts"],"mappings":";;;;;;;;;KA+BY,QAAQ,KAAK,iBAAgB,QAAO,WAAW,IAAI,EAAE;;;;;;KAOrD,wBAAwB;EAAkB;;;;;;;;KAYjD,WAAW,QACb,WAAW,mBAAmB,2BAEZ,2BAEE,YAEb,WACF;;;;;;;KAQH,mBAAmB,0BAA0B,gCAEzB,gCAEE;;;;;;;KAUtB,qBAAqB,KACxB,mBAAmB,mBACd,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCN,cAAc,GAAG,KAE3B,qBAAqB,kBACjB,IAEA,qBAAqB,kBACnB,OAEG,WAAW,UAAU,IAAI,gBAAgB,IACtC,gBAAgB,IACd,EAAE,WAAW,0BACX,EAAE,WAAW,0BACX,cAAc,EAAE,IAAI,EAAE,MACtB,EAAE,KACJ,EAAE,KACJ,EAAE,KACJ,gBAAgB,IACd,EAAE;;;;;;;;;;;;KAeN,yBACV,UAAU,OAAO,KAAK,cACtB,UAAU,OAAO,KAAK,cACtB,YAAY,2BAGX,KAAK,EAAE,OAAO,EAAE,QAAQ,QAAQ,GAAG,OAAO,KAAK,uBAE5C,QAAQ,GAAG,OAAO,KAAK,OAEtB,QAAQ,GAAG,OAAO,KAAK,uBACtB,QAAQ,GAAG,OAAO,KAAK,MACvB,cAAc,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,QAGvE,EAAE,OAAO,EAAE;KAED,YAAY,aAAa,oBAAoB;;;;;;;cAQ5C,OAAQ,GAAC,UAAY,MAAC;iBA0HnB,2BACd,aAAa,kBACZ;;;;;;;;;;;;;;iBAqEa,gBACd,UAAU,eACV,sBACA;iBA4Ec,8BAA8B,SAAS,gBAAa,UAAA,iBAAb,mBAAa,YAAA,iBAAA,mBAAA,gBAAA,iBAAA,mBAAA,aAAA,iBAAA,mBAAA,cAAA,iBAAA,mBAAA,YAAA,iBAAA;;;;;;;;;iBAsCpD,gCACd,UAAU,kBACT;;;;;;;iBAUa,gCACd,UAAU,gBACT;iBAIa,eAAe,SAAS,cAAW,eAAA,iBAAX,mBAAW,iBAAA,iBAAA,mBAAA,qBAAA,iBAAA,mBAAA,kBAAA,iBAAA,mBAAA,mBAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyDnC,uBAAuB,QAAQ;EAC7C,kBAAkB;EAClB,YAAY;EACZ,oBAAoB"}
1
+ {"version":3,"file":"utils.d.cts","names":[],"sources":["../../src/messages/utils.ts"],"mappings":";;;;;;;;;KA+BY,QAAQ,KAAK,iBAAgB,QAAO,WAAW,IAAI,EAAE;;;;;;KAOrD,wBAAwB;EAAkB;;;;;;;;KAYjD,WAAW,QACb,WAAW,mBAAmB,2BAEZ,2BAEE,YAEb,WACF;;;;;;;KAQH,mBAAmB,0BAA0B,gCAEzB,gCAEE;;;;;;;KAUtB,qBAAqB,KACxB,mBAAmB,mBACd,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCN,cAAc,GAAG,KAE3B,qBAAqB,kBACjB,IAEA,qBAAqB,kBACnB,OAEG,WAAW,UAAU,IAAI,gBAAgB,IACtC,gBAAgB,IACd,EAAE,WAAW,0BACX,EAAE,WAAW,0BACX,cAAc,EAAE,IAAI,EAAE,MACtB,EAAE,KACJ,EAAE,KACJ,EAAE,KACJ,gBAAgB,IACd,EAAE;;;;;;;;;;;;KAeN,yBACV,UAAU,OAAO,KAAK,cACtB,UAAU,OAAO,KAAK,cACtB,YAAY,2BAGX,KAAK,EAAE,OAAO,EAAE,QAAQ,QAAQ,GAAG,OAAO,KAAK,uBAE5C,QAAQ,GAAG,OAAO,KAAK,OAEtB,QAAQ,GAAG,OAAO,KAAK,uBACtB,QAAQ,GAAG,OAAO,KAAK,MACvB,cAAc,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,QAGvE,EAAE,OAAO,EAAE;KAED,YAAY,aAAa,oBAAoB;;;;;;;cAQ5C,OAAQ,GAAC,UAAY,MAAC;iBA0HnB,2BACd,aAAa,kBACZ;;;;;;;;;;;;;;;iBAwEa,gBACd,UAAU,eACV,sBACA;iBA0Fc,8BAA8B,SAAS,gBAAa,UAAA,iBAAb,mBAAa,YAAA,iBAAA,mBAAA,gBAAA,iBAAA,mBAAA,aAAA,iBAAA,mBAAA,cAAA,iBAAA,mBAAA,YAAA,iBAAA;;;;;;;;;iBAsCpD,gCACd,UAAU,kBACT;;;;;;;iBAUa,gCACd,UAAU,gBACT;iBAIa,eAAe,SAAS,cAAW,eAAA,iBAAX,mBAAW,iBAAA,iBAAA,mBAAA,qBAAA,iBAAA,mBAAA,kBAAA,iBAAA,mBAAA,mBAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyDnC,uBAAuB,QAAQ;EAC7C,kBAAkB;EAClB,YAAY;EACZ,oBAAoB"}
@@ -104,6 +104,7 @@ declare function coerceMessageLikeToMessage(messageLike: BaseMessageLike): BaseM
104
104
  * ```
105
105
  *
106
106
  * This avoids token inflation from metadata when stringifying message objects directly.
107
+ * Tool-call IDs longer than 64 characters are shortened only in the rendered string.
107
108
  */
108
109
  declare function getBufferString(messages: BaseMessage[], humanPrefix?: string, aiPrefix?: string): string;
109
110
  declare function mapStoredMessageToChatMessage(message: StoredMessage): AIMessage<MessageStructure<MessageToolSet>> | ChatMessage<MessageStructure<MessageToolSet>> | FunctionMessage<MessageStructure<MessageToolSet>> | HumanMessage<MessageStructure<MessageToolSet>> | SystemMessage<MessageStructure<MessageToolSet>> | ToolMessage<MessageStructure<MessageToolSet>>;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/messages/utils.ts"],"mappings":";;;;;;;;;KA+BY,QAAQ,KAAK,iBAAgB,QAAO,WAAW,IAAI,EAAE;;;;;;KAOrD,wBAAwB;EAAkB;;;;;;;;KAYjD,WAAW,QACb,WAAW,mBAAmB,2BAEZ,2BAEE,YAEb,WACF;;;;;;;KAQH,mBAAmB,0BAA0B,gCAEzB,gCAEE;;;;;;;KAUtB,qBAAqB,KACxB,mBAAmB,mBACd,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCN,cAAc,GAAG,KAE3B,qBAAqB,kBACjB,IAEA,qBAAqB,kBACnB,OAEG,WAAW,UAAU,IAAI,gBAAgB,IACtC,gBAAgB,IACd,EAAE,WAAW,0BACX,EAAE,WAAW,0BACX,cAAc,EAAE,IAAI,EAAE,MACtB,EAAE,KACJ,EAAE,KACJ,EAAE,KACJ,gBAAgB,IACd,EAAE;;;;;;;;;;;;KAeN,yBACV,UAAU,OAAO,KAAK,cACtB,UAAU,OAAO,KAAK,cACtB,YAAY,2BAGX,KAAK,EAAE,OAAO,EAAE,QAAQ,QAAQ,GAAG,OAAO,KAAK,uBAE5C,QAAQ,GAAG,OAAO,KAAK,OAEtB,QAAQ,GAAG,OAAO,KAAK,uBACtB,QAAQ,GAAG,OAAO,KAAK,MACvB,cAAc,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,QAGvE,EAAE,OAAO,EAAE;KAED,YAAY,aAAa,oBAAoB;;;;;;;cAQ5C,OAAQ,GAAC,UAAY,MAAC;iBA0HnB,2BACd,aAAa,kBACZ;;;;;;;;;;;;;;iBAqEa,gBACd,UAAU,eACV,sBACA;iBA4Ec,8BAA8B,SAAS,gBAAa,UAAA,iBAAb,mBAAa,YAAA,iBAAA,mBAAA,gBAAA,iBAAA,mBAAA,aAAA,iBAAA,mBAAA,cAAA,iBAAA,mBAAA,YAAA,iBAAA;;;;;;;;;iBAsCpD,gCACd,UAAU,kBACT;;;;;;;iBAUa,gCACd,UAAU,gBACT;iBAIa,eAAe,SAAS,cAAW,eAAA,iBAAX,mBAAW,iBAAA,iBAAA,mBAAA,qBAAA,iBAAA,mBAAA,kBAAA,iBAAA,mBAAA,mBAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyDnC,uBAAuB,QAAQ;EAC7C,kBAAkB;EAClB,YAAY;EACZ,oBAAoB"}
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/messages/utils.ts"],"mappings":";;;;;;;;;KA+BY,QAAQ,KAAK,iBAAgB,QAAO,WAAW,IAAI,EAAE;;;;;;KAOrD,wBAAwB;EAAkB;;;;;;;;KAYjD,WAAW,QACb,WAAW,mBAAmB,2BAEZ,2BAEE,YAEb,WACF;;;;;;;KAQH,mBAAmB,0BAA0B,gCAEzB,gCAEE;;;;;;;KAUtB,qBAAqB,KACxB,mBAAmB,mBACd,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCN,cAAc,GAAG,KAE3B,qBAAqB,kBACjB,IAEA,qBAAqB,kBACnB,OAEG,WAAW,UAAU,IAAI,gBAAgB,IACtC,gBAAgB,IACd,EAAE,WAAW,0BACX,EAAE,WAAW,0BACX,cAAc,EAAE,IAAI,EAAE,MACtB,EAAE,KACJ,EAAE,KACJ,EAAE,KACJ,gBAAgB,IACd,EAAE;;;;;;;;;;;;KAeN,yBACV,UAAU,OAAO,KAAK,cACtB,UAAU,OAAO,KAAK,cACtB,YAAY,2BAGX,KAAK,EAAE,OAAO,EAAE,QAAQ,QAAQ,GAAG,OAAO,KAAK,uBAE5C,QAAQ,GAAG,OAAO,KAAK,OAEtB,QAAQ,GAAG,OAAO,KAAK,uBACtB,QAAQ,GAAG,OAAO,KAAK,MACvB,cAAc,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,QAGvE,EAAE,OAAO,EAAE;KAED,YAAY,aAAa,oBAAoB;;;;;;;cAQ5C,OAAQ,GAAC,UAAY,MAAC;iBA0HnB,2BACd,aAAa,kBACZ;;;;;;;;;;;;;;;iBAwEa,gBACd,UAAU,eACV,sBACA;iBA0Fc,8BAA8B,SAAS,gBAAa,UAAA,iBAAb,mBAAa,YAAA,iBAAA,mBAAA,gBAAA,iBAAA,mBAAA,aAAA,iBAAA,mBAAA,cAAA,iBAAA,mBAAA,YAAA,iBAAA;;;;;;;;;iBAsCpD,gCACd,UAAU,kBACT;;;;;;;iBAUa,gCACd,UAAU,gBACT;iBAIa,eAAe,SAAS,cAAW,eAAA,iBAAX,mBAAW,iBAAA,iBAAA,mBAAA,qBAAA,iBAAA,mBAAA,kBAAA,iBAAA,mBAAA,mBAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyDnC,uBAAuB,QAAQ;EAC7C,kBAAkB;EAClB,YAAY;EACZ,oBAAoB"}
@@ -124,6 +124,7 @@ function _contentBlockToString(block) {
124
124
  default: return block.type ? `[${block.type}]` : "";
125
125
  }
126
126
  }
127
+ const TOOL_CALL_ID_DISPLAY_LIMIT = 64;
127
128
  /**
128
129
  * This function is used by memory classes to get a string representation
129
130
  * of the chat message history, based on the message content and role.
@@ -136,6 +137,7 @@ function _contentBlockToString(block) {
136
137
  * ```
137
138
  *
138
139
  * This avoids token inflation from metadata when stringifying message objects directly.
140
+ * Tool-call IDs longer than 64 characters are shortened only in the rendered string.
139
141
  */
140
142
  function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
141
143
  const string_messages = [];
@@ -152,8 +154,13 @@ function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
152
154
  let message = `${role}: ${nameStr}${readableContent}`;
153
155
  if (m.type === "ai") {
154
156
  const aiMessage = m;
155
- if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) message += JSON.stringify(aiMessage.tool_calls);
156
- else if (aiMessage.additional_kwargs && "function_call" in aiMessage.additional_kwargs) message += JSON.stringify(aiMessage.additional_kwargs.function_call);
157
+ if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) {
158
+ const toolCalls = aiMessage.tool_calls;
159
+ message += JSON.stringify(toolCalls.some((call) => (call.id?.length ?? 0) > TOOL_CALL_ID_DISPLAY_LIMIT) ? toolCalls.map((call) => call.id && call.id.length > TOOL_CALL_ID_DISPLAY_LIMIT ? {
160
+ ...call,
161
+ id: `${call.id.slice(0, TOOL_CALL_ID_DISPLAY_LIMIT)}...`
162
+ } : call) : toolCalls);
163
+ } else if (aiMessage.additional_kwargs && "function_call" in aiMessage.additional_kwargs) message += JSON.stringify(aiMessage.additional_kwargs.function_call);
157
164
  }
158
165
  string_messages.push(message);
159
166
  }