@langchain/core 1.1.35 → 1.1.36

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @langchain/core
2
2
 
3
+ ## 1.1.36
4
+
5
+ ### Patch Changes
6
+
7
+ - [#10512](https://github.com/langchain-ai/langchainjs/pull/10512) [`bbbfea1`](https://github.com/langchain-ai/langchainjs/commit/bbbfea185c0777ae06df2b24a1a84f941d499c2a) Thanks [@hntrl](https://github.com/hntrl)! - fix(core): fix streaming chunk merge for providers without `index` on tool call deltas
8
+
9
+ `_mergeLists` now falls back to `id`-based matching when items don't have an `index` field. Previously, providers routing through the OpenAI-compatible API without `index` on streaming tool call deltas (e.g. Anthropic models via `ChatOpenAI`) would accumulate hundreds of individual raw deltas in `tool_call_chunks` and `additional_kwargs.tool_calls` instead of merging them into a single entry per tool call. In a real trace with 3 concurrent subagents, this caused a single AI message to balloon from ~4KB to 146KB -- with 826 uncollapsed streaming fragments carrying a few bytes each.
10
+
11
+ Also fixes `SystemMessage.concat()` which used `...this` to spread all instance properties (including `lc_kwargs`) into the new constructor, causing each chained `concat()` call to nest one level deeper. After 7 middleware `concat()` calls (typical in deepagents), a 7KB system prompt would serialize to 81KB due to content being duplicated at every nesting level.
12
+
3
13
  ## 1.1.35
4
14
 
5
15
  ### Patch Changes
@@ -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.1.35");
142
+ this._addVersion("@langchain/core", "1.1.36");
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.1.35");
141
+ this._addVersion("@langchain/core", "1.1.36");
142
142
  }
143
143
  _addVersion(pkg, version) {
144
144
  const existing = this.metadata?.versions;
@@ -232,24 +232,48 @@ function hasMergeableIndex(value) {
232
232
  if (!("index" in value)) return false;
233
233
  return isMergeableIndex(value.index);
234
234
  }
235
+ function hasMergeableId(value) {
236
+ if (typeof value !== "object" || value === null) return false;
237
+ if (!("id" in value)) return false;
238
+ const id = value.id;
239
+ return id != null && id !== "";
240
+ }
241
+ /**
242
+ * Find the index of an existing item in `merged` that should be merged with
243
+ * `item`, based on index and/or id matching.
244
+ *
245
+ * Matching priority:
246
+ * 1. Both have index → match on index (+ id when both present)
247
+ * 2. Neither has index, both have id → match on id alone
248
+ * 3. Otherwise → no match (item should be appended)
249
+ */
250
+ function _findMergeTarget(merged, item) {
251
+ const itemHasIndex = hasMergeableIndex(item);
252
+ const itemHasId = hasMergeableId(item);
253
+ if (!itemHasIndex && !itemHasId) return -1;
254
+ return merged.findIndex((leftItem) => {
255
+ const leftHasIndex = hasMergeableIndex(leftItem);
256
+ const leftHasId = hasMergeableId(leftItem);
257
+ if (itemHasIndex && leftHasIndex) {
258
+ if (!(leftItem.index === item.index)) return false;
259
+ if (leftHasId && itemHasId) return leftItem.id === item.id;
260
+ return true;
261
+ }
262
+ if (!itemHasIndex && !leftHasIndex && itemHasId && leftHasId) return leftItem.id === item.id;
263
+ return false;
264
+ });
265
+ }
235
266
  function _mergeLists(left, right, options) {
236
267
  if (left == null && right == null) return;
237
268
  else if (left == null || right == null) return left || right;
238
269
  else {
239
270
  const merged = [...left];
240
- for (const item of right) if (hasMergeableIndex(item)) {
241
- const toMerge = merged.findIndex((leftItem) => {
242
- if (!hasMergeableIndex(leftItem)) return false;
243
- const indiciesMatch = leftItem.index === item.index;
244
- const leftHasId = leftItem.id != null && leftItem.id !== "";
245
- const rightHasId = item.id != null && item.id !== "";
246
- const idsMatch = leftHasId && rightHasId && leftItem.id === item.id;
247
- return indiciesMatch && (idsMatch || !leftHasId || !rightHasId);
248
- });
249
- if (toMerge !== -1 && typeof merged[toMerge] === "object" && merged[toMerge] !== null) merged[toMerge] = _mergeDicts(merged[toMerge], item, options);
271
+ for (const item of right) {
272
+ const toMerge = _findMergeTarget(merged, item);
273
+ if (toMerge !== -1) merged[toMerge] = _mergeDicts(merged[toMerge], item, options);
274
+ else if (typeof item === "object" && item !== null && "text" in item && item.text === "") continue;
250
275
  else merged.push(item);
251
- } else if (typeof item === "object" && item !== null && "text" in item && item.text === "") continue;
252
- else merged.push(item);
276
+ }
253
277
  return merged;
254
278
  }
255
279
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.cjs","names":["isDataContentBlock","Serializable","convertToV1FromDataContent","convertToV1FromChatCompletionsInput","convertToV1FromAnthropicInput","isMessage","convertToFormattedString"],"sources":["../../src/messages/base.ts"],"sourcesContent":["import { Serializable, SerializedConstructor } from \"../load/serializable.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport { isDataContentBlock } from \"./content/data.js\";\nimport { convertToV1FromAnthropicInput } from \"./block_translators/anthropic.js\";\nimport { convertToV1FromDataContent } from \"./block_translators/data.js\";\nimport { convertToV1FromChatCompletionsInput } from \"./block_translators/openai.js\";\nimport {\n $InferMessageContent,\n $InferResponseMetadata,\n MessageStructure,\n MessageType,\n isMessage,\n Message,\n} from \"./message.js\";\nimport {\n convertToFormattedString,\n type MessageStringFormat,\n} from \"./format.js\";\n\n/** @internal */\nconst MESSAGE_SYMBOL: symbol = Symbol.for(\"langchain.message\");\n\nexport interface StoredMessageData {\n content: string;\n role: string | undefined;\n name: string | undefined;\n tool_call_id: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additional_kwargs?: Record<string, any>;\n /** Response metadata. For example: response headers, logprobs, token counts, model name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response_metadata?: Record<string, any>;\n id?: string;\n}\n\nexport interface StoredMessage {\n type: string;\n data: StoredMessageData;\n}\n\nexport interface StoredGeneration {\n text: string;\n message?: StoredMessage;\n}\n\nexport interface StoredMessageV1 {\n type: string;\n role: string | undefined;\n text: string;\n}\n\nexport type MessageContent = string | Array<ContentBlock>;\n\nexport interface FunctionCall {\n /**\n * The arguments to call the function with, as generated by the model in JSON\n * format. Note that the model does not always generate valid JSON, and may\n * hallucinate parameters not defined by your function schema. Validate the\n * arguments in your code before calling your function.\n */\n arguments: string;\n\n /**\n * The name of the function to call.\n */\n name: string;\n}\n\nexport type BaseMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> = Pick<Message, \"id\" | \"name\"> & {\n content?: $InferMessageContent<TStructure, TRole>;\n contentBlocks?: Array<ContentBlock.Standard>;\n /** @deprecated */\n additional_kwargs?: {\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n function_call?: FunctionCall;\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n tool_calls?: OpenAIToolCall[];\n [key: string]: unknown;\n };\n response_metadata?: Partial<$InferResponseMetadata<TStructure, TRole>>;\n};\n\nexport function mergeContent(\n firstContent: MessageContent,\n secondContent: MessageContent\n): MessageContent {\n // If first content is a string\n if (typeof firstContent === \"string\") {\n if (firstContent === \"\") {\n return secondContent;\n }\n if (typeof secondContent === \"string\") {\n return firstContent + secondContent;\n } else if (Array.isArray(secondContent) && secondContent.length === 0) {\n return firstContent;\n } else if (\n Array.isArray(secondContent) &&\n secondContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n {\n type: \"text\",\n source_type: \"text\",\n text: firstContent,\n },\n ...secondContent,\n ];\n } else {\n return [{ type: \"text\", text: firstContent }, ...secondContent];\n }\n // If both are arrays\n } else if (Array.isArray(secondContent)) {\n return (\n _mergeLists(firstContent, secondContent) ?? [\n ...firstContent,\n ...secondContent,\n ]\n );\n } else {\n if (secondContent === \"\") {\n return firstContent;\n } else if (\n Array.isArray(firstContent) &&\n firstContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n ...firstContent,\n {\n type: \"file\",\n source_type: \"text\",\n text: secondContent,\n },\n ];\n } else {\n return [...firstContent, { type: \"text\", text: secondContent }];\n }\n }\n}\n\n/**\n * 'Merge' two statuses. If either value passed is 'error', it will return 'error'. Else\n * it will return 'success'.\n *\n * @param {\"success\" | \"error\" | undefined} left The existing value to 'merge' with the new value.\n * @param {\"success\" | \"error\" | undefined} right The new value to 'merge' with the existing value\n * @returns {\"success\" | \"error\"} The 'merged' value.\n */\nexport function _mergeStatus(\n left?: \"success\" | \"error\",\n right?: \"success\" | \"error\"\n): \"success\" | \"error\" | undefined {\n if (left === \"error\" || right === \"error\") {\n return \"error\";\n }\n return \"success\";\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction stringifyWithDepthLimit(obj: any, depthLimit: number): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function helper(obj: any, currentDepth: number): any {\n if (typeof obj !== \"object\" || obj === null || obj === undefined) {\n return obj;\n }\n if (currentDepth >= depthLimit) {\n if (Array.isArray(obj)) {\n return \"[Array]\";\n }\n return \"[Object]\";\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => helper(item, currentDepth + 1));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = helper(obj[key], currentDepth + 1);\n }\n return result;\n }\n\n return JSON.stringify(helper(obj, 0), null, 2);\n}\n\n/**\n * Base class for all types of messages in a conversation. It includes\n * properties like `content`, `name`, and `additional_kwargs`. It also\n * includes methods like `toDict()` and `_getType()`.\n */\nexport abstract class BaseMessage<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n>\n extends Serializable\n implements Message<TStructure, TRole>\n{\n lc_namespace = [\"langchain_core\", \"messages\"];\n\n lc_serializable = true;\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n additional_kwargs: \"additional_kwargs\",\n response_metadata: \"response_metadata\",\n };\n }\n\n readonly [MESSAGE_SYMBOL] = true as const;\n\n abstract readonly type: TRole;\n\n id?: string;\n\n /** @inheritdoc */\n name?: string;\n\n content: $InferMessageContent<TStructure, TRole>;\n\n additional_kwargs: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"additional_kwargs\"]\n >;\n\n response_metadata: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"response_metadata\"]\n >;\n\n /**\n * @deprecated Use .getType() instead or import the proper typeguard.\n * For example:\n *\n * ```ts\n * import { isAIMessage } from \"@langchain/core/messages\";\n *\n * const message = new AIMessage(\"Hello!\");\n * isAIMessage(message); // true\n * ```\n */\n _getType(): MessageType {\n return this.type;\n }\n\n /**\n * @deprecated Use .type instead\n * The type of the message.\n */\n getType(): MessageType {\n return this._getType();\n }\n\n constructor(\n arg:\n | $InferMessageContent<TStructure, TRole>\n | BaseMessageFields<TStructure, TRole>\n ) {\n const fields: BaseMessageFields<TStructure, TRole> =\n typeof arg === \"string\" || Array.isArray(arg)\n ? ({ content: arg } as BaseMessageFields<TStructure, TRole>)\n : arg;\n if (!fields.additional_kwargs) {\n fields.additional_kwargs = {};\n }\n if (!fields.response_metadata) {\n fields.response_metadata = {};\n }\n super(fields);\n this.name = fields.name;\n if (fields.content === undefined && fields.contentBlocks !== undefined) {\n this.content = fields.contentBlocks as $InferMessageContent<\n TStructure,\n TRole\n >;\n this.response_metadata = {\n output_version: \"v1\",\n ...fields.response_metadata,\n };\n } else if (fields.content !== undefined) {\n this.content = fields.content ?? [];\n this.response_metadata = fields.response_metadata;\n } else {\n this.content = [] as $InferMessageContent<TStructure, TRole>;\n this.response_metadata = fields.response_metadata;\n }\n this.additional_kwargs = fields.additional_kwargs;\n this.id = fields.id;\n }\n\n /** Get text content of the message. */\n get text(): string {\n if (typeof this.content === \"string\") {\n return this.content;\n }\n if (!Array.isArray(this.content)) return \"\";\n return this.content\n .map((c) => {\n if (typeof c === \"string\") return c;\n if (c.type === \"text\") return c.text;\n return \"\";\n })\n .join(\"\");\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n const blocks: Array<ContentBlock> =\n typeof this.content === \"string\"\n ? [{ type: \"text\", text: this.content }]\n : this.content;\n const parsingSteps = [\n convertToV1FromDataContent,\n convertToV1FromChatCompletionsInput,\n convertToV1FromAnthropicInput,\n ];\n const parsedBlocks = parsingSteps.reduce(\n (blocks, step) => step(blocks),\n blocks\n );\n return parsedBlocks as Array<ContentBlock.Standard>;\n }\n\n toDict(): StoredMessage {\n return {\n type: this.getType(),\n data: (this.toJSON() as SerializedConstructor)\n .kwargs as StoredMessageData,\n };\n }\n\n static lc_name() {\n return \"BaseMessage\";\n }\n\n // Can't be protected for silly reasons\n get _printableFields(): Record<string, unknown> {\n return {\n id: this.id,\n content: this.content,\n name: this.name,\n additional_kwargs: this.additional_kwargs,\n response_metadata: this.response_metadata,\n };\n }\n\n static isInstance(obj: unknown): obj is BaseMessage {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n MESSAGE_SYMBOL in obj &&\n (obj as Record<symbol, unknown>)[MESSAGE_SYMBOL] === true &&\n isMessage(obj)\n );\n }\n\n // this private method is used to update the ID for the runtime\n // value as well as in lc_kwargs for serialisation\n _updateId(value: string | undefined) {\n this.id = value;\n\n // lc_attributes wouldn't work here, because jest compares the\n // whole object\n this.lc_kwargs.id = value;\n }\n\n get [Symbol.toStringTag]() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.constructor as any).lc_name();\n }\n\n // Override the default behavior of console.log\n [Symbol.for(\"nodejs.util.inspect.custom\")](depth: number | null) {\n if (depth === null) {\n return this;\n }\n const printable = stringifyWithDepthLimit(\n this._printableFields,\n Math.max(4, depth)\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `${(this.constructor as any).lc_name()} ${printable}`;\n }\n\n toFormattedString(format: MessageStringFormat = \"pretty\"): string {\n return convertToFormattedString(this, format);\n }\n}\n\n/**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\nexport type OpenAIToolCall = {\n /**\n * The ID of the tool call.\n */\n id: string;\n\n /**\n * The function that the model called.\n */\n function: FunctionCall;\n\n /**\n * The type of the tool. Currently, only `function` is supported.\n */\n type: \"function\";\n\n index?: number;\n};\n\nexport function isOpenAIToolCallArray(\n value?: unknown\n): value is OpenAIToolCall[] {\n return (\n Array.isArray(value) &&\n value.every((v) => typeof (v as OpenAIToolCall).index === \"number\")\n );\n}\n\n/**\n * Default keys that should be preserved (not merged) when concatenating message chunks.\n * These are identification and timestamp fields that shouldn't be summed or concatenated.\n */\nexport const DEFAULT_MERGE_IGNORE_KEYS: readonly string[] = [\n \"index\", // Used for identification in tool calls, not accumulation\n \"created\", // Timestamp field\n \"timestamp\", // Timestamp field\n] as const;\n\n/**\n * Options for controlling merge behavior in `_mergeDicts`.\n */\nexport interface MergeDictsOptions {\n /**\n * Keys to ignore during merging. When a key is in this list:\n * - For numeric values: the original value is preserved (not summed)\n * - For string values: the original value is preserved (not concatenated)\n *\n * Defaults to `DEFAULT_MERGE_IGNORE_KEYS` which includes 'index', 'created', 'timestamp'.\n *\n * @example\n * // Extend defaults with custom keys\n * { ignoreKeys: [...DEFAULT_MERGE_IGNORE_KEYS, 'role', 'customField'] }\n */\n ignoreKeys?: readonly string[];\n}\n\nexport function _mergeDicts(\n /**\n * The left dictionary to merge.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n left: Record<string, any> | undefined,\n /**\n * The right dictionary to merge.\n * @type {Record<string, any>}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n right: Record<string, any> | undefined,\n /**\n * The options for the merge.\n */\n options?: MergeDictsOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> | undefined {\n /**\n * The keys to ignore during merging.\n */\n const ignoreKeys = options?.ignoreKeys ?? DEFAULT_MERGE_IGNORE_KEYS;\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n }\n const merged = { ...left };\n for (const [key, value] of Object.entries(right)) {\n if (merged[key] == null) {\n merged[key] = value;\n } else if (value == null) {\n continue;\n } else if (\n typeof merged[key] !== typeof value ||\n Array.isArray(merged[key]) !== Array.isArray(value)\n ) {\n throw new Error(\n `field[${key}] already exists in the message chunk, but with a different type.`\n );\n } else if (typeof merged[key] === \"string\") {\n if (key === \"type\") {\n // Do not merge 'type' fields\n continue;\n } else if (\n [\"id\", \"name\", \"output_version\", \"model_provider\"].includes(key)\n ) {\n // Keep the incoming value for these fields if its defined\n if (value) {\n merged[key] = value;\n }\n } else if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n } else {\n merged[key] += value;\n }\n } else if (typeof merged[key] === \"number\") {\n if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n }\n merged[key] = merged[key] + value;\n } else if (typeof merged[key] === \"object\" && !Array.isArray(merged[key])) {\n merged[key] = _mergeDicts(merged[key], value, options);\n } else if (Array.isArray(merged[key])) {\n merged[key] = _mergeLists(merged[key], value, options);\n } else if (merged[key] === value) {\n continue;\n } else {\n console.warn(\n `field[${key}] already exists in this message chunk and value has unsupported type.`\n );\n }\n }\n return merged;\n}\n\nfunction isMergeableIndex(index: unknown): index is number | string {\n return typeof index === \"number\" || typeof index === \"string\";\n}\n\nfunction hasMergeableIndex(\n value: unknown\n): value is { index: number | string } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"index\" in value)) return false;\n return isMergeableIndex(value.index);\n}\n\nexport function _mergeLists<Content extends ContentBlock>(\n left?: Content[],\n right?: Content[],\n options?: MergeDictsOptions\n): Content[] | undefined {\n if (left == null && right == null) {\n return undefined;\n } else if (left == null || right == null) {\n return left || right;\n } else {\n const merged = [...left];\n for (const item of right) {\n if (hasMergeableIndex(item)) {\n const toMerge = merged.findIndex((leftItem) => {\n if (!hasMergeableIndex(leftItem)) return false;\n\n const indiciesMatch = leftItem.index === item.index;\n const leftHasId = leftItem.id != null && leftItem.id !== \"\";\n const rightHasId = item.id != null && item.id !== \"\";\n const idsMatch = leftHasId && rightHasId && leftItem.id === item.id;\n const eitherItemMissingID = !leftHasId || !rightHasId;\n return indiciesMatch && (idsMatch || eitherItemMissingID);\n });\n\n if (\n toMerge !== -1 &&\n typeof merged[toMerge] === \"object\" &&\n merged[toMerge] !== null\n ) {\n merged[toMerge] = _mergeDicts(\n merged[toMerge] as Record<string, unknown>,\n item as Record<string, unknown>,\n options\n ) as Content;\n } else {\n merged.push(item);\n }\n } else if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n item.text === \"\"\n ) {\n continue;\n } else {\n merged.push(item);\n }\n }\n return merged;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _mergeObj<T = any>(\n left: T | undefined,\n right: T | undefined,\n options?: MergeDictsOptions\n): T | undefined {\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n } else if (typeof left !== typeof right) {\n throw new Error(\n `Cannot merge objects of different types.\\nLeft ${typeof left}\\nRight ${typeof right}`\n );\n } else if (typeof left === \"string\" && typeof right === \"string\") {\n return (left + right) as T;\n } else if (Array.isArray(left) && Array.isArray(right)) {\n return _mergeLists(left, right, options) as T;\n } else if (typeof left === \"object\" && typeof right === \"object\") {\n return _mergeDicts(\n left as Record<string, unknown>,\n right as Record<string, unknown>,\n options\n ) as T;\n } else if (left === right) {\n return left;\n } else {\n throw new Error(\n `Can not merge objects of different types.\\nLeft ${left}\\nRight ${right}`\n );\n }\n}\n\n/**\n * Represents a chunk of a message, which can be concatenated with other\n * message chunks. It includes a method `_merge_kwargs_dict()` for merging\n * additional keyword arguments from another `BaseMessageChunk` into this\n * one. It also overrides the `__add__()` method to support concatenation\n * of `BaseMessageChunk` instances.\n */\nexport abstract class BaseMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> extends BaseMessage<TStructure, TRole> {\n abstract concat(chunk: BaseMessageChunk): BaseMessageChunk<TStructure, TRole>;\n\n static isInstance(obj: unknown): obj is BaseMessageChunk {\n if (!super.isInstance(obj)) {\n return false;\n }\n // Check if obj is an instance of BaseMessageChunk by traversing the prototype chain\n let proto = Object.getPrototypeOf(obj);\n while (proto !== null) {\n if (proto === BaseMessageChunk.prototype) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n }\n}\n\nexport type MessageFieldWithRole = {\n role: MessageType;\n content: MessageContent;\n name?: string;\n} & Record<string, unknown>;\n\nexport function _isMessageFieldWithRole(\n x: BaseMessageLike\n): x is MessageFieldWithRole {\n return typeof (x as MessageFieldWithRole).role === \"string\";\n}\n\nexport type BaseMessageLike =\n | BaseMessage\n | MessageFieldWithRole\n | [MessageType, MessageContent]\n | string\n /**\n * @deprecated Specifying \"type\" is deprecated and will be removed in 0.4.0.\n */\n | ({\n type: MessageType | \"user\" | \"assistant\" | \"placeholder\";\n } & BaseMessageFields &\n Record<string, unknown>)\n | SerializedConstructor;\n\n/**\n * @deprecated Use {@link BaseMessage.isInstance} instead\n */\nexport function isBaseMessage(\n messageLike?: unknown\n): messageLike is BaseMessage {\n return typeof (messageLike as BaseMessage)?._getType === \"function\";\n}\n\n/**\n * @deprecated Use {@link BaseMessageChunk.isInstance} instead\n */\nexport function isBaseMessageChunk(\n messageLike?: unknown\n): messageLike is BaseMessageChunk {\n return BaseMessageChunk.isInstance(messageLike);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.cjs","names":["isDataContentBlock","Serializable","convertToV1FromDataContent","convertToV1FromChatCompletionsInput","convertToV1FromAnthropicInput","isMessage","convertToFormattedString"],"sources":["../../src/messages/base.ts"],"sourcesContent":["import { Serializable, SerializedConstructor } from \"../load/serializable.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport { isDataContentBlock } from \"./content/data.js\";\nimport { convertToV1FromAnthropicInput } from \"./block_translators/anthropic.js\";\nimport { convertToV1FromDataContent } from \"./block_translators/data.js\";\nimport { convertToV1FromChatCompletionsInput } from \"./block_translators/openai.js\";\nimport {\n $InferMessageContent,\n $InferResponseMetadata,\n MessageStructure,\n MessageType,\n isMessage,\n Message,\n} from \"./message.js\";\nimport {\n convertToFormattedString,\n type MessageStringFormat,\n} from \"./format.js\";\n\n/** @internal */\nconst MESSAGE_SYMBOL: symbol = Symbol.for(\"langchain.message\");\n\nexport interface StoredMessageData {\n content: string;\n role: string | undefined;\n name: string | undefined;\n tool_call_id: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additional_kwargs?: Record<string, any>;\n /** Response metadata. For example: response headers, logprobs, token counts, model name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response_metadata?: Record<string, any>;\n id?: string;\n}\n\nexport interface StoredMessage {\n type: string;\n data: StoredMessageData;\n}\n\nexport interface StoredGeneration {\n text: string;\n message?: StoredMessage;\n}\n\nexport interface StoredMessageV1 {\n type: string;\n role: string | undefined;\n text: string;\n}\n\nexport type MessageContent = string | Array<ContentBlock>;\n\nexport interface FunctionCall {\n /**\n * The arguments to call the function with, as generated by the model in JSON\n * format. Note that the model does not always generate valid JSON, and may\n * hallucinate parameters not defined by your function schema. Validate the\n * arguments in your code before calling your function.\n */\n arguments: string;\n\n /**\n * The name of the function to call.\n */\n name: string;\n}\n\nexport type BaseMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> = Pick<Message, \"id\" | \"name\"> & {\n content?: $InferMessageContent<TStructure, TRole>;\n contentBlocks?: Array<ContentBlock.Standard>;\n /** @deprecated */\n additional_kwargs?: {\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n function_call?: FunctionCall;\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n tool_calls?: OpenAIToolCall[];\n [key: string]: unknown;\n };\n response_metadata?: Partial<$InferResponseMetadata<TStructure, TRole>>;\n};\n\nexport function mergeContent(\n firstContent: MessageContent,\n secondContent: MessageContent\n): MessageContent {\n // If first content is a string\n if (typeof firstContent === \"string\") {\n if (firstContent === \"\") {\n return secondContent;\n }\n if (typeof secondContent === \"string\") {\n return firstContent + secondContent;\n } else if (Array.isArray(secondContent) && secondContent.length === 0) {\n return firstContent;\n } else if (\n Array.isArray(secondContent) &&\n secondContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n {\n type: \"text\",\n source_type: \"text\",\n text: firstContent,\n },\n ...secondContent,\n ];\n } else {\n return [{ type: \"text\", text: firstContent }, ...secondContent];\n }\n // If both are arrays\n } else if (Array.isArray(secondContent)) {\n return (\n _mergeLists(firstContent, secondContent) ?? [\n ...firstContent,\n ...secondContent,\n ]\n );\n } else {\n if (secondContent === \"\") {\n return firstContent;\n } else if (\n Array.isArray(firstContent) &&\n firstContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n ...firstContent,\n {\n type: \"file\",\n source_type: \"text\",\n text: secondContent,\n },\n ];\n } else {\n return [...firstContent, { type: \"text\", text: secondContent }];\n }\n }\n}\n\n/**\n * 'Merge' two statuses. If either value passed is 'error', it will return 'error'. Else\n * it will return 'success'.\n *\n * @param {\"success\" | \"error\" | undefined} left The existing value to 'merge' with the new value.\n * @param {\"success\" | \"error\" | undefined} right The new value to 'merge' with the existing value\n * @returns {\"success\" | \"error\"} The 'merged' value.\n */\nexport function _mergeStatus(\n left?: \"success\" | \"error\",\n right?: \"success\" | \"error\"\n): \"success\" | \"error\" | undefined {\n if (left === \"error\" || right === \"error\") {\n return \"error\";\n }\n return \"success\";\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction stringifyWithDepthLimit(obj: any, depthLimit: number): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function helper(obj: any, currentDepth: number): any {\n if (typeof obj !== \"object\" || obj === null || obj === undefined) {\n return obj;\n }\n if (currentDepth >= depthLimit) {\n if (Array.isArray(obj)) {\n return \"[Array]\";\n }\n return \"[Object]\";\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => helper(item, currentDepth + 1));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = helper(obj[key], currentDepth + 1);\n }\n return result;\n }\n\n return JSON.stringify(helper(obj, 0), null, 2);\n}\n\n/**\n * Base class for all types of messages in a conversation. It includes\n * properties like `content`, `name`, and `additional_kwargs`. It also\n * includes methods like `toDict()` and `_getType()`.\n */\nexport abstract class BaseMessage<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n>\n extends Serializable\n implements Message<TStructure, TRole>\n{\n lc_namespace = [\"langchain_core\", \"messages\"];\n\n lc_serializable = true;\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n additional_kwargs: \"additional_kwargs\",\n response_metadata: \"response_metadata\",\n };\n }\n\n readonly [MESSAGE_SYMBOL] = true as const;\n\n abstract readonly type: TRole;\n\n id?: string;\n\n /** @inheritdoc */\n name?: string;\n\n content: $InferMessageContent<TStructure, TRole>;\n\n additional_kwargs: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"additional_kwargs\"]\n >;\n\n response_metadata: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"response_metadata\"]\n >;\n\n /**\n * @deprecated Use .getType() instead or import the proper typeguard.\n * For example:\n *\n * ```ts\n * import { isAIMessage } from \"@langchain/core/messages\";\n *\n * const message = new AIMessage(\"Hello!\");\n * isAIMessage(message); // true\n * ```\n */\n _getType(): MessageType {\n return this.type;\n }\n\n /**\n * @deprecated Use .type instead\n * The type of the message.\n */\n getType(): MessageType {\n return this._getType();\n }\n\n constructor(\n arg:\n | $InferMessageContent<TStructure, TRole>\n | BaseMessageFields<TStructure, TRole>\n ) {\n const fields: BaseMessageFields<TStructure, TRole> =\n typeof arg === \"string\" || Array.isArray(arg)\n ? ({ content: arg } as BaseMessageFields<TStructure, TRole>)\n : arg;\n if (!fields.additional_kwargs) {\n fields.additional_kwargs = {};\n }\n if (!fields.response_metadata) {\n fields.response_metadata = {};\n }\n super(fields);\n this.name = fields.name;\n if (fields.content === undefined && fields.contentBlocks !== undefined) {\n this.content = fields.contentBlocks as $InferMessageContent<\n TStructure,\n TRole\n >;\n this.response_metadata = {\n output_version: \"v1\",\n ...fields.response_metadata,\n };\n } else if (fields.content !== undefined) {\n this.content = fields.content ?? [];\n this.response_metadata = fields.response_metadata;\n } else {\n this.content = [] as $InferMessageContent<TStructure, TRole>;\n this.response_metadata = fields.response_metadata;\n }\n this.additional_kwargs = fields.additional_kwargs;\n this.id = fields.id;\n }\n\n /** Get text content of the message. */\n get text(): string {\n if (typeof this.content === \"string\") {\n return this.content;\n }\n if (!Array.isArray(this.content)) return \"\";\n return this.content\n .map((c) => {\n if (typeof c === \"string\") return c;\n if (c.type === \"text\") return c.text;\n return \"\";\n })\n .join(\"\");\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n const blocks: Array<ContentBlock> =\n typeof this.content === \"string\"\n ? [{ type: \"text\", text: this.content }]\n : this.content;\n const parsingSteps = [\n convertToV1FromDataContent,\n convertToV1FromChatCompletionsInput,\n convertToV1FromAnthropicInput,\n ];\n const parsedBlocks = parsingSteps.reduce(\n (blocks, step) => step(blocks),\n blocks\n );\n return parsedBlocks as Array<ContentBlock.Standard>;\n }\n\n toDict(): StoredMessage {\n return {\n type: this.getType(),\n data: (this.toJSON() as SerializedConstructor)\n .kwargs as StoredMessageData,\n };\n }\n\n static lc_name() {\n return \"BaseMessage\";\n }\n\n // Can't be protected for silly reasons\n get _printableFields(): Record<string, unknown> {\n return {\n id: this.id,\n content: this.content,\n name: this.name,\n additional_kwargs: this.additional_kwargs,\n response_metadata: this.response_metadata,\n };\n }\n\n static isInstance(obj: unknown): obj is BaseMessage {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n MESSAGE_SYMBOL in obj &&\n (obj as Record<symbol, unknown>)[MESSAGE_SYMBOL] === true &&\n isMessage(obj)\n );\n }\n\n // this private method is used to update the ID for the runtime\n // value as well as in lc_kwargs for serialisation\n _updateId(value: string | undefined) {\n this.id = value;\n\n // lc_attributes wouldn't work here, because jest compares the\n // whole object\n this.lc_kwargs.id = value;\n }\n\n get [Symbol.toStringTag]() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.constructor as any).lc_name();\n }\n\n // Override the default behavior of console.log\n [Symbol.for(\"nodejs.util.inspect.custom\")](depth: number | null) {\n if (depth === null) {\n return this;\n }\n const printable = stringifyWithDepthLimit(\n this._printableFields,\n Math.max(4, depth)\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `${(this.constructor as any).lc_name()} ${printable}`;\n }\n\n toFormattedString(format: MessageStringFormat = \"pretty\"): string {\n return convertToFormattedString(this, format);\n }\n}\n\n/**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\nexport type OpenAIToolCall = {\n /**\n * The ID of the tool call.\n */\n id: string;\n\n /**\n * The function that the model called.\n */\n function: FunctionCall;\n\n /**\n * The type of the tool. Currently, only `function` is supported.\n */\n type: \"function\";\n\n index?: number;\n};\n\nexport function isOpenAIToolCallArray(\n value?: unknown\n): value is OpenAIToolCall[] {\n return (\n Array.isArray(value) &&\n value.every((v) => typeof (v as OpenAIToolCall).index === \"number\")\n );\n}\n\n/**\n * Default keys that should be preserved (not merged) when concatenating message chunks.\n * These are identification and timestamp fields that shouldn't be summed or concatenated.\n */\nexport const DEFAULT_MERGE_IGNORE_KEYS: readonly string[] = [\n \"index\", // Used for identification in tool calls, not accumulation\n \"created\", // Timestamp field\n \"timestamp\", // Timestamp field\n] as const;\n\n/**\n * Options for controlling merge behavior in `_mergeDicts`.\n */\nexport interface MergeDictsOptions {\n /**\n * Keys to ignore during merging. When a key is in this list:\n * - For numeric values: the original value is preserved (not summed)\n * - For string values: the original value is preserved (not concatenated)\n *\n * Defaults to `DEFAULT_MERGE_IGNORE_KEYS` which includes 'index', 'created', 'timestamp'.\n *\n * @example\n * // Extend defaults with custom keys\n * { ignoreKeys: [...DEFAULT_MERGE_IGNORE_KEYS, 'role', 'customField'] }\n */\n ignoreKeys?: readonly string[];\n}\n\nexport function _mergeDicts(\n /**\n * The left dictionary to merge.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n left: Record<string, any> | undefined,\n /**\n * The right dictionary to merge.\n * @type {Record<string, any>}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n right: Record<string, any> | undefined,\n /**\n * The options for the merge.\n */\n options?: MergeDictsOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> | undefined {\n /**\n * The keys to ignore during merging.\n */\n const ignoreKeys = options?.ignoreKeys ?? DEFAULT_MERGE_IGNORE_KEYS;\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n }\n const merged = { ...left };\n for (const [key, value] of Object.entries(right)) {\n if (merged[key] == null) {\n merged[key] = value;\n } else if (value == null) {\n continue;\n } else if (\n typeof merged[key] !== typeof value ||\n Array.isArray(merged[key]) !== Array.isArray(value)\n ) {\n throw new Error(\n `field[${key}] already exists in the message chunk, but with a different type.`\n );\n } else if (typeof merged[key] === \"string\") {\n if (key === \"type\") {\n // Do not merge 'type' fields\n continue;\n } else if (\n [\"id\", \"name\", \"output_version\", \"model_provider\"].includes(key)\n ) {\n // Keep the incoming value for these fields if its defined\n if (value) {\n merged[key] = value;\n }\n } else if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n } else {\n merged[key] += value;\n }\n } else if (typeof merged[key] === \"number\") {\n if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n }\n merged[key] = merged[key] + value;\n } else if (typeof merged[key] === \"object\" && !Array.isArray(merged[key])) {\n merged[key] = _mergeDicts(merged[key], value, options);\n } else if (Array.isArray(merged[key])) {\n merged[key] = _mergeLists(merged[key], value, options);\n } else if (merged[key] === value) {\n continue;\n } else {\n console.warn(\n `field[${key}] already exists in this message chunk and value has unsupported type.`\n );\n }\n }\n return merged;\n}\n\nfunction isMergeableIndex(index: unknown): index is number | string {\n return typeof index === \"number\" || typeof index === \"string\";\n}\n\nfunction hasMergeableIndex(\n value: unknown\n): value is { index: number | string } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"index\" in value)) return false;\n return isMergeableIndex(value.index);\n}\n\nfunction hasMergeableId(value: unknown): value is { id: string | number } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"id\" in value)) return false;\n const id = (value as Record<string, unknown>).id;\n return id != null && id !== \"\";\n}\n\n/**\n * Find the index of an existing item in `merged` that should be merged with\n * `item`, based on index and/or id matching.\n *\n * Matching priority:\n * 1. Both have index → match on index (+ id when both present)\n * 2. Neither has index, both have id → match on id alone\n * 3. Otherwise → no match (item should be appended)\n */\nfunction _findMergeTarget<Content extends ContentBlock>(\n merged: Content[],\n item: Content\n): number {\n const itemHasIndex = hasMergeableIndex(item);\n const itemHasId = hasMergeableId(item);\n\n if (!itemHasIndex && !itemHasId) return -1;\n\n return merged.findIndex((leftItem) => {\n const leftHasIndex = hasMergeableIndex(leftItem);\n const leftHasId = hasMergeableId(leftItem);\n\n if (itemHasIndex && leftHasIndex) {\n // Both have index: match on index, with id as tiebreaker\n const indicesMatch = leftItem.index === item.index;\n if (!indicesMatch) return false;\n if (leftHasId && itemHasId) return leftItem.id === item.id;\n return true; // indices match, one or both missing id\n }\n\n if (!itemHasIndex && !leftHasIndex && itemHasId && leftHasId) {\n // Neither has index: fall back to id-only matching. Handles providers\n // that don't include `index` on streaming tool call deltas.\n return leftItem.id === item.id;\n }\n\n return false;\n });\n}\n\nexport function _mergeLists<Content extends ContentBlock>(\n left?: Content[],\n right?: Content[],\n options?: MergeDictsOptions\n): Content[] | undefined {\n if (left == null && right == null) {\n return undefined;\n } else if (left == null || right == null) {\n return left || right;\n } else {\n const merged = [...left];\n for (const item of right) {\n const toMerge = _findMergeTarget(merged, item);\n if (toMerge !== -1) {\n merged[toMerge] = _mergeDicts(\n merged[toMerge],\n item,\n options\n ) as Content;\n } else if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n item.text === \"\"\n ) {\n continue;\n } else {\n merged.push(item);\n }\n }\n return merged;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _mergeObj<T = any>(\n left: T | undefined,\n right: T | undefined,\n options?: MergeDictsOptions\n): T | undefined {\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n } else if (typeof left !== typeof right) {\n throw new Error(\n `Cannot merge objects of different types.\\nLeft ${typeof left}\\nRight ${typeof right}`\n );\n } else if (typeof left === \"string\" && typeof right === \"string\") {\n return (left + right) as T;\n } else if (Array.isArray(left) && Array.isArray(right)) {\n return _mergeLists(left, right, options) as T;\n } else if (typeof left === \"object\" && typeof right === \"object\") {\n return _mergeDicts(\n left as Record<string, unknown>,\n right as Record<string, unknown>,\n options\n ) as T;\n } else if (left === right) {\n return left;\n } else {\n throw new Error(\n `Can not merge objects of different types.\\nLeft ${left}\\nRight ${right}`\n );\n }\n}\n\n/**\n * Represents a chunk of a message, which can be concatenated with other\n * message chunks. It includes a method `_merge_kwargs_dict()` for merging\n * additional keyword arguments from another `BaseMessageChunk` into this\n * one. It also overrides the `__add__()` method to support concatenation\n * of `BaseMessageChunk` instances.\n */\nexport abstract class BaseMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> extends BaseMessage<TStructure, TRole> {\n abstract concat(chunk: BaseMessageChunk): BaseMessageChunk<TStructure, TRole>;\n\n static isInstance(obj: unknown): obj is BaseMessageChunk {\n if (!super.isInstance(obj)) {\n return false;\n }\n // Check if obj is an instance of BaseMessageChunk by traversing the prototype chain\n let proto = Object.getPrototypeOf(obj);\n while (proto !== null) {\n if (proto === BaseMessageChunk.prototype) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n }\n}\n\nexport type MessageFieldWithRole = {\n role: MessageType;\n content: MessageContent;\n name?: string;\n} & Record<string, unknown>;\n\nexport function _isMessageFieldWithRole(\n x: BaseMessageLike\n): x is MessageFieldWithRole {\n return typeof (x as MessageFieldWithRole).role === \"string\";\n}\n\nexport type BaseMessageLike =\n | BaseMessage\n | MessageFieldWithRole\n | [MessageType, MessageContent]\n | string\n /**\n * @deprecated Specifying \"type\" is deprecated and will be removed in 0.4.0.\n */\n | ({\n type: MessageType | \"user\" | \"assistant\" | \"placeholder\";\n } & BaseMessageFields &\n Record<string, unknown>)\n | SerializedConstructor;\n\n/**\n * @deprecated Use {@link BaseMessage.isInstance} instead\n */\nexport function isBaseMessage(\n messageLike?: unknown\n): messageLike is BaseMessage {\n return typeof (messageLike as BaseMessage)?._getType === \"function\";\n}\n\n/**\n * @deprecated Use {@link BaseMessageChunk.isInstance} instead\n */\nexport function isBaseMessageChunk(\n messageLike?: unknown\n): messageLike is BaseMessageChunk {\n return BaseMessageChunk.isInstance(messageLike);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.cts","names":[],"sources":["../../src/messages/base.ts"],"mappings":";;;;;;;cAoBM,cAAA;AAAA,UAEW,iBAAA;EACf,OAAA;EACA,IAAA;EACA,IAAA;EACA,YAAA;EAEA,iBAAA,GAAoB,MAAA;EANY;EAShC,iBAAA,GAAoB,MAAA;EACpB,EAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,IAAA,EAAM,iBAAA;AAAA;AAAA,UAGS,gBAAA;EACf,IAAA;EACA,OAAA,GAAU,aAAA;AAAA;AAAA,UAGK,eAAA;EACf,IAAA;EACA,IAAA;EACA,IAAA;AAAA;AAAA,KAGU,cAAA,YAA0B,KAAA,CAAM,YAAA;AAAA,UAE3B,YAAA;EAhBf;;;;AAGF;;EAoBE,SAAA;EAlBuB;;;EAuBvB,IAAA;AAAA;AAAA,KAGU,iBAAA,oBACS,gBAAA,GAAmB,gBAAA,gBACxB,WAAA,GAAc,WAAA,IAC1B,IAAA,CAAK,OAAA;EACP,OAAA,GAAU,oBAAA,CAAqB,UAAA,EAAY,KAAA;EAC3C,aAAA,GAAgB,KAAA,CAAM,YAAA,CAAa,QAAA;EAEnC,iBAAA;IA7BA;;;IAiCE,aAAA,GAAgB,YAAA;IA/Bd;AAGN;;IAgCI,UAAA,GAAa,cAAA;IAAA,CACZ,GAAA;EAAA;EAEH,iBAAA,GAAoB,OAAA,CAAQ,sBAAA,CAAuB,UAAA,EAAY,KAAA;AAAA;AAAA,iBAGjD,YAAA,CACd,YAAA,EAAc,cAAA,EACd,aAAA,EAAe,cAAA,GACd,cAAA;;;AAxBH;;;;;;iBAsFgB,YAAA,CACd,IAAA,wBACA,KAAA;;;;;;uBAyCoB,WAAA,oBACD,gBAAA,GAAmB,gBAAA,gBACxB,WAAA,GAAc,WAAA,UAEpB,YAAA,YACG,OAAA,CAAQ,UAAA,EAAY,KAAA;EAAA,UAcrB,cAAA;EAZV,YAAA;EAEA,eAAA;EAAA,IAEI,UAAA,CAAA,GAAc,MAAA;EAAA,kBAUA,IAAA,EAAM,KAAA;EAExB,EAAA;EAtIoB;EAyIpB,IAAA;EAEA,OAAA,EAAS,oBAAA,CAAqB,UAAA,EAAY,KAAA;EAE1C,iBAAA,EAAmB,WAAA,CACjB,iBAAA,CAAkB,UAAA,EAAY,KAAA;EAGhC,iBAAA,EAAmB,WAAA,CACjB,iBAAA,CAAkB,UAAA,EAAY,KAAA;EAnKM;;;;;;;;;;;EAiLtC,QAAA,CAAA,GAAY,WAAA;EA7KU;;;;EAqLtB,OAAA,CAAA,GAAW,WAAA;EAIX,WAAA,CACE,GAAA,EACI,oBAAA,CAAqB,UAAA,EAAY,KAAA,IACjC,iBAAA,CAAkB,UAAA,EAAY,KAAA;EAlLrB;EAAA,IAqNX,IAAA,CAAA;EAAA,IAcA,aAAA,CAAA,GAAiB,KAAA,CAAM,YAAA,CAAa,QAAA;EAiBxC,MAAA,CAAA,GAAU,aAAA;EAAA,OAQH,OAAA,CAAA;EAAA,IAKH,gBAAA,CAAA,GAAoB,MAAA;EAAA,OAUjB,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,WAAA;EAYxC,SAAA,CAAU,KAAA;EAAA,KAQL,MAAA,CAAO,WAAA;EAkBZ,iBAAA,CAAkB,MAAA,GAAQ,mBAAA;AAAA;;;;KAQhB,cAAA;EAhTK;;;EAoTf,EAAA;EArTe;;;EA0Tf,QAAA,EAAU,YAAA;EAzTK;AA8DjB;;EAgQE,IAAA;EAEA,KAAA;AAAA;AAAA,iBAGc,qBAAA,CACd,KAAA,aACC,KAAA,IAAS,cAAA;;;;;cAWC,yBAAA;;;;UASI,iBAAA;EArOG;;;;;;;;;;;EAiPlB,UAAA;AAAA;AAAA,iBAGc,WAAA;;;;;AAKd,IAAA,EAAM,MAAA;;;;;;AAMN,KAAA,EAAO,MAAA;;;;;AAIP,OAAA,GAAU,iBAAA,GAET,MAAA;AAAA,iBA0Ea,WAAA,iBAA4B,YAAA,CAAA,CAC1C,IAAA,GAAO,OAAA,IACP,KAAA,GAAQ,OAAA,IACR,OAAA,GAAU,iBAAA,GACT,OAAA;AAAA,iBAiDa,SAAA,SAAA,CACd,IAAA,EAAM,CAAA,cACN,KAAA,EAAO,CAAA,cACP,OAAA,GAAU,iBAAA,GACT,CAAA;;;;;;;;uBAoCmB,gBAAA,oBACD,gBAAA,GAAmB,gBAAA,gBACxB,WAAA,GAAc,WAAA,UACpB,WAAA,CAAY,UAAA,EAAY,KAAA;EAAA,SACvB,MAAA,CAAO,KAAA,EAAO,gBAAA,GAAmB,gBAAA,CAAiB,UAAA,EAAY,KAAA;EAAA,OAEhE,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,gBAAA;AAAA;AAAA,KAgB9B,oBAAA;EACV,IAAA,EAAM,WAAA;EACN,OAAA,EAAS,cAAA;EACT,IAAA;AAAA,IACE,MAAA;AAAA,iBAEY,uBAAA,CACd,CAAA,EAAG,eAAA,GACF,CAAA,IAAK,oBAAA;AAAA,KAII,eAAA,GACR,WAAA,GACA,oBAAA,IACC,WAAA,EAAa,cAAA;;;;;EAMZ,IAAA,EAAM,WAAA;AAAA,IACJ,iBAAA,GACF,MAAA,qBACF,qBAAA;;;;iBAKY,aAAA,CACd,WAAA,aACC,WAAA,IAAe,WAAA;;;;iBAOF,kBAAA,CACd,WAAA,aACC,WAAA,IAAe,gBAAA"}
1
+ {"version":3,"file":"base.d.cts","names":[],"sources":["../../src/messages/base.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/messages/base.ts"],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/messages/base.ts"],"mappings":"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"}
@@ -232,24 +232,48 @@ function hasMergeableIndex(value) {
232
232
  if (!("index" in value)) return false;
233
233
  return isMergeableIndex(value.index);
234
234
  }
235
+ function hasMergeableId(value) {
236
+ if (typeof value !== "object" || value === null) return false;
237
+ if (!("id" in value)) return false;
238
+ const id = value.id;
239
+ return id != null && id !== "";
240
+ }
241
+ /**
242
+ * Find the index of an existing item in `merged` that should be merged with
243
+ * `item`, based on index and/or id matching.
244
+ *
245
+ * Matching priority:
246
+ * 1. Both have index → match on index (+ id when both present)
247
+ * 2. Neither has index, both have id → match on id alone
248
+ * 3. Otherwise → no match (item should be appended)
249
+ */
250
+ function _findMergeTarget(merged, item) {
251
+ const itemHasIndex = hasMergeableIndex(item);
252
+ const itemHasId = hasMergeableId(item);
253
+ if (!itemHasIndex && !itemHasId) return -1;
254
+ return merged.findIndex((leftItem) => {
255
+ const leftHasIndex = hasMergeableIndex(leftItem);
256
+ const leftHasId = hasMergeableId(leftItem);
257
+ if (itemHasIndex && leftHasIndex) {
258
+ if (!(leftItem.index === item.index)) return false;
259
+ if (leftHasId && itemHasId) return leftItem.id === item.id;
260
+ return true;
261
+ }
262
+ if (!itemHasIndex && !leftHasIndex && itemHasId && leftHasId) return leftItem.id === item.id;
263
+ return false;
264
+ });
265
+ }
235
266
  function _mergeLists(left, right, options) {
236
267
  if (left == null && right == null) return;
237
268
  else if (left == null || right == null) return left || right;
238
269
  else {
239
270
  const merged = [...left];
240
- for (const item of right) if (hasMergeableIndex(item)) {
241
- const toMerge = merged.findIndex((leftItem) => {
242
- if (!hasMergeableIndex(leftItem)) return false;
243
- const indiciesMatch = leftItem.index === item.index;
244
- const leftHasId = leftItem.id != null && leftItem.id !== "";
245
- const rightHasId = item.id != null && item.id !== "";
246
- const idsMatch = leftHasId && rightHasId && leftItem.id === item.id;
247
- return indiciesMatch && (idsMatch || !leftHasId || !rightHasId);
248
- });
249
- if (toMerge !== -1 && typeof merged[toMerge] === "object" && merged[toMerge] !== null) merged[toMerge] = _mergeDicts(merged[toMerge], item, options);
271
+ for (const item of right) {
272
+ const toMerge = _findMergeTarget(merged, item);
273
+ if (toMerge !== -1) merged[toMerge] = _mergeDicts(merged[toMerge], item, options);
274
+ else if (typeof item === "object" && item !== null && "text" in item && item.text === "") continue;
250
275
  else merged.push(item);
251
- } else if (typeof item === "object" && item !== null && "text" in item && item.text === "") continue;
252
- else merged.push(item);
276
+ }
253
277
  return merged;
254
278
  }
255
279
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":[],"sources":["../../src/messages/base.ts"],"sourcesContent":["import { Serializable, SerializedConstructor } from \"../load/serializable.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport { isDataContentBlock } from \"./content/data.js\";\nimport { convertToV1FromAnthropicInput } from \"./block_translators/anthropic.js\";\nimport { convertToV1FromDataContent } from \"./block_translators/data.js\";\nimport { convertToV1FromChatCompletionsInput } from \"./block_translators/openai.js\";\nimport {\n $InferMessageContent,\n $InferResponseMetadata,\n MessageStructure,\n MessageType,\n isMessage,\n Message,\n} from \"./message.js\";\nimport {\n convertToFormattedString,\n type MessageStringFormat,\n} from \"./format.js\";\n\n/** @internal */\nconst MESSAGE_SYMBOL: symbol = Symbol.for(\"langchain.message\");\n\nexport interface StoredMessageData {\n content: string;\n role: string | undefined;\n name: string | undefined;\n tool_call_id: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additional_kwargs?: Record<string, any>;\n /** Response metadata. For example: response headers, logprobs, token counts, model name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response_metadata?: Record<string, any>;\n id?: string;\n}\n\nexport interface StoredMessage {\n type: string;\n data: StoredMessageData;\n}\n\nexport interface StoredGeneration {\n text: string;\n message?: StoredMessage;\n}\n\nexport interface StoredMessageV1 {\n type: string;\n role: string | undefined;\n text: string;\n}\n\nexport type MessageContent = string | Array<ContentBlock>;\n\nexport interface FunctionCall {\n /**\n * The arguments to call the function with, as generated by the model in JSON\n * format. Note that the model does not always generate valid JSON, and may\n * hallucinate parameters not defined by your function schema. Validate the\n * arguments in your code before calling your function.\n */\n arguments: string;\n\n /**\n * The name of the function to call.\n */\n name: string;\n}\n\nexport type BaseMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> = Pick<Message, \"id\" | \"name\"> & {\n content?: $InferMessageContent<TStructure, TRole>;\n contentBlocks?: Array<ContentBlock.Standard>;\n /** @deprecated */\n additional_kwargs?: {\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n function_call?: FunctionCall;\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n tool_calls?: OpenAIToolCall[];\n [key: string]: unknown;\n };\n response_metadata?: Partial<$InferResponseMetadata<TStructure, TRole>>;\n};\n\nexport function mergeContent(\n firstContent: MessageContent,\n secondContent: MessageContent\n): MessageContent {\n // If first content is a string\n if (typeof firstContent === \"string\") {\n if (firstContent === \"\") {\n return secondContent;\n }\n if (typeof secondContent === \"string\") {\n return firstContent + secondContent;\n } else if (Array.isArray(secondContent) && secondContent.length === 0) {\n return firstContent;\n } else if (\n Array.isArray(secondContent) &&\n secondContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n {\n type: \"text\",\n source_type: \"text\",\n text: firstContent,\n },\n ...secondContent,\n ];\n } else {\n return [{ type: \"text\", text: firstContent }, ...secondContent];\n }\n // If both are arrays\n } else if (Array.isArray(secondContent)) {\n return (\n _mergeLists(firstContent, secondContent) ?? [\n ...firstContent,\n ...secondContent,\n ]\n );\n } else {\n if (secondContent === \"\") {\n return firstContent;\n } else if (\n Array.isArray(firstContent) &&\n firstContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n ...firstContent,\n {\n type: \"file\",\n source_type: \"text\",\n text: secondContent,\n },\n ];\n } else {\n return [...firstContent, { type: \"text\", text: secondContent }];\n }\n }\n}\n\n/**\n * 'Merge' two statuses. If either value passed is 'error', it will return 'error'. Else\n * it will return 'success'.\n *\n * @param {\"success\" | \"error\" | undefined} left The existing value to 'merge' with the new value.\n * @param {\"success\" | \"error\" | undefined} right The new value to 'merge' with the existing value\n * @returns {\"success\" | \"error\"} The 'merged' value.\n */\nexport function _mergeStatus(\n left?: \"success\" | \"error\",\n right?: \"success\" | \"error\"\n): \"success\" | \"error\" | undefined {\n if (left === \"error\" || right === \"error\") {\n return \"error\";\n }\n return \"success\";\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction stringifyWithDepthLimit(obj: any, depthLimit: number): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function helper(obj: any, currentDepth: number): any {\n if (typeof obj !== \"object\" || obj === null || obj === undefined) {\n return obj;\n }\n if (currentDepth >= depthLimit) {\n if (Array.isArray(obj)) {\n return \"[Array]\";\n }\n return \"[Object]\";\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => helper(item, currentDepth + 1));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = helper(obj[key], currentDepth + 1);\n }\n return result;\n }\n\n return JSON.stringify(helper(obj, 0), null, 2);\n}\n\n/**\n * Base class for all types of messages in a conversation. It includes\n * properties like `content`, `name`, and `additional_kwargs`. It also\n * includes methods like `toDict()` and `_getType()`.\n */\nexport abstract class BaseMessage<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n>\n extends Serializable\n implements Message<TStructure, TRole>\n{\n lc_namespace = [\"langchain_core\", \"messages\"];\n\n lc_serializable = true;\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n additional_kwargs: \"additional_kwargs\",\n response_metadata: \"response_metadata\",\n };\n }\n\n readonly [MESSAGE_SYMBOL] = true as const;\n\n abstract readonly type: TRole;\n\n id?: string;\n\n /** @inheritdoc */\n name?: string;\n\n content: $InferMessageContent<TStructure, TRole>;\n\n additional_kwargs: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"additional_kwargs\"]\n >;\n\n response_metadata: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"response_metadata\"]\n >;\n\n /**\n * @deprecated Use .getType() instead or import the proper typeguard.\n * For example:\n *\n * ```ts\n * import { isAIMessage } from \"@langchain/core/messages\";\n *\n * const message = new AIMessage(\"Hello!\");\n * isAIMessage(message); // true\n * ```\n */\n _getType(): MessageType {\n return this.type;\n }\n\n /**\n * @deprecated Use .type instead\n * The type of the message.\n */\n getType(): MessageType {\n return this._getType();\n }\n\n constructor(\n arg:\n | $InferMessageContent<TStructure, TRole>\n | BaseMessageFields<TStructure, TRole>\n ) {\n const fields: BaseMessageFields<TStructure, TRole> =\n typeof arg === \"string\" || Array.isArray(arg)\n ? ({ content: arg } as BaseMessageFields<TStructure, TRole>)\n : arg;\n if (!fields.additional_kwargs) {\n fields.additional_kwargs = {};\n }\n if (!fields.response_metadata) {\n fields.response_metadata = {};\n }\n super(fields);\n this.name = fields.name;\n if (fields.content === undefined && fields.contentBlocks !== undefined) {\n this.content = fields.contentBlocks as $InferMessageContent<\n TStructure,\n TRole\n >;\n this.response_metadata = {\n output_version: \"v1\",\n ...fields.response_metadata,\n };\n } else if (fields.content !== undefined) {\n this.content = fields.content ?? [];\n this.response_metadata = fields.response_metadata;\n } else {\n this.content = [] as $InferMessageContent<TStructure, TRole>;\n this.response_metadata = fields.response_metadata;\n }\n this.additional_kwargs = fields.additional_kwargs;\n this.id = fields.id;\n }\n\n /** Get text content of the message. */\n get text(): string {\n if (typeof this.content === \"string\") {\n return this.content;\n }\n if (!Array.isArray(this.content)) return \"\";\n return this.content\n .map((c) => {\n if (typeof c === \"string\") return c;\n if (c.type === \"text\") return c.text;\n return \"\";\n })\n .join(\"\");\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n const blocks: Array<ContentBlock> =\n typeof this.content === \"string\"\n ? [{ type: \"text\", text: this.content }]\n : this.content;\n const parsingSteps = [\n convertToV1FromDataContent,\n convertToV1FromChatCompletionsInput,\n convertToV1FromAnthropicInput,\n ];\n const parsedBlocks = parsingSteps.reduce(\n (blocks, step) => step(blocks),\n blocks\n );\n return parsedBlocks as Array<ContentBlock.Standard>;\n }\n\n toDict(): StoredMessage {\n return {\n type: this.getType(),\n data: (this.toJSON() as SerializedConstructor)\n .kwargs as StoredMessageData,\n };\n }\n\n static lc_name() {\n return \"BaseMessage\";\n }\n\n // Can't be protected for silly reasons\n get _printableFields(): Record<string, unknown> {\n return {\n id: this.id,\n content: this.content,\n name: this.name,\n additional_kwargs: this.additional_kwargs,\n response_metadata: this.response_metadata,\n };\n }\n\n static isInstance(obj: unknown): obj is BaseMessage {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n MESSAGE_SYMBOL in obj &&\n (obj as Record<symbol, unknown>)[MESSAGE_SYMBOL] === true &&\n isMessage(obj)\n );\n }\n\n // this private method is used to update the ID for the runtime\n // value as well as in lc_kwargs for serialisation\n _updateId(value: string | undefined) {\n this.id = value;\n\n // lc_attributes wouldn't work here, because jest compares the\n // whole object\n this.lc_kwargs.id = value;\n }\n\n get [Symbol.toStringTag]() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.constructor as any).lc_name();\n }\n\n // Override the default behavior of console.log\n [Symbol.for(\"nodejs.util.inspect.custom\")](depth: number | null) {\n if (depth === null) {\n return this;\n }\n const printable = stringifyWithDepthLimit(\n this._printableFields,\n Math.max(4, depth)\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `${(this.constructor as any).lc_name()} ${printable}`;\n }\n\n toFormattedString(format: MessageStringFormat = \"pretty\"): string {\n return convertToFormattedString(this, format);\n }\n}\n\n/**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\nexport type OpenAIToolCall = {\n /**\n * The ID of the tool call.\n */\n id: string;\n\n /**\n * The function that the model called.\n */\n function: FunctionCall;\n\n /**\n * The type of the tool. Currently, only `function` is supported.\n */\n type: \"function\";\n\n index?: number;\n};\n\nexport function isOpenAIToolCallArray(\n value?: unknown\n): value is OpenAIToolCall[] {\n return (\n Array.isArray(value) &&\n value.every((v) => typeof (v as OpenAIToolCall).index === \"number\")\n );\n}\n\n/**\n * Default keys that should be preserved (not merged) when concatenating message chunks.\n * These are identification and timestamp fields that shouldn't be summed or concatenated.\n */\nexport const DEFAULT_MERGE_IGNORE_KEYS: readonly string[] = [\n \"index\", // Used for identification in tool calls, not accumulation\n \"created\", // Timestamp field\n \"timestamp\", // Timestamp field\n] as const;\n\n/**\n * Options for controlling merge behavior in `_mergeDicts`.\n */\nexport interface MergeDictsOptions {\n /**\n * Keys to ignore during merging. When a key is in this list:\n * - For numeric values: the original value is preserved (not summed)\n * - For string values: the original value is preserved (not concatenated)\n *\n * Defaults to `DEFAULT_MERGE_IGNORE_KEYS` which includes 'index', 'created', 'timestamp'.\n *\n * @example\n * // Extend defaults with custom keys\n * { ignoreKeys: [...DEFAULT_MERGE_IGNORE_KEYS, 'role', 'customField'] }\n */\n ignoreKeys?: readonly string[];\n}\n\nexport function _mergeDicts(\n /**\n * The left dictionary to merge.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n left: Record<string, any> | undefined,\n /**\n * The right dictionary to merge.\n * @type {Record<string, any>}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n right: Record<string, any> | undefined,\n /**\n * The options for the merge.\n */\n options?: MergeDictsOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> | undefined {\n /**\n * The keys to ignore during merging.\n */\n const ignoreKeys = options?.ignoreKeys ?? DEFAULT_MERGE_IGNORE_KEYS;\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n }\n const merged = { ...left };\n for (const [key, value] of Object.entries(right)) {\n if (merged[key] == null) {\n merged[key] = value;\n } else if (value == null) {\n continue;\n } else if (\n typeof merged[key] !== typeof value ||\n Array.isArray(merged[key]) !== Array.isArray(value)\n ) {\n throw new Error(\n `field[${key}] already exists in the message chunk, but with a different type.`\n );\n } else if (typeof merged[key] === \"string\") {\n if (key === \"type\") {\n // Do not merge 'type' fields\n continue;\n } else if (\n [\"id\", \"name\", \"output_version\", \"model_provider\"].includes(key)\n ) {\n // Keep the incoming value for these fields if its defined\n if (value) {\n merged[key] = value;\n }\n } else if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n } else {\n merged[key] += value;\n }\n } else if (typeof merged[key] === \"number\") {\n if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n }\n merged[key] = merged[key] + value;\n } else if (typeof merged[key] === \"object\" && !Array.isArray(merged[key])) {\n merged[key] = _mergeDicts(merged[key], value, options);\n } else if (Array.isArray(merged[key])) {\n merged[key] = _mergeLists(merged[key], value, options);\n } else if (merged[key] === value) {\n continue;\n } else {\n console.warn(\n `field[${key}] already exists in this message chunk and value has unsupported type.`\n );\n }\n }\n return merged;\n}\n\nfunction isMergeableIndex(index: unknown): index is number | string {\n return typeof index === \"number\" || typeof index === \"string\";\n}\n\nfunction hasMergeableIndex(\n value: unknown\n): value is { index: number | string } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"index\" in value)) return false;\n return isMergeableIndex(value.index);\n}\n\nexport function _mergeLists<Content extends ContentBlock>(\n left?: Content[],\n right?: Content[],\n options?: MergeDictsOptions\n): Content[] | undefined {\n if (left == null && right == null) {\n return undefined;\n } else if (left == null || right == null) {\n return left || right;\n } else {\n const merged = [...left];\n for (const item of right) {\n if (hasMergeableIndex(item)) {\n const toMerge = merged.findIndex((leftItem) => {\n if (!hasMergeableIndex(leftItem)) return false;\n\n const indiciesMatch = leftItem.index === item.index;\n const leftHasId = leftItem.id != null && leftItem.id !== \"\";\n const rightHasId = item.id != null && item.id !== \"\";\n const idsMatch = leftHasId && rightHasId && leftItem.id === item.id;\n const eitherItemMissingID = !leftHasId || !rightHasId;\n return indiciesMatch && (idsMatch || eitherItemMissingID);\n });\n\n if (\n toMerge !== -1 &&\n typeof merged[toMerge] === \"object\" &&\n merged[toMerge] !== null\n ) {\n merged[toMerge] = _mergeDicts(\n merged[toMerge] as Record<string, unknown>,\n item as Record<string, unknown>,\n options\n ) as Content;\n } else {\n merged.push(item);\n }\n } else if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n item.text === \"\"\n ) {\n continue;\n } else {\n merged.push(item);\n }\n }\n return merged;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _mergeObj<T = any>(\n left: T | undefined,\n right: T | undefined,\n options?: MergeDictsOptions\n): T | undefined {\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n } else if (typeof left !== typeof right) {\n throw new Error(\n `Cannot merge objects of different types.\\nLeft ${typeof left}\\nRight ${typeof right}`\n );\n } else if (typeof left === \"string\" && typeof right === \"string\") {\n return (left + right) as T;\n } else if (Array.isArray(left) && Array.isArray(right)) {\n return _mergeLists(left, right, options) as T;\n } else if (typeof left === \"object\" && typeof right === \"object\") {\n return _mergeDicts(\n left as Record<string, unknown>,\n right as Record<string, unknown>,\n options\n ) as T;\n } else if (left === right) {\n return left;\n } else {\n throw new Error(\n `Can not merge objects of different types.\\nLeft ${left}\\nRight ${right}`\n );\n }\n}\n\n/**\n * Represents a chunk of a message, which can be concatenated with other\n * message chunks. It includes a method `_merge_kwargs_dict()` for merging\n * additional keyword arguments from another `BaseMessageChunk` into this\n * one. It also overrides the `__add__()` method to support concatenation\n * of `BaseMessageChunk` instances.\n */\nexport abstract class BaseMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> extends BaseMessage<TStructure, TRole> {\n abstract concat(chunk: BaseMessageChunk): BaseMessageChunk<TStructure, TRole>;\n\n static isInstance(obj: unknown): obj is BaseMessageChunk {\n if (!super.isInstance(obj)) {\n return false;\n }\n // Check if obj is an instance of BaseMessageChunk by traversing the prototype chain\n let proto = Object.getPrototypeOf(obj);\n while (proto !== null) {\n if (proto === BaseMessageChunk.prototype) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n }\n}\n\nexport type MessageFieldWithRole = {\n role: MessageType;\n content: MessageContent;\n name?: string;\n} & Record<string, unknown>;\n\nexport function _isMessageFieldWithRole(\n x: BaseMessageLike\n): x is MessageFieldWithRole {\n return typeof (x as MessageFieldWithRole).role === \"string\";\n}\n\nexport type BaseMessageLike =\n | BaseMessage\n | MessageFieldWithRole\n | [MessageType, MessageContent]\n | string\n /**\n * @deprecated Specifying \"type\" is deprecated and will be removed in 0.4.0.\n */\n | ({\n type: MessageType | \"user\" | \"assistant\" | \"placeholder\";\n } & BaseMessageFields &\n Record<string, unknown>)\n | SerializedConstructor;\n\n/**\n * @deprecated Use {@link BaseMessage.isInstance} instead\n */\nexport function isBaseMessage(\n messageLike?: unknown\n): messageLike is BaseMessage {\n return typeof (messageLike as BaseMessage)?._getType === \"function\";\n}\n\n/**\n * @deprecated Use {@link BaseMessageChunk.isInstance} instead\n */\nexport function isBaseMessageChunk(\n messageLike?: unknown\n): messageLike is BaseMessageChunk {\n return BaseMessageChunk.isInstance(messageLike);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../src/messages/base.ts"],"sourcesContent":["import { Serializable, SerializedConstructor } from \"../load/serializable.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport { isDataContentBlock } from \"./content/data.js\";\nimport { convertToV1FromAnthropicInput } from \"./block_translators/anthropic.js\";\nimport { convertToV1FromDataContent } from \"./block_translators/data.js\";\nimport { convertToV1FromChatCompletionsInput } from \"./block_translators/openai.js\";\nimport {\n $InferMessageContent,\n $InferResponseMetadata,\n MessageStructure,\n MessageType,\n isMessage,\n Message,\n} from \"./message.js\";\nimport {\n convertToFormattedString,\n type MessageStringFormat,\n} from \"./format.js\";\n\n/** @internal */\nconst MESSAGE_SYMBOL: symbol = Symbol.for(\"langchain.message\");\n\nexport interface StoredMessageData {\n content: string;\n role: string | undefined;\n name: string | undefined;\n tool_call_id: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additional_kwargs?: Record<string, any>;\n /** Response metadata. For example: response headers, logprobs, token counts, model name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response_metadata?: Record<string, any>;\n id?: string;\n}\n\nexport interface StoredMessage {\n type: string;\n data: StoredMessageData;\n}\n\nexport interface StoredGeneration {\n text: string;\n message?: StoredMessage;\n}\n\nexport interface StoredMessageV1 {\n type: string;\n role: string | undefined;\n text: string;\n}\n\nexport type MessageContent = string | Array<ContentBlock>;\n\nexport interface FunctionCall {\n /**\n * The arguments to call the function with, as generated by the model in JSON\n * format. Note that the model does not always generate valid JSON, and may\n * hallucinate parameters not defined by your function schema. Validate the\n * arguments in your code before calling your function.\n */\n arguments: string;\n\n /**\n * The name of the function to call.\n */\n name: string;\n}\n\nexport type BaseMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> = Pick<Message, \"id\" | \"name\"> & {\n content?: $InferMessageContent<TStructure, TRole>;\n contentBlocks?: Array<ContentBlock.Standard>;\n /** @deprecated */\n additional_kwargs?: {\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n function_call?: FunctionCall;\n /**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\n tool_calls?: OpenAIToolCall[];\n [key: string]: unknown;\n };\n response_metadata?: Partial<$InferResponseMetadata<TStructure, TRole>>;\n};\n\nexport function mergeContent(\n firstContent: MessageContent,\n secondContent: MessageContent\n): MessageContent {\n // If first content is a string\n if (typeof firstContent === \"string\") {\n if (firstContent === \"\") {\n return secondContent;\n }\n if (typeof secondContent === \"string\") {\n return firstContent + secondContent;\n } else if (Array.isArray(secondContent) && secondContent.length === 0) {\n return firstContent;\n } else if (\n Array.isArray(secondContent) &&\n secondContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n {\n type: \"text\",\n source_type: \"text\",\n text: firstContent,\n },\n ...secondContent,\n ];\n } else {\n return [{ type: \"text\", text: firstContent }, ...secondContent];\n }\n // If both are arrays\n } else if (Array.isArray(secondContent)) {\n return (\n _mergeLists(firstContent, secondContent) ?? [\n ...firstContent,\n ...secondContent,\n ]\n );\n } else {\n if (secondContent === \"\") {\n return firstContent;\n } else if (\n Array.isArray(firstContent) &&\n firstContent.some((c) => isDataContentBlock(c))\n ) {\n return [\n ...firstContent,\n {\n type: \"file\",\n source_type: \"text\",\n text: secondContent,\n },\n ];\n } else {\n return [...firstContent, { type: \"text\", text: secondContent }];\n }\n }\n}\n\n/**\n * 'Merge' two statuses. If either value passed is 'error', it will return 'error'. Else\n * it will return 'success'.\n *\n * @param {\"success\" | \"error\" | undefined} left The existing value to 'merge' with the new value.\n * @param {\"success\" | \"error\" | undefined} right The new value to 'merge' with the existing value\n * @returns {\"success\" | \"error\"} The 'merged' value.\n */\nexport function _mergeStatus(\n left?: \"success\" | \"error\",\n right?: \"success\" | \"error\"\n): \"success\" | \"error\" | undefined {\n if (left === \"error\" || right === \"error\") {\n return \"error\";\n }\n return \"success\";\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction stringifyWithDepthLimit(obj: any, depthLimit: number): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function helper(obj: any, currentDepth: number): any {\n if (typeof obj !== \"object\" || obj === null || obj === undefined) {\n return obj;\n }\n if (currentDepth >= depthLimit) {\n if (Array.isArray(obj)) {\n return \"[Array]\";\n }\n return \"[Object]\";\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => helper(item, currentDepth + 1));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = helper(obj[key], currentDepth + 1);\n }\n return result;\n }\n\n return JSON.stringify(helper(obj, 0), null, 2);\n}\n\n/**\n * Base class for all types of messages in a conversation. It includes\n * properties like `content`, `name`, and `additional_kwargs`. It also\n * includes methods like `toDict()` and `_getType()`.\n */\nexport abstract class BaseMessage<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n>\n extends Serializable\n implements Message<TStructure, TRole>\n{\n lc_namespace = [\"langchain_core\", \"messages\"];\n\n lc_serializable = true;\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n additional_kwargs: \"additional_kwargs\",\n response_metadata: \"response_metadata\",\n };\n }\n\n readonly [MESSAGE_SYMBOL] = true as const;\n\n abstract readonly type: TRole;\n\n id?: string;\n\n /** @inheritdoc */\n name?: string;\n\n content: $InferMessageContent<TStructure, TRole>;\n\n additional_kwargs: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"additional_kwargs\"]\n >;\n\n response_metadata: NonNullable<\n BaseMessageFields<TStructure, TRole>[\"response_metadata\"]\n >;\n\n /**\n * @deprecated Use .getType() instead or import the proper typeguard.\n * For example:\n *\n * ```ts\n * import { isAIMessage } from \"@langchain/core/messages\";\n *\n * const message = new AIMessage(\"Hello!\");\n * isAIMessage(message); // true\n * ```\n */\n _getType(): MessageType {\n return this.type;\n }\n\n /**\n * @deprecated Use .type instead\n * The type of the message.\n */\n getType(): MessageType {\n return this._getType();\n }\n\n constructor(\n arg:\n | $InferMessageContent<TStructure, TRole>\n | BaseMessageFields<TStructure, TRole>\n ) {\n const fields: BaseMessageFields<TStructure, TRole> =\n typeof arg === \"string\" || Array.isArray(arg)\n ? ({ content: arg } as BaseMessageFields<TStructure, TRole>)\n : arg;\n if (!fields.additional_kwargs) {\n fields.additional_kwargs = {};\n }\n if (!fields.response_metadata) {\n fields.response_metadata = {};\n }\n super(fields);\n this.name = fields.name;\n if (fields.content === undefined && fields.contentBlocks !== undefined) {\n this.content = fields.contentBlocks as $InferMessageContent<\n TStructure,\n TRole\n >;\n this.response_metadata = {\n output_version: \"v1\",\n ...fields.response_metadata,\n };\n } else if (fields.content !== undefined) {\n this.content = fields.content ?? [];\n this.response_metadata = fields.response_metadata;\n } else {\n this.content = [] as $InferMessageContent<TStructure, TRole>;\n this.response_metadata = fields.response_metadata;\n }\n this.additional_kwargs = fields.additional_kwargs;\n this.id = fields.id;\n }\n\n /** Get text content of the message. */\n get text(): string {\n if (typeof this.content === \"string\") {\n return this.content;\n }\n if (!Array.isArray(this.content)) return \"\";\n return this.content\n .map((c) => {\n if (typeof c === \"string\") return c;\n if (c.type === \"text\") return c.text;\n return \"\";\n })\n .join(\"\");\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n const blocks: Array<ContentBlock> =\n typeof this.content === \"string\"\n ? [{ type: \"text\", text: this.content }]\n : this.content;\n const parsingSteps = [\n convertToV1FromDataContent,\n convertToV1FromChatCompletionsInput,\n convertToV1FromAnthropicInput,\n ];\n const parsedBlocks = parsingSteps.reduce(\n (blocks, step) => step(blocks),\n blocks\n );\n return parsedBlocks as Array<ContentBlock.Standard>;\n }\n\n toDict(): StoredMessage {\n return {\n type: this.getType(),\n data: (this.toJSON() as SerializedConstructor)\n .kwargs as StoredMessageData,\n };\n }\n\n static lc_name() {\n return \"BaseMessage\";\n }\n\n // Can't be protected for silly reasons\n get _printableFields(): Record<string, unknown> {\n return {\n id: this.id,\n content: this.content,\n name: this.name,\n additional_kwargs: this.additional_kwargs,\n response_metadata: this.response_metadata,\n };\n }\n\n static isInstance(obj: unknown): obj is BaseMessage {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n MESSAGE_SYMBOL in obj &&\n (obj as Record<symbol, unknown>)[MESSAGE_SYMBOL] === true &&\n isMessage(obj)\n );\n }\n\n // this private method is used to update the ID for the runtime\n // value as well as in lc_kwargs for serialisation\n _updateId(value: string | undefined) {\n this.id = value;\n\n // lc_attributes wouldn't work here, because jest compares the\n // whole object\n this.lc_kwargs.id = value;\n }\n\n get [Symbol.toStringTag]() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.constructor as any).lc_name();\n }\n\n // Override the default behavior of console.log\n [Symbol.for(\"nodejs.util.inspect.custom\")](depth: number | null) {\n if (depth === null) {\n return this;\n }\n const printable = stringifyWithDepthLimit(\n this._printableFields,\n Math.max(4, depth)\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `${(this.constructor as any).lc_name()} ${printable}`;\n }\n\n toFormattedString(format: MessageStringFormat = \"pretty\"): string {\n return convertToFormattedString(this, format);\n }\n}\n\n/**\n * @deprecated Use \"tool_calls\" field on AIMessages instead\n */\nexport type OpenAIToolCall = {\n /**\n * The ID of the tool call.\n */\n id: string;\n\n /**\n * The function that the model called.\n */\n function: FunctionCall;\n\n /**\n * The type of the tool. Currently, only `function` is supported.\n */\n type: \"function\";\n\n index?: number;\n};\n\nexport function isOpenAIToolCallArray(\n value?: unknown\n): value is OpenAIToolCall[] {\n return (\n Array.isArray(value) &&\n value.every((v) => typeof (v as OpenAIToolCall).index === \"number\")\n );\n}\n\n/**\n * Default keys that should be preserved (not merged) when concatenating message chunks.\n * These are identification and timestamp fields that shouldn't be summed or concatenated.\n */\nexport const DEFAULT_MERGE_IGNORE_KEYS: readonly string[] = [\n \"index\", // Used for identification in tool calls, not accumulation\n \"created\", // Timestamp field\n \"timestamp\", // Timestamp field\n] as const;\n\n/**\n * Options for controlling merge behavior in `_mergeDicts`.\n */\nexport interface MergeDictsOptions {\n /**\n * Keys to ignore during merging. When a key is in this list:\n * - For numeric values: the original value is preserved (not summed)\n * - For string values: the original value is preserved (not concatenated)\n *\n * Defaults to `DEFAULT_MERGE_IGNORE_KEYS` which includes 'index', 'created', 'timestamp'.\n *\n * @example\n * // Extend defaults with custom keys\n * { ignoreKeys: [...DEFAULT_MERGE_IGNORE_KEYS, 'role', 'customField'] }\n */\n ignoreKeys?: readonly string[];\n}\n\nexport function _mergeDicts(\n /**\n * The left dictionary to merge.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n left: Record<string, any> | undefined,\n /**\n * The right dictionary to merge.\n * @type {Record<string, any>}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n right: Record<string, any> | undefined,\n /**\n * The options for the merge.\n */\n options?: MergeDictsOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> | undefined {\n /**\n * The keys to ignore during merging.\n */\n const ignoreKeys = options?.ignoreKeys ?? DEFAULT_MERGE_IGNORE_KEYS;\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n }\n const merged = { ...left };\n for (const [key, value] of Object.entries(right)) {\n if (merged[key] == null) {\n merged[key] = value;\n } else if (value == null) {\n continue;\n } else if (\n typeof merged[key] !== typeof value ||\n Array.isArray(merged[key]) !== Array.isArray(value)\n ) {\n throw new Error(\n `field[${key}] already exists in the message chunk, but with a different type.`\n );\n } else if (typeof merged[key] === \"string\") {\n if (key === \"type\") {\n // Do not merge 'type' fields\n continue;\n } else if (\n [\"id\", \"name\", \"output_version\", \"model_provider\"].includes(key)\n ) {\n // Keep the incoming value for these fields if its defined\n if (value) {\n merged[key] = value;\n }\n } else if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n } else {\n merged[key] += value;\n }\n } else if (typeof merged[key] === \"number\") {\n if (ignoreKeys.includes(key)) {\n // Preserve the original value for ignored keys\n continue;\n }\n merged[key] = merged[key] + value;\n } else if (typeof merged[key] === \"object\" && !Array.isArray(merged[key])) {\n merged[key] = _mergeDicts(merged[key], value, options);\n } else if (Array.isArray(merged[key])) {\n merged[key] = _mergeLists(merged[key], value, options);\n } else if (merged[key] === value) {\n continue;\n } else {\n console.warn(\n `field[${key}] already exists in this message chunk and value has unsupported type.`\n );\n }\n }\n return merged;\n}\n\nfunction isMergeableIndex(index: unknown): index is number | string {\n return typeof index === \"number\" || typeof index === \"string\";\n}\n\nfunction hasMergeableIndex(\n value: unknown\n): value is { index: number | string } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"index\" in value)) return false;\n return isMergeableIndex(value.index);\n}\n\nfunction hasMergeableId(value: unknown): value is { id: string | number } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"id\" in value)) return false;\n const id = (value as Record<string, unknown>).id;\n return id != null && id !== \"\";\n}\n\n/**\n * Find the index of an existing item in `merged` that should be merged with\n * `item`, based on index and/or id matching.\n *\n * Matching priority:\n * 1. Both have index → match on index (+ id when both present)\n * 2. Neither has index, both have id → match on id alone\n * 3. Otherwise → no match (item should be appended)\n */\nfunction _findMergeTarget<Content extends ContentBlock>(\n merged: Content[],\n item: Content\n): number {\n const itemHasIndex = hasMergeableIndex(item);\n const itemHasId = hasMergeableId(item);\n\n if (!itemHasIndex && !itemHasId) return -1;\n\n return merged.findIndex((leftItem) => {\n const leftHasIndex = hasMergeableIndex(leftItem);\n const leftHasId = hasMergeableId(leftItem);\n\n if (itemHasIndex && leftHasIndex) {\n // Both have index: match on index, with id as tiebreaker\n const indicesMatch = leftItem.index === item.index;\n if (!indicesMatch) return false;\n if (leftHasId && itemHasId) return leftItem.id === item.id;\n return true; // indices match, one or both missing id\n }\n\n if (!itemHasIndex && !leftHasIndex && itemHasId && leftHasId) {\n // Neither has index: fall back to id-only matching. Handles providers\n // that don't include `index` on streaming tool call deltas.\n return leftItem.id === item.id;\n }\n\n return false;\n });\n}\n\nexport function _mergeLists<Content extends ContentBlock>(\n left?: Content[],\n right?: Content[],\n options?: MergeDictsOptions\n): Content[] | undefined {\n if (left == null && right == null) {\n return undefined;\n } else if (left == null || right == null) {\n return left || right;\n } else {\n const merged = [...left];\n for (const item of right) {\n const toMerge = _findMergeTarget(merged, item);\n if (toMerge !== -1) {\n merged[toMerge] = _mergeDicts(\n merged[toMerge],\n item,\n options\n ) as Content;\n } else if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n item.text === \"\"\n ) {\n continue;\n } else {\n merged.push(item);\n }\n }\n return merged;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _mergeObj<T = any>(\n left: T | undefined,\n right: T | undefined,\n options?: MergeDictsOptions\n): T | undefined {\n if (left == null && right == null) {\n return undefined;\n }\n if (left == null || right == null) {\n return left ?? right;\n } else if (typeof left !== typeof right) {\n throw new Error(\n `Cannot merge objects of different types.\\nLeft ${typeof left}\\nRight ${typeof right}`\n );\n } else if (typeof left === \"string\" && typeof right === \"string\") {\n return (left + right) as T;\n } else if (Array.isArray(left) && Array.isArray(right)) {\n return _mergeLists(left, right, options) as T;\n } else if (typeof left === \"object\" && typeof right === \"object\") {\n return _mergeDicts(\n left as Record<string, unknown>,\n right as Record<string, unknown>,\n options\n ) as T;\n } else if (left === right) {\n return left;\n } else {\n throw new Error(\n `Can not merge objects of different types.\\nLeft ${left}\\nRight ${right}`\n );\n }\n}\n\n/**\n * Represents a chunk of a message, which can be concatenated with other\n * message chunks. It includes a method `_merge_kwargs_dict()` for merging\n * additional keyword arguments from another `BaseMessageChunk` into this\n * one. It also overrides the `__add__()` method to support concatenation\n * of `BaseMessageChunk` instances.\n */\nexport abstract class BaseMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n TRole extends MessageType = MessageType,\n> extends BaseMessage<TStructure, TRole> {\n abstract concat(chunk: BaseMessageChunk): BaseMessageChunk<TStructure, TRole>;\n\n static isInstance(obj: unknown): obj is BaseMessageChunk {\n if (!super.isInstance(obj)) {\n return false;\n }\n // Check if obj is an instance of BaseMessageChunk by traversing the prototype chain\n let proto = Object.getPrototypeOf(obj);\n while (proto !== null) {\n if (proto === BaseMessageChunk.prototype) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n }\n}\n\nexport type MessageFieldWithRole = {\n role: MessageType;\n content: MessageContent;\n name?: string;\n} & Record<string, unknown>;\n\nexport function _isMessageFieldWithRole(\n x: BaseMessageLike\n): x is MessageFieldWithRole {\n return typeof (x as MessageFieldWithRole).role === \"string\";\n}\n\nexport type BaseMessageLike =\n | BaseMessage\n | MessageFieldWithRole\n | [MessageType, MessageContent]\n | string\n /**\n * @deprecated Specifying \"type\" is deprecated and will be removed in 0.4.0.\n */\n | ({\n type: MessageType | \"user\" | \"assistant\" | \"placeholder\";\n } & BaseMessageFields &\n Record<string, unknown>)\n | SerializedConstructor;\n\n/**\n * @deprecated Use {@link BaseMessage.isInstance} instead\n */\nexport function isBaseMessage(\n messageLike?: unknown\n): messageLike is BaseMessage {\n return typeof (messageLike as BaseMessage)?._getType === \"function\";\n}\n\n/**\n * @deprecated Use {@link BaseMessageChunk.isInstance} instead\n */\nexport function isBaseMessageChunk(\n messageLike?: unknown\n): messageLike is BaseMessageChunk {\n return BaseMessageChunk.isInstance(messageLike);\n}\n"],"mappings":"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"}
@@ -18,11 +18,14 @@ var SystemMessage = class SystemMessage extends require_base.BaseMessage {
18
18
  */
19
19
  concat(chunk) {
20
20
  if (typeof chunk === "string") return new SystemMessage({
21
- ...this,
22
- content: require_base.mergeContent(this.content, chunk)
21
+ content: require_base.mergeContent(this.content, chunk),
22
+ additional_kwargs: this.additional_kwargs,
23
+ response_metadata: this.response_metadata,
24
+ id: this.id,
25
+ name: this.name
23
26
  });
24
27
  if (SystemMessage.isInstance(chunk)) return new SystemMessage({
25
- ...this,
28
+ content: require_base.mergeContent(this.content, chunk.content),
26
29
  additional_kwargs: {
27
30
  ...this.additional_kwargs,
28
31
  ...chunk.additional_kwargs
@@ -31,7 +34,8 @@ var SystemMessage = class SystemMessage extends require_base.BaseMessage {
31
34
  ...this.response_metadata,
32
35
  ...chunk.response_metadata
33
36
  },
34
- content: require_base.mergeContent(this.content, chunk.content)
37
+ id: this.id ?? chunk.id,
38
+ name: this.name ?? chunk.name
35
39
  });
36
40
  throw new Error("Unexpected chunk type for system message");
37
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"system.cjs","names":["BaseMessage","mergeContent","BaseMessageChunk","_mergeDicts"],"sources":["../../src/messages/system.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n type BaseMessageFields,\n} from \"./base.js\";\nimport { $InferMessageContent, MessageStructure } from \"./message.js\";\nimport { Constructor } from \"./utils.js\";\n\nexport interface SystemMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"system\"> {}\n\n/**\n * Represents a system message in a conversation.\n */\nexport class SystemMessage<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessage<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessage\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n /**\n * Concatenates a string or another system message with the current system message.\n * @param chunk - The chunk to concatenate with the system message.\n * @returns A new system message with the concatenated content.\n */\n concat(chunk: string | SystemMessage) {\n if (typeof chunk === \"string\") {\n return new SystemMessage({\n ...this,\n content: mergeContent(this.content, chunk),\n });\n }\n\n if (SystemMessage.isInstance(chunk)) {\n return new SystemMessage({\n ...this,\n additional_kwargs: {\n ...this.additional_kwargs,\n ...chunk.additional_kwargs,\n },\n response_metadata: {\n ...this.response_metadata,\n ...chunk.response_metadata,\n },\n content: mergeContent(this.content, chunk.content),\n });\n }\n\n throw new Error(\"Unexpected chunk type for system message\");\n }\n\n static isInstance(obj: unknown): obj is SystemMessage {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * Represents a chunk of a system message, which can be concatenated with\n * other system message chunks.\n */\nexport class SystemMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageChunk<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessageChunk\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n concat(chunk: SystemMessageChunk<TStructure>) {\n const Cls = this.constructor as Constructor<this>;\n return new Cls({\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: _mergeDicts(\n this.response_metadata,\n chunk.response_metadata\n ),\n id: this.id ?? chunk.id,\n });\n }\n\n static isInstance(obj: unknown): obj is SystemMessageChunk {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * @deprecated Use {@link SystemMessage.isInstance} instead\n */\nexport function isSystemMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is SystemMessage<TStructure> {\n return x._getType() === \"system\";\n}\n\n/**\n * @deprecated Use {@link SystemMessageChunk.isInstance} instead\n */\nexport function isSystemMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is SystemMessageChunk<TStructure> {\n return x._getType() === \"system\";\n}\n"],"mappings":";;;;;AAiBA,IAAa,gBAAb,MAAa,sBAEHA,aAAAA,YAAkC;CAC1C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;;;;;;CAQf,OAAO,OAA+B;AACpC,MAAI,OAAO,UAAU,SACnB,QAAO,IAAI,cAAc;GACvB,GAAG;GACH,SAASC,aAAAA,aAAa,KAAK,SAAS,MAAM;GAC3C,CAAC;AAGJ,MAAI,cAAc,WAAW,MAAM,CACjC,QAAO,IAAI,cAAc;GACvB,GAAG;GACH,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,SAASA,aAAAA,aAAa,KAAK,SAAS,MAAM,QAAQ;GACnD,CAAC;AAGJ,QAAM,IAAI,MAAM,2CAA2C;;CAG7D,OAAO,WAAW,KAAoC;AACpD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;;AAQjD,IAAa,qBAAb,cAEUC,aAAAA,iBAAuC;CAC/C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;CAGf,OAAO,OAAuC;EAC5C,MAAM,MAAM,KAAK;AACjB,SAAO,IAAI,IAAI;GACb,SAASD,aAAAA,aAAa,KAAK,SAAS,MAAM,QAAQ;GAClD,mBAAmBE,aAAAA,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,mBAAmBA,aAAAA,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,IAAI,KAAK,MAAM,MAAM;GACtB,CAAC;;CAGJ,OAAO,WAAW,KAAyC;AACzD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;AAOjD,SAAgB,gBACd,GACgC;AAChC,QAAO,EAAE,UAAU,KAAK;;;;;AAM1B,SAAgB,qBACd,GACqC;AACrC,QAAO,EAAE,UAAU,KAAK"}
1
+ {"version":3,"file":"system.cjs","names":["BaseMessage","mergeContent","BaseMessageChunk","_mergeDicts"],"sources":["../../src/messages/system.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n type BaseMessageFields,\n} from \"./base.js\";\nimport { $InferMessageContent, MessageStructure } from \"./message.js\";\nimport { Constructor } from \"./utils.js\";\n\nexport interface SystemMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"system\"> {}\n\n/**\n * Represents a system message in a conversation.\n */\nexport class SystemMessage<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessage<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessage\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n /**\n * Concatenates a string or another system message with the current system message.\n * @param chunk - The chunk to concatenate with the system message.\n * @returns A new system message with the concatenated content.\n */\n concat(chunk: string | SystemMessage) {\n if (typeof chunk === \"string\") {\n return new SystemMessage({\n content: mergeContent(this.content, chunk),\n additional_kwargs: this.additional_kwargs,\n response_metadata: this.response_metadata,\n id: this.id,\n name: this.name,\n } as SystemMessageFields<TStructure>);\n }\n\n if (SystemMessage.isInstance(chunk)) {\n return new SystemMessage({\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: {\n ...this.additional_kwargs,\n ...chunk.additional_kwargs,\n },\n response_metadata: {\n ...this.response_metadata,\n ...chunk.response_metadata,\n },\n id: this.id ?? chunk.id,\n name: this.name ?? chunk.name,\n } as SystemMessageFields<TStructure>);\n }\n\n throw new Error(\"Unexpected chunk type for system message\");\n }\n\n static isInstance(obj: unknown): obj is SystemMessage {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * Represents a chunk of a system message, which can be concatenated with\n * other system message chunks.\n */\nexport class SystemMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageChunk<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessageChunk\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n concat(chunk: SystemMessageChunk<TStructure>) {\n const Cls = this.constructor as Constructor<this>;\n return new Cls({\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: _mergeDicts(\n this.response_metadata,\n chunk.response_metadata\n ),\n id: this.id ?? chunk.id,\n });\n }\n\n static isInstance(obj: unknown): obj is SystemMessageChunk {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * @deprecated Use {@link SystemMessage.isInstance} instead\n */\nexport function isSystemMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is SystemMessage<TStructure> {\n return x._getType() === \"system\";\n}\n\n/**\n * @deprecated Use {@link SystemMessageChunk.isInstance} instead\n */\nexport function isSystemMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is SystemMessageChunk<TStructure> {\n return x._getType() === \"system\";\n}\n"],"mappings":";;;;;AAiBA,IAAa,gBAAb,MAAa,sBAEHA,aAAAA,YAAkC;CAC1C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;;;;;;CAQf,OAAO,OAA+B;AACpC,MAAI,OAAO,UAAU,SACnB,QAAO,IAAI,cAAc;GACvB,SAASC,aAAAA,aAAa,KAAK,SAAS,MAAM;GAC1C,mBAAmB,KAAK;GACxB,mBAAmB,KAAK;GACxB,IAAI,KAAK;GACT,MAAM,KAAK;GACZ,CAAoC;AAGvC,MAAI,cAAc,WAAW,MAAM,CACjC,QAAO,IAAI,cAAc;GACvB,SAASA,aAAAA,aAAa,KAAK,SAAS,MAAM,QAAQ;GAClD,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,IAAI,KAAK,MAAM,MAAM;GACrB,MAAM,KAAK,QAAQ,MAAM;GAC1B,CAAoC;AAGvC,QAAM,IAAI,MAAM,2CAA2C;;CAG7D,OAAO,WAAW,KAAoC;AACpD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;;AAQjD,IAAa,qBAAb,cAEUC,aAAAA,iBAAuC;CAC/C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;CAGf,OAAO,OAAuC;EAC5C,MAAM,MAAM,KAAK;AACjB,SAAO,IAAI,IAAI;GACb,SAASD,aAAAA,aAAa,KAAK,SAAS,MAAM,QAAQ;GAClD,mBAAmBE,aAAAA,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,mBAAmBA,aAAAA,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,IAAI,KAAK,MAAM,MAAM;GACtB,CAAC;;CAGJ,OAAO,WAAW,KAAyC;AACzD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;AAOjD,SAAgB,gBACd,GACgC;AAChC,QAAO,EAAE,UAAU,KAAK;;;;;AAM1B,SAAgB,qBACd,GACqC;AACrC,QAAO,EAAE,UAAU,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"system.d.cts","names":[],"sources":["../../src/messages/system.ts"],"mappings":";;;;UAUiB,mBAAA,oBACI,gBAAA,GAAmB,gBAAA,UAC9B,iBAAA,CAAkB,UAAA;AAF5B;;;AAAA,cAOa,aAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,WAAA,CAAY,UAAA;EAAA,OACb,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAjBD;;;;;EA2BzB,MAAA,CAAO,KAAA,WAAgB,aAAA,GAAa,aAAA,CAAA,UAAA;EAAA,OA0B7B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,aAAA;AAAA;;AAhD1C;;;cAyDa,kBAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,gBAAA,CAAiB,UAAA;EAAA,OAClB,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAK1B,MAAA,CAAO,KAAA,EAAO,kBAAA,CAAmB,UAAA;EAAA,OAgB1B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,kBAAA;AAAA;;;;iBAQ1B,eAAA,oBAAmC,gBAAA,CAAA,CACjD,CAAA,EAAG,WAAA,GACF,CAAA,IAAK,aAAA,CAAc,UAAA;;;;iBAON,oBAAA,oBAAwC,gBAAA,CAAA,CACtD,CAAA,EAAG,gBAAA,GACF,CAAA,IAAK,kBAAA,CAAmB,UAAA"}
1
+ {"version":3,"file":"system.d.cts","names":[],"sources":["../../src/messages/system.ts"],"mappings":";;;;UAUiB,mBAAA,oBACI,gBAAA,GAAmB,gBAAA,UAC9B,iBAAA,CAAkB,UAAA;AAF5B;;;AAAA,cAOa,aAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,WAAA,CAAY,UAAA;EAAA,OACb,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAjBD;;;;;EA2BzB,MAAA,CAAO,KAAA,WAAgB,aAAA,GAAa,aAAA,CAAA,UAAA;EAAA,OA8B7B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,aAAA;AAAA;;AApD1C;;;cA6Da,kBAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,gBAAA,CAAiB,UAAA;EAAA,OAClB,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAK1B,MAAA,CAAO,KAAA,EAAO,kBAAA,CAAmB,UAAA;EAAA,OAgB1B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,kBAAA;AAAA;;;;iBAQ1B,eAAA,oBAAmC,gBAAA,CAAA,CACjD,CAAA,EAAG,WAAA,GACF,CAAA,IAAK,aAAA,CAAc,UAAA;;;;iBAON,oBAAA,oBAAwC,gBAAA,CAAA,CACtD,CAAA,EAAG,gBAAA,GACF,CAAA,IAAK,kBAAA,CAAmB,UAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"system.d.ts","names":[],"sources":["../../src/messages/system.ts"],"mappings":";;;;UAUiB,mBAAA,oBACI,gBAAA,GAAmB,gBAAA,UAC9B,iBAAA,CAAkB,UAAA;AAF5B;;;AAAA,cAOa,aAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,WAAA,CAAY,UAAA;EAAA,OACb,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAjBD;;;;;EA2BzB,MAAA,CAAO,KAAA,WAAgB,aAAA,GAAa,aAAA,CAAA,UAAA;EAAA,OA0B7B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,aAAA;AAAA;;AAhD1C;;;cAyDa,kBAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,gBAAA,CAAiB,UAAA;EAAA,OAClB,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAK1B,MAAA,CAAO,KAAA,EAAO,kBAAA,CAAmB,UAAA;EAAA,OAgB1B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,kBAAA;AAAA;;;;iBAQ1B,eAAA,oBAAmC,gBAAA,CAAA,CACjD,CAAA,EAAG,WAAA,GACF,CAAA,IAAK,aAAA,CAAc,UAAA;;;;iBAON,oBAAA,oBAAwC,gBAAA,CAAA,CACtD,CAAA,EAAG,gBAAA,GACF,CAAA,IAAK,kBAAA,CAAmB,UAAA"}
1
+ {"version":3,"file":"system.d.ts","names":[],"sources":["../../src/messages/system.ts"],"mappings":";;;;UAUiB,mBAAA,oBACI,gBAAA,GAAmB,gBAAA,UAC9B,iBAAA,CAAkB,UAAA;AAF5B;;;AAAA,cAOa,aAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,WAAA,CAAY,UAAA;EAAA,OACb,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAjBD;;;;;EA2BzB,MAAA,CAAO,KAAA,WAAgB,aAAA,GAAa,aAAA,CAAA,UAAA;EAAA,OA8B7B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,aAAA;AAAA;;AApD1C;;;cA6Da,kBAAA,oBACQ,gBAAA,GAAmB,gBAAA,UAC9B,gBAAA,CAAiB,UAAA;EAAA,OAClB,OAAA,CAAA;EAAA,SAIE,IAAA;EAET,WAAA,CACE,MAAA,EACI,oBAAA,CAAqB,UAAA,cACrB,mBAAA,CAAoB,UAAA;EAK1B,MAAA,CAAO,KAAA,EAAO,kBAAA,CAAmB,UAAA;EAAA,OAgB1B,UAAA,CAAW,GAAA,YAAe,GAAA,IAAO,kBAAA;AAAA;;;;iBAQ1B,eAAA,oBAAmC,gBAAA,CAAA,CACjD,CAAA,EAAG,WAAA,GACF,CAAA,IAAK,aAAA,CAAc,UAAA;;;;iBAON,oBAAA,oBAAwC,gBAAA,CAAA,CACtD,CAAA,EAAG,gBAAA,GACF,CAAA,IAAK,kBAAA,CAAmB,UAAA"}
@@ -18,11 +18,14 @@ var SystemMessage = class SystemMessage extends BaseMessage {
18
18
  */
19
19
  concat(chunk) {
20
20
  if (typeof chunk === "string") return new SystemMessage({
21
- ...this,
22
- content: mergeContent(this.content, chunk)
21
+ content: mergeContent(this.content, chunk),
22
+ additional_kwargs: this.additional_kwargs,
23
+ response_metadata: this.response_metadata,
24
+ id: this.id,
25
+ name: this.name
23
26
  });
24
27
  if (SystemMessage.isInstance(chunk)) return new SystemMessage({
25
- ...this,
28
+ content: mergeContent(this.content, chunk.content),
26
29
  additional_kwargs: {
27
30
  ...this.additional_kwargs,
28
31
  ...chunk.additional_kwargs
@@ -31,7 +34,8 @@ var SystemMessage = class SystemMessage extends BaseMessage {
31
34
  ...this.response_metadata,
32
35
  ...chunk.response_metadata
33
36
  },
34
- content: mergeContent(this.content, chunk.content)
37
+ id: this.id ?? chunk.id,
38
+ name: this.name ?? chunk.name
35
39
  });
36
40
  throw new Error("Unexpected chunk type for system message");
37
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","names":[],"sources":["../../src/messages/system.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n type BaseMessageFields,\n} from \"./base.js\";\nimport { $InferMessageContent, MessageStructure } from \"./message.js\";\nimport { Constructor } from \"./utils.js\";\n\nexport interface SystemMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"system\"> {}\n\n/**\n * Represents a system message in a conversation.\n */\nexport class SystemMessage<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessage<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessage\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n /**\n * Concatenates a string or another system message with the current system message.\n * @param chunk - The chunk to concatenate with the system message.\n * @returns A new system message with the concatenated content.\n */\n concat(chunk: string | SystemMessage) {\n if (typeof chunk === \"string\") {\n return new SystemMessage({\n ...this,\n content: mergeContent(this.content, chunk),\n });\n }\n\n if (SystemMessage.isInstance(chunk)) {\n return new SystemMessage({\n ...this,\n additional_kwargs: {\n ...this.additional_kwargs,\n ...chunk.additional_kwargs,\n },\n response_metadata: {\n ...this.response_metadata,\n ...chunk.response_metadata,\n },\n content: mergeContent(this.content, chunk.content),\n });\n }\n\n throw new Error(\"Unexpected chunk type for system message\");\n }\n\n static isInstance(obj: unknown): obj is SystemMessage {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * Represents a chunk of a system message, which can be concatenated with\n * other system message chunks.\n */\nexport class SystemMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageChunk<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessageChunk\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n concat(chunk: SystemMessageChunk<TStructure>) {\n const Cls = this.constructor as Constructor<this>;\n return new Cls({\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: _mergeDicts(\n this.response_metadata,\n chunk.response_metadata\n ),\n id: this.id ?? chunk.id,\n });\n }\n\n static isInstance(obj: unknown): obj is SystemMessageChunk {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * @deprecated Use {@link SystemMessage.isInstance} instead\n */\nexport function isSystemMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is SystemMessage<TStructure> {\n return x._getType() === \"system\";\n}\n\n/**\n * @deprecated Use {@link SystemMessageChunk.isInstance} instead\n */\nexport function isSystemMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is SystemMessageChunk<TStructure> {\n return x._getType() === \"system\";\n}\n"],"mappings":";;;;;AAiBA,IAAa,gBAAb,MAAa,sBAEH,YAAkC;CAC1C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;;;;;;CAQf,OAAO,OAA+B;AACpC,MAAI,OAAO,UAAU,SACnB,QAAO,IAAI,cAAc;GACvB,GAAG;GACH,SAAS,aAAa,KAAK,SAAS,MAAM;GAC3C,CAAC;AAGJ,MAAI,cAAc,WAAW,MAAM,CACjC,QAAO,IAAI,cAAc;GACvB,GAAG;GACH,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,SAAS,aAAa,KAAK,SAAS,MAAM,QAAQ;GACnD,CAAC;AAGJ,QAAM,IAAI,MAAM,2CAA2C;;CAG7D,OAAO,WAAW,KAAoC;AACpD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;;AAQjD,IAAa,qBAAb,cAEU,iBAAuC;CAC/C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;CAGf,OAAO,OAAuC;EAC5C,MAAM,MAAM,KAAK;AACjB,SAAO,IAAI,IAAI;GACb,SAAS,aAAa,KAAK,SAAS,MAAM,QAAQ;GAClD,mBAAmB,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,mBAAmB,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,IAAI,KAAK,MAAM,MAAM;GACtB,CAAC;;CAGJ,OAAO,WAAW,KAAyC;AACzD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;AAOjD,SAAgB,gBACd,GACgC;AAChC,QAAO,EAAE,UAAU,KAAK;;;;;AAM1B,SAAgB,qBACd,GACqC;AACrC,QAAO,EAAE,UAAU,KAAK"}
1
+ {"version":3,"file":"system.js","names":[],"sources":["../../src/messages/system.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n type BaseMessageFields,\n} from \"./base.js\";\nimport { $InferMessageContent, MessageStructure } from \"./message.js\";\nimport { Constructor } from \"./utils.js\";\n\nexport interface SystemMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"system\"> {}\n\n/**\n * Represents a system message in a conversation.\n */\nexport class SystemMessage<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessage<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessage\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n /**\n * Concatenates a string or another system message with the current system message.\n * @param chunk - The chunk to concatenate with the system message.\n * @returns A new system message with the concatenated content.\n */\n concat(chunk: string | SystemMessage) {\n if (typeof chunk === \"string\") {\n return new SystemMessage({\n content: mergeContent(this.content, chunk),\n additional_kwargs: this.additional_kwargs,\n response_metadata: this.response_metadata,\n id: this.id,\n name: this.name,\n } as SystemMessageFields<TStructure>);\n }\n\n if (SystemMessage.isInstance(chunk)) {\n return new SystemMessage({\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: {\n ...this.additional_kwargs,\n ...chunk.additional_kwargs,\n },\n response_metadata: {\n ...this.response_metadata,\n ...chunk.response_metadata,\n },\n id: this.id ?? chunk.id,\n name: this.name ?? chunk.name,\n } as SystemMessageFields<TStructure>);\n }\n\n throw new Error(\"Unexpected chunk type for system message\");\n }\n\n static isInstance(obj: unknown): obj is SystemMessage {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * Represents a chunk of a system message, which can be concatenated with\n * other system message chunks.\n */\nexport class SystemMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageChunk<TStructure, \"system\"> {\n static lc_name() {\n return \"SystemMessageChunk\";\n }\n\n readonly type = \"system\" as const;\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"system\">\n | SystemMessageFields<TStructure>\n ) {\n super(fields);\n }\n\n concat(chunk: SystemMessageChunk<TStructure>) {\n const Cls = this.constructor as Constructor<this>;\n return new Cls({\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: _mergeDicts(\n this.response_metadata,\n chunk.response_metadata\n ),\n id: this.id ?? chunk.id,\n });\n }\n\n static isInstance(obj: unknown): obj is SystemMessageChunk {\n return super.isInstance(obj) && obj.type === \"system\";\n }\n}\n\n/**\n * @deprecated Use {@link SystemMessage.isInstance} instead\n */\nexport function isSystemMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is SystemMessage<TStructure> {\n return x._getType() === \"system\";\n}\n\n/**\n * @deprecated Use {@link SystemMessageChunk.isInstance} instead\n */\nexport function isSystemMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is SystemMessageChunk<TStructure> {\n return x._getType() === \"system\";\n}\n"],"mappings":";;;;;AAiBA,IAAa,gBAAb,MAAa,sBAEH,YAAkC;CAC1C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;;;;;;CAQf,OAAO,OAA+B;AACpC,MAAI,OAAO,UAAU,SACnB,QAAO,IAAI,cAAc;GACvB,SAAS,aAAa,KAAK,SAAS,MAAM;GAC1C,mBAAmB,KAAK;GACxB,mBAAmB,KAAK;GACxB,IAAI,KAAK;GACT,MAAM,KAAK;GACZ,CAAoC;AAGvC,MAAI,cAAc,WAAW,MAAM,CACjC,QAAO,IAAI,cAAc;GACvB,SAAS,aAAa,KAAK,SAAS,MAAM,QAAQ;GAClD,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,mBAAmB;IACjB,GAAG,KAAK;IACR,GAAG,MAAM;IACV;GACD,IAAI,KAAK,MAAM,MAAM;GACrB,MAAM,KAAK,QAAQ,MAAM;GAC1B,CAAoC;AAGvC,QAAM,IAAI,MAAM,2CAA2C;;CAG7D,OAAO,WAAW,KAAoC;AACpD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;;AAQjD,IAAa,qBAAb,cAEU,iBAAuC;CAC/C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAgB;CAEhB,YACE,QAGA;AACA,QAAM,OAAO;;CAGf,OAAO,OAAuC;EAC5C,MAAM,MAAM,KAAK;AACjB,SAAO,IAAI,IAAI;GACb,SAAS,aAAa,KAAK,SAAS,MAAM,QAAQ;GAClD,mBAAmB,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,mBAAmB,YACjB,KAAK,mBACL,MAAM,kBACP;GACD,IAAI,KAAK,MAAM,MAAM;GACtB,CAAC;;CAGJ,OAAO,WAAW,KAAyC;AACzD,SAAO,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS;;;;;;AAOjD,SAAgB,gBACd,GACgC;AAChC,QAAO,EAAE,UAAU,KAAK;;;;;AAM1B,SAAgB,qBACd,GACqC;AACrC,QAAO,EAAE,UAAU,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/core",
3
- "version": "1.1.35",
3
+ "version": "1.1.36",
4
4
  "description": "Core LangChain.js abstractions and schemas",
5
5
  "type": "module",
6
6
  "engines": {