UNPKG

@langchain/core

Version:
1 lines 31 kB
{"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 // oxlint-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 // oxlint-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\n/**\n * Normalize non-string `firstContent` to a block array for merge/spread.\n * Some serializers (e.g. Anthropic-style) yield a single block object instead of a one-element array;\n * spreading that object as an array throws (\"is not iterable\").\n */\nfunction contentBlocksFromNonStringFirst(\n firstContent: MessageContent\n): ContentBlock[] {\n if (Array.isArray(firstContent)) {\n return firstContent;\n }\n if (typeof firstContent === \"string\") {\n return firstContent === \"\" ? [] : [{ type: \"text\", text: firstContent }];\n }\n if (firstContent == null) {\n return [];\n }\n return [firstContent as ContentBlock];\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 const left = contentBlocksFromNonStringFirst(firstContent);\n return _mergeLists(left, secondContent) ?? [...left, ...secondContent];\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 const left = contentBlocksFromNonStringFirst(firstContent);\n return [...left, { 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// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nfunction stringifyWithDepthLimit(obj: any, depthLimit: number): string {\n // oxlint-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 static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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\nfunction getMergeableTypeBase(type: string): string {\n return type.endsWith(\"_delta\") ? type.slice(0, -\"_delta\".length) : type;\n}\n\nfunction hasMismatchedMergeableType(left: unknown, right: unknown): boolean {\n if (typeof left !== \"object\" || left === null) return false;\n if (typeof right !== \"object\" || right === null) return false;\n if (!(\"type\" in left) || !(\"type\" in right)) return false;\n\n return (\n typeof left.type === \"string\" &&\n typeof right.type === \"string\" &&\n getMergeableTypeBase(left.type) !== getMergeableTypeBase(right.type)\n );\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 (hasMismatchedMergeableType(leftItem, item)) 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// oxlint-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 static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\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 * Serialized form of {@link RemoveMessage}. At runtime,\n * {@link coerceMessageLikeToMessage} converts this to a `RemoveMessage`\n * instance which the `add_messages` reducer uses to delete messages by ID.\n */\n | { type: \"remove\"; id: 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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"}