@langchain/core 1.2.17 → 1.2.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","names":[],"sources":["../../src/language_models/stream.ts"],"sourcesContent":["/**\n * Typed stream classes for chat model streaming.\n *\n * @module\n */\n\nimport { AIMessage } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { UsageMetadata } from \"../messages/metadata.js\";\nimport type { ChatModelStreamEvent, ContentBlockDelta } from \"./event.js\";\n\ntype UsageMetadataLike = Partial<UsageMetadata>;\n\n/**\n * A buffer that caches emitted events for replay.\n *\n * Multiple consumers can independently iterate the same buffer —\n * each gets its own cursor. Events are never consumed or removed.\n *\n * @internal\n */\nclass ReplayBuffer {\n private events: ChatModelStreamEvent[] = [];\n private finished = false;\n private waiters: Array<() => void> = [];\n private error: Error | null = null;\n\n push(event: ChatModelStreamEvent): void {\n this.events.push(event);\n const toWake = this.waiters.splice(0);\n for (const waiter of toWake) {\n waiter();\n }\n }\n\n finish(): void {\n this.finished = true;\n const toWake = this.waiters.splice(0);\n for (const waiter of toWake) {\n waiter();\n }\n }\n\n setError(err: Error): void {\n this.error = err;\n this.finished = true;\n const toWake = this.waiters.splice(0);\n for (const waiter of toWake) {\n waiter();\n }\n }\n\n async *iterate(): AsyncGenerator<ChatModelStreamEvent> {\n if (this.finished) {\n if (this.error) throw this.error;\n yield* this.events;\n return;\n }\n\n let cursor = 0;\n while (true) {\n while (cursor < this.events.length) {\n yield this.events[cursor]!;\n cursor++;\n }\n if (this.finished) {\n if (this.error) throw this.error;\n return;\n }\n await new Promise<void>((resolve) => {\n if (cursor < this.events.length || this.finished) {\n resolve();\n return;\n }\n this.waiters.push(resolve);\n });\n }\n }\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n *\n * - `text-delta` → append text\n * - `reasoning-delta` → append reasoning text\n * - `data-delta` → append encoded data to `data`\n * - `block-delta` → shallow merge fields\n *\n * @internal\n */\nfunction applyDelta(\n block: ContentBlock,\n delta: ContentBlockDelta\n): ContentBlock {\n switch (delta.type) {\n case \"text-delta\":\n if (block.type === \"text\") {\n return {\n ...block,\n text: (block.text ?? \"\") + delta.text,\n };\n }\n return block;\n case \"reasoning-delta\":\n if (block.type === \"thinking\") {\n return {\n ...block,\n thinking: (block.thinking ?? \"\") + delta.reasoning,\n };\n }\n if (block.type === \"reasoning\") {\n return {\n ...block,\n reasoning: (block.reasoning ?? \"\") + delta.reasoning,\n };\n }\n return block;\n case \"data-delta\":\n return {\n ...block,\n data: (block.data ?? \"\") + delta.data,\n };\n case \"block-delta\":\n return { ...block, ...delta.fields } as ContentBlock;\n default:\n throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`);\n }\n}\n\n/**\n * Returns the typed delta carried by a content-block delta event.\n *\n * Stream protocol compliant language models store incremental updates in\n * `event.delta`, e.g. `{ type: \"text-delta\", text: \"hello\" }`. Some models and\n * adapters still emit the older content-shaped form on `event.content`, e.g.\n * `{ type: \"text\", text: \"hello\" }`, which predates explicit delta event\n * variants.\n *\n * Keep accepting that content-shaped form here so {@link ChatModelStream}\n * remains a tolerant consumer while producers migrate to protocol compliant\n * typed deltas.\n *\n * @internal\n */\nfunction getEventDelta(\n event: ChatModelStreamEvent\n): ContentBlockDelta | undefined {\n if (event.event !== \"content-block-delta\") return undefined;\n if (\"delta\" in event && event.delta) return event.delta;\n\n const content = (event as { content?: unknown }).content;\n if (content == null || typeof content !== \"object\") return undefined;\n const block = content as { type?: string } & Record<string, unknown>;\n if (block.type === \"text\" && typeof block.text === \"string\") {\n return { type: \"text-delta\", text: block.text };\n }\n if (block.type === \"reasoning\" && typeof block.reasoning === \"string\") {\n return { type: \"reasoning-delta\", reasoning: block.reasoning };\n }\n if (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n return { type: \"reasoning-delta\", reasoning: block.thinking };\n }\n if (typeof block.data === \"string\") {\n return { type: \"data-delta\", data: block.data, encoding: \"base64\" };\n }\n if (typeof block.type === \"string\") {\n return { type: \"block-delta\", fields: { ...block, type: block.type } };\n }\n return undefined;\n}\n\nfunction getReasoningDelta(content: unknown): string | undefined {\n if (content == null || typeof content !== \"object\") return undefined;\n const block = content as {\n type?: string;\n reasoning?: unknown;\n thinking?: unknown;\n };\n if (block.type === \"reasoning\" && typeof block.reasoning === \"string\") {\n return block.reasoning;\n }\n if (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n return block.thinking;\n }\n return undefined;\n}\n\nfunction isReasoningContent(content: unknown): boolean {\n if (content == null || typeof content !== \"object\") return false;\n const type = (content as { type?: unknown }).type;\n return type === \"reasoning\" || type === \"thinking\";\n}\n\n/**\n * Normalize protocol-compatible partial usage into Core's concrete usage shape.\n *\n * Some stream sources emit usage snapshots without every aggregate token field.\n * Keep the stream event input permissive, then normalize at read time so\n * high-level Core consumers always receive a complete {@link UsageMetadata}.\n */\nfunction normalizeUsage(\n usage: UsageMetadataLike | undefined\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n return {\n ...usage,\n input_tokens: usage.input_tokens ?? 0,\n output_tokens: usage.output_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n };\n}\n\nfunction parseToolArgs(value: unknown): Record<string, unknown> {\n if (value != null && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n if (typeof value !== \"string\" || value.length === 0) return {};\n try {\n const parsed = JSON.parse(value);\n return parsed != null &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction standardizeToolBlock(block: ContentBlock): ContentBlock {\n const record = block as Record<string, unknown>;\n if (block.type === \"tool_call\") return block;\n if (\n block.type !== \"tool_call_chunk\" &&\n block.type !== \"tool_use\" &&\n block.type !== \"input_json_delta\"\n ) {\n return block;\n }\n\n const name = typeof record.name === \"string\" ? record.name : undefined;\n if (name == null) return block;\n\n const args = record.args ?? record.input;\n return {\n ...record,\n type: \"tool_call\",\n name,\n args: parseToolArgs(args),\n } as ContentBlock;\n}\n\n// ─── Sub-Stream: Text ───────────────────────────────────────────\n\n/**\n * Typed stream for text content.\n *\n * - **Iterate**: yields incremental text deltas.\n * - **Await**: resolves to the complete concatenated text.\n * - **`.full`**: yields the running accumulated text after each delta.\n */\nexport class TextContentStream\n implements AsyncIterable<string>, PromiseLike<string>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n /** Yields the accumulated text so far after each delta. */\n get full(): AsyncIterable<string> {\n const buffer = this._buffer;\n return {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n for await (const event of buffer.iterate()) {\n const delta = getEventDelta(event);\n if (delta?.type === \"text-delta\") {\n accumulated += delta.text;\n yield accumulated;\n }\n }\n },\n };\n }\n\n /** Yields incremental text deltas. */\n [Symbol.asyncIterator](): AsyncIterator<string> {\n const buffer = this._buffer;\n async function* gen() {\n for await (const event of buffer.iterate()) {\n const delta = getEventDelta(event);\n if (delta?.type === \"text-delta\") {\n yield delta.text;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = string, TResult2 = never>(\n onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n let text = \"\";\n for await (const delta of this) {\n text += delta;\n }\n return text;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── Sub-Stream: Tool Calls ─────────────────────────────────────\n\n/**\n * Typed stream for tool calls.\n *\n * - **Iterate**: yields individual `ToolCall` objects as each completes.\n * - **Await**: resolves to the full array.\n * - **`.full`**: yields the accumulated array after each new tool call.\n */\nexport class ToolCallsStream\n implements\n AsyncIterable<ContentBlock.Tools.ToolCall>,\n PromiseLike<Array<ContentBlock.Tools.ToolCall>>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n get full(): AsyncIterable<Array<ContentBlock.Tools.ToolCall>> {\n const buffer = this._buffer;\n return {\n async *[Symbol.asyncIterator]() {\n const calls: Array<ContentBlock.Tools.ToolCall> = [];\n for await (const event of buffer.iterate()) {\n if (\n event.event === \"content-block-finish\" &&\n event.content.type === \"tool_call\"\n ) {\n calls.push(event.content as ContentBlock.Tools.ToolCall);\n yield [...calls];\n }\n }\n },\n };\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ContentBlock.Tools.ToolCall> {\n const buffer = this._buffer;\n async function* gen() {\n for await (const event of buffer.iterate()) {\n if (\n event.event === \"content-block-finish\" &&\n event.content.type === \"tool_call\"\n ) {\n yield event.content as ContentBlock.Tools.ToolCall;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = Array<ContentBlock.Tools.ToolCall>, TResult2 = never>(\n onfulfilled?:\n | ((\n value: Array<ContentBlock.Tools.ToolCall>\n ) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n const calls: Array<ContentBlock.Tools.ToolCall> = [];\n for await (const call of this) {\n calls.push(call);\n }\n return calls;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── Sub-Stream: Reasoning ──────────────────────────────────────\n\n/**\n * Typed stream for reasoning content (chain-of-thought).\n * Same interface as {@link TextContentStream} but for reasoning blocks.\n */\nexport class ReasoningContentStream\n implements AsyncIterable<string>, PromiseLike<string>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n get full(): AsyncIterable<string> {\n const buffer = this._buffer;\n return {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n let seenReasoning = false;\n for await (const event of buffer.iterate()) {\n if (event.event === \"content-block-start\") {\n if (!isReasoningContent(event.content)) {\n if (seenReasoning) return;\n continue;\n }\n seenReasoning = true;\n const delta = getReasoningDelta(event.content);\n if (delta == null || delta.length === 0) continue;\n accumulated += delta;\n yield accumulated;\n } else if (event.event === \"content-block-delta\") {\n const eventDelta = getEventDelta(event);\n if (eventDelta?.type !== \"reasoning-delta\") continue;\n seenReasoning = true;\n const delta = eventDelta.reasoning;\n if (delta == null || delta.length === 0) continue;\n accumulated += delta;\n yield accumulated;\n } else if (\n event.event === \"content-block-finish\" &&\n isReasoningContent(event.content)\n ) {\n return;\n } else if (event.event === \"message-finish\") {\n return;\n }\n }\n },\n };\n }\n\n [Symbol.asyncIterator](): AsyncIterator<string> {\n const buffer = this._buffer;\n async function* gen() {\n let seenReasoning = false;\n for await (const event of buffer.iterate()) {\n if (event.event === \"content-block-start\") {\n if (!isReasoningContent(event.content)) {\n if (seenReasoning) return;\n continue;\n }\n seenReasoning = true;\n const delta = getReasoningDelta(event.content);\n if (delta != null && delta.length > 0) yield delta;\n } else if (event.event === \"content-block-delta\") {\n const eventDelta = getEventDelta(event);\n if (eventDelta?.type !== \"reasoning-delta\") continue;\n seenReasoning = true;\n const delta = eventDelta.reasoning;\n if (delta != null && delta.length > 0) yield delta;\n } else if (\n event.event === \"content-block-finish\" &&\n isReasoningContent(event.content)\n ) {\n return;\n } else if (event.event === \"message-finish\") {\n return;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = string, TResult2 = never>(\n onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n let text = \"\";\n for await (const delta of this) {\n text += delta;\n }\n return text;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── Sub-Stream: Usage ──────────────────────────────────────────\n\n/**\n * Typed stream for usage metadata.\n */\nexport class UsageMetadataStream\n implements\n AsyncIterable<UsageMetadata>,\n PromiseLike<UsageMetadata | undefined>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<UsageMetadata> {\n const buffer = this._buffer;\n async function* gen() {\n for await (const event of buffer.iterate()) {\n if (event.event === \"usage\") {\n const usage = normalizeUsage(event.usage);\n if (usage) yield usage;\n } else if (event.event === \"message-start\" && event.usage) {\n const usage = normalizeUsage(event.usage);\n if (usage) yield usage;\n } else if (event.event === \"message-finish\" && event.usage) {\n const usage = normalizeUsage(event.usage);\n if (usage) yield usage;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = UsageMetadata | undefined, TResult2 = never>(\n onfulfilled?:\n | ((value: UsageMetadata | undefined) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n let latest: UsageMetadata | undefined;\n for await (const usage of this) {\n latest = usage;\n }\n return latest;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── ChatModelStream ────────────────────────────────────────────\n\n/**\n * The main stream object returned by chat model streaming.\n *\n * Implements `AsyncIterable<ChatModelStreamEvent>` for raw event access\n * and `PromiseLike<AIMessage>` for simple `await` usage.\n */\nexport class ChatModelStream\n implements AsyncIterable<ChatModelStreamEvent>, PromiseLike<AIMessage>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(source: AsyncIterable<ChatModelStreamEvent>) {\n this._buffer = new ReplayBuffer();\n this._consume(source);\n }\n\n /** @internal */\n private async _consume(\n source: AsyncIterable<ChatModelStreamEvent>\n ): Promise<void> {\n try {\n for await (const event of source) {\n this._buffer.push(event);\n }\n this._buffer.finish();\n } catch (err) {\n this._buffer.setError(\n err instanceof Error ? err : new Error(String(err))\n );\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ChatModelStreamEvent> {\n return this._buffer.iterate();\n }\n\n get text(): TextContentStream {\n return new TextContentStream(this._buffer);\n }\n\n get toolCalls(): ToolCallsStream {\n return new ToolCallsStream(this._buffer);\n }\n\n get reasoning(): ReasoningContentStream {\n return new ReasoningContentStream(this._buffer);\n }\n\n get usage(): UsageMetadataStream {\n return new UsageMetadataStream(this._buffer);\n }\n\n get output(): PromiseLike<AIMessage> {\n return this._assembleMessage();\n }\n\n then<TResult1 = AIMessage, TResult2 = never>(\n onfulfilled?:\n | ((value: AIMessage) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this._assembleMessage().then(onfulfilled, onrejected);\n }\n\n /** @internal */\n private async _assembleMessage(): Promise<AIMessage> {\n const contentBlocks: Array<ContentBlock | undefined> = [];\n let id: string | undefined;\n let usage: UsageMetadata | undefined;\n let metadata: Record<string, unknown> = {};\n let finishReason: string | undefined;\n\n for await (const event of this._buffer.iterate()) {\n switch (event.event) {\n case \"message-start\":\n id = event.id ?? id;\n if (event.usage) usage = normalizeUsage(event.usage);\n break;\n\n case \"content-block-start\":\n contentBlocks[event.index] = event.content;\n break;\n\n case \"content-block-delta\": {\n const current = contentBlocks[event.index];\n const delta = getEventDelta(event);\n if (current) {\n if (delta) contentBlocks[event.index] = applyDelta(current, delta);\n }\n break;\n }\n\n case \"content-block-finish\":\n contentBlocks[event.index] = event.content;\n break;\n\n case \"usage\":\n usage = normalizeUsage(event.usage);\n break;\n\n case \"message-finish\":\n finishReason = event.reason;\n if (event.usage) usage = normalizeUsage(event.usage);\n if (event.responseMetadata) {\n metadata = {\n ...metadata,\n ...event.responseMetadata,\n };\n }\n break;\n\n default:\n break;\n }\n }\n\n const filteredBlocks = contentBlocks\n .filter((b): b is ContentBlock => b != null)\n .map(standardizeToolBlock);\n\n return new AIMessage({\n id,\n content: filteredBlocks,\n usage_metadata: usage,\n response_metadata: {\n ...metadata,\n ...(finishReason ? { finish_reason: finishReason } : {}),\n output_version: \"v1\" as const,\n },\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","names":[],"sources":["../../src/language_models/stream.ts"],"sourcesContent":["/**\n * Typed stream classes for chat model streaming.\n *\n * @module\n */\n\nimport { AIMessage } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { UsageMetadata } from \"../messages/metadata.js\";\nimport type { ChatModelStreamEvent, ContentBlockDelta } from \"./event.js\";\n\ntype UsageMetadataLike = Partial<UsageMetadata>;\n\n/**\n * A buffer that caches emitted events for replay.\n *\n * Multiple consumers can independently iterate the same buffer —\n * each gets its own cursor. Events are never consumed or removed.\n *\n * @internal\n */\nclass ReplayBuffer {\n private events: ChatModelStreamEvent[] = [];\n private finished = false;\n private waiters: Array<() => void> = [];\n private error: Error | null = null;\n\n push(event: ChatModelStreamEvent): void {\n this.events.push(event);\n const toWake = this.waiters.splice(0);\n for (const waiter of toWake) {\n waiter();\n }\n }\n\n finish(): void {\n this.finished = true;\n const toWake = this.waiters.splice(0);\n for (const waiter of toWake) {\n waiter();\n }\n }\n\n setError(err: Error): void {\n this.error = err;\n this.finished = true;\n const toWake = this.waiters.splice(0);\n for (const waiter of toWake) {\n waiter();\n }\n }\n\n async *iterate(): AsyncGenerator<ChatModelStreamEvent> {\n if (this.finished) {\n if (this.error) throw this.error;\n yield* this.events;\n return;\n }\n\n let cursor = 0;\n while (true) {\n while (cursor < this.events.length) {\n yield this.events[cursor]!;\n cursor++;\n }\n if (this.finished) {\n if (this.error) throw this.error;\n return;\n }\n await new Promise<void>((resolve) => {\n if (cursor < this.events.length || this.finished) {\n resolve();\n return;\n }\n this.waiters.push(resolve);\n });\n }\n }\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n *\n * - `text-delta` → append text\n * - `reasoning-delta` → append reasoning text\n * - `data-delta` → append encoded data to `data`\n * - `tool-call-delta` → append tool-call args\n * - `block-delta` → shallow merge fields\n *\n * @internal\n */\nfunction applyDelta(\n block: ContentBlock,\n delta: ContentBlockDelta\n): ContentBlock {\n switch (delta.type) {\n case \"text-delta\":\n if (block.type === \"text\") {\n return {\n ...block,\n text: (block.text ?? \"\") + delta.text,\n };\n }\n return block;\n case \"reasoning-delta\":\n if (block.type === \"thinking\") {\n return {\n ...block,\n thinking: (block.thinking ?? \"\") + delta.reasoning,\n };\n }\n if (block.type === \"reasoning\") {\n return {\n ...block,\n reasoning: (block.reasoning ?? \"\") + delta.reasoning,\n };\n }\n return block;\n case \"data-delta\":\n return {\n ...block,\n data: (block.data ?? \"\") + delta.data,\n };\n case \"tool-call-delta\":\n if (\n block.type === \"tool_call_chunk\" ||\n block.type === \"server_tool_call_chunk\"\n ) {\n return {\n ...block,\n args: (block.args ?? \"\") + delta.args,\n };\n }\n return block;\n case \"block-delta\":\n return { ...block, ...delta.fields } as ContentBlock;\n default:\n // The agent protocol adds delta variants over time, so skip ones this\n // version doesn't know. `content-block-finish` carries the full block.\n return block;\n }\n}\n\n/**\n * Returns the typed delta carried by a content-block delta event.\n *\n * Stream protocol compliant language models store incremental updates in\n * `event.delta`, e.g. `{ type: \"text-delta\", text: \"hello\" }`. Some models and\n * adapters still emit the older content-shaped form on `event.content`, e.g.\n * `{ type: \"text\", text: \"hello\" }`, which predates explicit delta event\n * variants.\n *\n * Keep accepting that content-shaped form here so {@link ChatModelStream}\n * remains a tolerant consumer while producers migrate to protocol compliant\n * typed deltas.\n *\n * @internal\n */\nfunction getEventDelta(\n event: ChatModelStreamEvent\n): ContentBlockDelta | undefined {\n if (event.event !== \"content-block-delta\") return undefined;\n if (\"delta\" in event && event.delta) return event.delta;\n\n const content = (event as { content?: unknown }).content;\n if (content == null || typeof content !== \"object\") return undefined;\n const block = content as { type?: string } & Record<string, unknown>;\n if (block.type === \"text\" && typeof block.text === \"string\") {\n return { type: \"text-delta\", text: block.text };\n }\n if (block.type === \"reasoning\" && typeof block.reasoning === \"string\") {\n return { type: \"reasoning-delta\", reasoning: block.reasoning };\n }\n if (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n return { type: \"reasoning-delta\", reasoning: block.thinking };\n }\n if (typeof block.data === \"string\") {\n return { type: \"data-delta\", data: block.data, encoding: \"base64\" };\n }\n if (typeof block.type === \"string\") {\n return { type: \"block-delta\", fields: { ...block, type: block.type } };\n }\n return undefined;\n}\n\nfunction getReasoningDelta(content: unknown): string | undefined {\n if (content == null || typeof content !== \"object\") return undefined;\n const block = content as {\n type?: string;\n reasoning?: unknown;\n thinking?: unknown;\n };\n if (block.type === \"reasoning\" && typeof block.reasoning === \"string\") {\n return block.reasoning;\n }\n if (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n return block.thinking;\n }\n return undefined;\n}\n\nfunction isReasoningContent(content: unknown): boolean {\n if (content == null || typeof content !== \"object\") return false;\n const type = (content as { type?: unknown }).type;\n return type === \"reasoning\" || type === \"thinking\";\n}\n\n/**\n * Normalize protocol-compatible partial usage into Core's concrete usage shape.\n *\n * Some stream sources emit usage snapshots without every aggregate token field.\n * Keep the stream event input permissive, then normalize at read time so\n * high-level Core consumers always receive a complete {@link UsageMetadata}.\n */\nfunction normalizeUsage(\n usage: UsageMetadataLike | undefined\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n return {\n ...usage,\n input_tokens: usage.input_tokens ?? 0,\n output_tokens: usage.output_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n };\n}\n\nfunction parseToolArgs(value: unknown): Record<string, unknown> {\n if (value != null && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n if (typeof value !== \"string\" || value.length === 0) return {};\n try {\n const parsed = JSON.parse(value);\n return parsed != null &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction standardizeToolBlock(block: ContentBlock): ContentBlock {\n const record = block as Record<string, unknown>;\n if (block.type === \"tool_call\") return block;\n if (\n block.type !== \"tool_call_chunk\" &&\n block.type !== \"tool_use\" &&\n block.type !== \"input_json_delta\"\n ) {\n return block;\n }\n\n const name = typeof record.name === \"string\" ? record.name : undefined;\n if (name == null) return block;\n\n const args = record.args ?? record.input;\n return {\n ...record,\n type: \"tool_call\",\n name,\n args: parseToolArgs(args),\n } as ContentBlock;\n}\n\n// ─── Sub-Stream: Text ───────────────────────────────────────────\n\n/**\n * Typed stream for text content.\n *\n * - **Iterate**: yields incremental text deltas.\n * - **Await**: resolves to the complete concatenated text.\n * - **`.full`**: yields the running accumulated text after each delta.\n */\nexport class TextContentStream\n implements AsyncIterable<string>, PromiseLike<string>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n /** Yields the accumulated text so far after each delta. */\n get full(): AsyncIterable<string> {\n const buffer = this._buffer;\n return {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n for await (const event of buffer.iterate()) {\n const delta = getEventDelta(event);\n if (delta?.type === \"text-delta\") {\n accumulated += delta.text;\n yield accumulated;\n }\n }\n },\n };\n }\n\n /** Yields incremental text deltas. */\n [Symbol.asyncIterator](): AsyncIterator<string> {\n const buffer = this._buffer;\n async function* gen() {\n for await (const event of buffer.iterate()) {\n const delta = getEventDelta(event);\n if (delta?.type === \"text-delta\") {\n yield delta.text;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = string, TResult2 = never>(\n onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n let text = \"\";\n for await (const delta of this) {\n text += delta;\n }\n return text;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── Sub-Stream: Tool Calls ─────────────────────────────────────\n\n/**\n * Typed stream for tool calls.\n *\n * - **Iterate**: yields individual `ToolCall` objects as each completes.\n * - **Await**: resolves to the full array.\n * - **`.full`**: yields the accumulated array after each new tool call.\n */\nexport class ToolCallsStream\n implements\n AsyncIterable<ContentBlock.Tools.ToolCall>,\n PromiseLike<Array<ContentBlock.Tools.ToolCall>>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n get full(): AsyncIterable<Array<ContentBlock.Tools.ToolCall>> {\n const buffer = this._buffer;\n return {\n async *[Symbol.asyncIterator]() {\n const calls: Array<ContentBlock.Tools.ToolCall> = [];\n for await (const event of buffer.iterate()) {\n if (\n event.event === \"content-block-finish\" &&\n event.content.type === \"tool_call\"\n ) {\n calls.push(event.content as ContentBlock.Tools.ToolCall);\n yield [...calls];\n }\n }\n },\n };\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ContentBlock.Tools.ToolCall> {\n const buffer = this._buffer;\n async function* gen() {\n for await (const event of buffer.iterate()) {\n if (\n event.event === \"content-block-finish\" &&\n event.content.type === \"tool_call\"\n ) {\n yield event.content as ContentBlock.Tools.ToolCall;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = Array<ContentBlock.Tools.ToolCall>, TResult2 = never>(\n onfulfilled?:\n | ((\n value: Array<ContentBlock.Tools.ToolCall>\n ) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n const calls: Array<ContentBlock.Tools.ToolCall> = [];\n for await (const call of this) {\n calls.push(call);\n }\n return calls;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── Sub-Stream: Reasoning ──────────────────────────────────────\n\n/**\n * Typed stream for reasoning content (chain-of-thought).\n * Same interface as {@link TextContentStream} but for reasoning blocks.\n */\nexport class ReasoningContentStream\n implements AsyncIterable<string>, PromiseLike<string>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n get full(): AsyncIterable<string> {\n const buffer = this._buffer;\n return {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n let seenReasoning = false;\n for await (const event of buffer.iterate()) {\n if (event.event === \"content-block-start\") {\n if (!isReasoningContent(event.content)) {\n if (seenReasoning) return;\n continue;\n }\n seenReasoning = true;\n const delta = getReasoningDelta(event.content);\n if (delta == null || delta.length === 0) continue;\n accumulated += delta;\n yield accumulated;\n } else if (event.event === \"content-block-delta\") {\n const eventDelta = getEventDelta(event);\n if (eventDelta?.type !== \"reasoning-delta\") continue;\n seenReasoning = true;\n const delta = eventDelta.reasoning;\n if (delta == null || delta.length === 0) continue;\n accumulated += delta;\n yield accumulated;\n } else if (\n event.event === \"content-block-finish\" &&\n isReasoningContent(event.content)\n ) {\n return;\n } else if (event.event === \"message-finish\") {\n return;\n }\n }\n },\n };\n }\n\n [Symbol.asyncIterator](): AsyncIterator<string> {\n const buffer = this._buffer;\n async function* gen() {\n let seenReasoning = false;\n for await (const event of buffer.iterate()) {\n if (event.event === \"content-block-start\") {\n if (!isReasoningContent(event.content)) {\n if (seenReasoning) return;\n continue;\n }\n seenReasoning = true;\n const delta = getReasoningDelta(event.content);\n if (delta != null && delta.length > 0) yield delta;\n } else if (event.event === \"content-block-delta\") {\n const eventDelta = getEventDelta(event);\n if (eventDelta?.type !== \"reasoning-delta\") continue;\n seenReasoning = true;\n const delta = eventDelta.reasoning;\n if (delta != null && delta.length > 0) yield delta;\n } else if (\n event.event === \"content-block-finish\" &&\n isReasoningContent(event.content)\n ) {\n return;\n } else if (event.event === \"message-finish\") {\n return;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = string, TResult2 = never>(\n onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n let text = \"\";\n for await (const delta of this) {\n text += delta;\n }\n return text;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── Sub-Stream: Usage ──────────────────────────────────────────\n\n/**\n * Typed stream for usage metadata.\n */\nexport class UsageMetadataStream\n implements\n AsyncIterable<UsageMetadata>,\n PromiseLike<UsageMetadata | undefined>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(buffer: ReplayBuffer) {\n this._buffer = buffer;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<UsageMetadata> {\n const buffer = this._buffer;\n async function* gen() {\n for await (const event of buffer.iterate()) {\n if (event.event === \"usage\") {\n const usage = normalizeUsage(event.usage);\n if (usage) yield usage;\n } else if (event.event === \"message-start\" && event.usage) {\n const usage = normalizeUsage(event.usage);\n if (usage) yield usage;\n } else if (event.event === \"message-finish\" && event.usage) {\n const usage = normalizeUsage(event.usage);\n if (usage) yield usage;\n }\n }\n }\n return gen();\n }\n\n then<TResult1 = UsageMetadata | undefined, TResult2 = never>(\n onfulfilled?:\n | ((value: UsageMetadata | undefined) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n const promise = (async () => {\n let latest: UsageMetadata | undefined;\n for await (const usage of this) {\n latest = usage;\n }\n return latest;\n })();\n return promise.then(onfulfilled, onrejected);\n }\n}\n\n// ─── ChatModelStream ────────────────────────────────────────────\n\n/**\n * The main stream object returned by chat model streaming.\n *\n * Implements `AsyncIterable<ChatModelStreamEvent>` for raw event access\n * and `PromiseLike<AIMessage>` for simple `await` usage.\n */\nexport class ChatModelStream\n implements AsyncIterable<ChatModelStreamEvent>, PromiseLike<AIMessage>\n{\n /** @internal */\n private _buffer: ReplayBuffer;\n\n /** @internal */\n constructor(source: AsyncIterable<ChatModelStreamEvent>) {\n this._buffer = new ReplayBuffer();\n this._consume(source);\n }\n\n /** @internal */\n private async _consume(\n source: AsyncIterable<ChatModelStreamEvent>\n ): Promise<void> {\n try {\n for await (const event of source) {\n this._buffer.push(event);\n }\n this._buffer.finish();\n } catch (err) {\n this._buffer.setError(\n err instanceof Error ? err : new Error(String(err))\n );\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ChatModelStreamEvent> {\n return this._buffer.iterate();\n }\n\n get text(): TextContentStream {\n return new TextContentStream(this._buffer);\n }\n\n get toolCalls(): ToolCallsStream {\n return new ToolCallsStream(this._buffer);\n }\n\n get reasoning(): ReasoningContentStream {\n return new ReasoningContentStream(this._buffer);\n }\n\n get usage(): UsageMetadataStream {\n return new UsageMetadataStream(this._buffer);\n }\n\n get output(): PromiseLike<AIMessage> {\n return this._assembleMessage();\n }\n\n then<TResult1 = AIMessage, TResult2 = never>(\n onfulfilled?:\n | ((value: AIMessage) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this._assembleMessage().then(onfulfilled, onrejected);\n }\n\n /** @internal */\n private async _assembleMessage(): Promise<AIMessage> {\n const contentBlocks: Array<ContentBlock | undefined> = [];\n let id: string | undefined;\n let usage: UsageMetadata | undefined;\n let metadata: Record<string, unknown> = {};\n let finishReason: string | undefined;\n\n for await (const event of this._buffer.iterate()) {\n switch (event.event) {\n case \"message-start\":\n id = event.id ?? id;\n if (event.usage) usage = normalizeUsage(event.usage);\n break;\n\n case \"content-block-start\":\n contentBlocks[event.index] = event.content;\n break;\n\n case \"content-block-delta\": {\n const current = contentBlocks[event.index];\n const delta = getEventDelta(event);\n if (current) {\n if (delta) contentBlocks[event.index] = applyDelta(current, delta);\n }\n break;\n }\n\n case \"content-block-finish\":\n contentBlocks[event.index] = event.content;\n break;\n\n case \"usage\":\n usage = normalizeUsage(event.usage);\n break;\n\n case \"message-finish\":\n finishReason = event.reason;\n if (event.usage) usage = normalizeUsage(event.usage);\n if (event.responseMetadata) {\n metadata = {\n ...metadata,\n ...event.responseMetadata,\n };\n }\n break;\n\n default:\n break;\n }\n }\n\n const filteredBlocks = contentBlocks\n .filter((b): b is ContentBlock => b != null)\n .map(standardizeToolBlock);\n\n return new AIMessage({\n id,\n content: filteredBlocks,\n usage_metadata: usage,\n response_metadata: {\n ...metadata,\n ...(finishReason ? { finish_reason: finishReason } : {}),\n output_version: \"v1\" as const,\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -161,22 +161,50 @@ var AIMessageChunk = class extends require_base.BaseMessageChunk {
161
161
  tool_call_chunks: [],
162
162
  usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
163
163
  };
164
- else {
165
- const collapsed = require_utils.collapseToolCallChunks(fields.tool_call_chunks ?? []);
166
- initParams = {
167
- ...fields,
168
- tool_call_chunks: collapsed.tool_call_chunks,
169
- tool_calls: collapsed.tool_calls,
170
- invalid_tool_calls: collapsed.invalid_tool_calls,
171
- usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
172
- };
173
- }
164
+ else initParams = {
165
+ ...fields,
166
+ usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
167
+ };
174
168
  super(initParams);
175
169
  this.tool_call_chunks = initParams.tool_call_chunks ?? this.tool_call_chunks;
176
- this.tool_calls = initParams.tool_calls ?? this.tool_calls;
177
- this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls;
170
+ if (typeof fields !== "string" && !Array.isArray(fields) && fields.tool_call_chunks !== void 0 && fields.tool_call_chunks.length > 0) this._defineLazyToolCallGetters(fields.tool_call_chunks.map((chunk) => ({ ...chunk })));
171
+ else {
172
+ this.tool_calls = initParams.tool_calls ?? this.tool_calls;
173
+ this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls;
174
+ }
178
175
  this.usage_metadata = initParams.usage_metadata;
179
176
  }
177
+ /**
178
+ * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
179
+ * Own-property getters (not prototype accessors) so spread / Object.entries still see
180
+ * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
181
+ */
182
+ _defineLazyToolCallGetters(toolCallChunks) {
183
+ let collapsed;
184
+ const getCollapsed = () => {
185
+ collapsed ??= require_utils.collapseToolCallChunks(toolCallChunks);
186
+ return collapsed;
187
+ };
188
+ const defineLazy = (target, prop) => {
189
+ Object.defineProperty(target, prop, {
190
+ get: () => getCollapsed()[prop],
191
+ set: (value) => {
192
+ Object.defineProperty(target, prop, {
193
+ value,
194
+ writable: true,
195
+ enumerable: true,
196
+ configurable: true
197
+ });
198
+ },
199
+ enumerable: true,
200
+ configurable: true
201
+ });
202
+ };
203
+ defineLazy(this, "tool_calls");
204
+ defineLazy(this, "invalid_tool_calls");
205
+ defineLazy(this.lc_kwargs, "tool_calls");
206
+ defineLazy(this.lc_kwargs, "invalid_tool_calls");
207
+ }
180
208
  get lc_aliases() {
181
209
  return {
182
210
  ...super.lc_aliases,
@@ -232,7 +260,7 @@ var AIMessageChunk = class extends require_base.BaseMessageChunk {
232
260
  const rawToolCalls = require_base._mergeLists(this.tool_call_chunks, chunk.tool_call_chunks);
233
261
  if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_call_chunks = rawToolCalls;
234
262
  }
235
- if (this.tool_calls !== void 0 || chunk.tool_calls !== void 0) {
263
+ if ((combinedFields.tool_call_chunks === void 0 || combinedFields.tool_call_chunks.length === 0) && (this.tool_calls !== void 0 || chunk.tool_calls !== void 0)) {
236
264
  const rawToolCalls = require_base._mergeLists(this.tool_calls, chunk.tool_calls);
237
265
  if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_calls = rawToolCalls;
238
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ai.cjs","names":["BaseMessage","defaultToolCallParser","getTranslator","BaseMessageChunk","collapseToolCallChunks","mergeContent","_mergeDicts","mergeResponseMetadata","_mergeLists","mergeUsageMetadata"],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n const collapsed = collapseToolCallChunks(fields.tool_call_chunks ?? []);\n initParams = {\n ...fields,\n tool_call_chunks: collapsed.tool_call_chunks,\n tool_calls: collapsed.tool_calls as $InferToolCalls<TStructure>[],\n invalid_tool_calls: collapsed.invalid_tool_calls,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n this.usage_metadata = initParams.usage_metadata;\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n if (this.tool_calls !== undefined || chunk.tool_calls !== undefined) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai.cjs","names":["BaseMessage","defaultToolCallParser","getTranslator","BaseMessageChunk","collapseToolCallChunks","mergeContent","_mergeDicts","mergeResponseMetadata","_mergeLists","mergeUsageMetadata"],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n // Collapsed lazily on first read; see _defineLazyToolCallGetters.\n initParams = {\n ...fields,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n if (\n typeof fields !== \"string\" &&\n !Array.isArray(fields) &&\n fields.tool_call_chunks !== undefined &&\n fields.tool_call_chunks.length > 0\n ) {\n this._defineLazyToolCallGetters(\n fields.tool_call_chunks.map((chunk) => ({ ...chunk }))\n );\n } else {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n /**\n * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.\n * Own-property getters (not prototype accessors) so spread / Object.entries still see\n * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.\n */\n private _defineLazyToolCallGetters(toolCallChunks: ToolCallChunk[]) {\n let collapsed: ReturnType<typeof collapseToolCallChunks> | undefined;\n const getCollapsed = () => {\n collapsed ??= collapseToolCallChunks(toolCallChunks);\n return collapsed;\n };\n const defineLazy = (\n target: object,\n prop: \"tool_calls\" | \"invalid_tool_calls\"\n ) => {\n Object.defineProperty(target, prop, {\n get: () => getCollapsed()[prop],\n // Writing to the property replaces the getter with a plain value,\n // restoring normal assignment semantics.\n set: (value: unknown) => {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n },\n enumerable: true,\n configurable: true,\n });\n };\n defineLazy(this, \"tool_calls\");\n defineLazy(this, \"invalid_tool_calls\");\n defineLazy(this.lc_kwargs, \"tool_calls\");\n defineLazy(this.lc_kwargs, \"invalid_tool_calls\");\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n // Skip when chunks exist: the constructor derives tool_calls, and reading here forces a collapse.\n if (\n (combinedFields.tool_call_chunks === undefined ||\n combinedFields.tool_call_chunks.length === 0) &&\n (this.tool_calls !== undefined || chunk.tool_calls !== undefined)\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}
@@ -53,6 +53,12 @@ export declare class AIMessageChunk<TStructure extends MessageStructure = Messag
53
53
  tool_call_chunks?: ToolCallChunk[];
54
54
  usage_metadata?: AIMessageChunkFields<TStructure>["usage_metadata"];
55
55
  constructor(fields: $InferMessageContent<TStructure, "ai"> | AIMessageChunkFields<TStructure>);
56
+ /**
57
+ * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
58
+ * Own-property getters (not prototype accessors) so spread / Object.entries still see
59
+ * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
60
+ */
61
+ private _defineLazyToolCallGetters;
56
62
  get lc_aliases(): Record<string, string>;
57
63
  static lc_name(): string;
58
64
  get contentBlocks(): Array<ContentBlock.Standard>;
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.cts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;MAgDvB,cAAc;SAWX;MAIH,iBAAiB,MAAM,aAAa;MA4C3B,oBAAoB;EAUjC,OAAO,OAAO,eAAe;;;;;;SAuDtB,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,eAAe;;;;;SAKnC,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,eAAA,iBAPAA"}
1
+ {"version":3,"file":"ai.d.cts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;;;;;;UA6DnB;MAgCJ,cAAc;SAWX;MAIH,iBAAiB,MAAM,aAAa;MA4C3B,oBAAoB;EAUjC,OAAO,OAAO,eAAe;;;;;;SA4DtB,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,eAAe;;;;;SAKnC,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,eAAA,iBAPAA"}
@@ -53,6 +53,12 @@ export declare class AIMessageChunk<TStructure extends MessageStructure = Messag
53
53
  tool_call_chunks?: ToolCallChunk[];
54
54
  usage_metadata?: AIMessageChunkFields<TStructure>["usage_metadata"];
55
55
  constructor(fields: $InferMessageContent<TStructure, "ai"> | AIMessageChunkFields<TStructure>);
56
+ /**
57
+ * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
58
+ * Own-property getters (not prototype accessors) so spread / Object.entries still see
59
+ * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
60
+ */
61
+ private _defineLazyToolCallGetters;
56
62
  get lc_aliases(): Record<string, string>;
57
63
  static lc_name(): string;
58
64
  get contentBlocks(): Array<ContentBlock.Standard>;
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;MAgDvB,cAAc;SAWX;MAIH,iBAAiB,MAAM,aAAa;MA4C3B,oBAAoB;EAUjC,OAAO,OAAO,eAAe;;;;;;SAuDtB,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,eAAe;;;;;SAKnC,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,eAAA,iBAPAA"}
1
+ {"version":3,"file":"ai.d.ts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;;;;;;UA6DnB;MAgCJ,cAAc;SAWX;MAIH,iBAAiB,MAAM,aAAa;MA4C3B,oBAAoB;EAUjC,OAAO,OAAO,eAAe;;;;;;SA4DtB,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,eAAe;;;;;SAKnC,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,eAAA,iBAPAA"}
@@ -161,22 +161,50 @@ var AIMessageChunk = class extends BaseMessageChunk {
161
161
  tool_call_chunks: [],
162
162
  usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
163
163
  };
164
- else {
165
- const collapsed = collapseToolCallChunks(fields.tool_call_chunks ?? []);
166
- initParams = {
167
- ...fields,
168
- tool_call_chunks: collapsed.tool_call_chunks,
169
- tool_calls: collapsed.tool_calls,
170
- invalid_tool_calls: collapsed.invalid_tool_calls,
171
- usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
172
- };
173
- }
164
+ else initParams = {
165
+ ...fields,
166
+ usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
167
+ };
174
168
  super(initParams);
175
169
  this.tool_call_chunks = initParams.tool_call_chunks ?? this.tool_call_chunks;
176
- this.tool_calls = initParams.tool_calls ?? this.tool_calls;
177
- this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls;
170
+ if (typeof fields !== "string" && !Array.isArray(fields) && fields.tool_call_chunks !== void 0 && fields.tool_call_chunks.length > 0) this._defineLazyToolCallGetters(fields.tool_call_chunks.map((chunk) => ({ ...chunk })));
171
+ else {
172
+ this.tool_calls = initParams.tool_calls ?? this.tool_calls;
173
+ this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls;
174
+ }
178
175
  this.usage_metadata = initParams.usage_metadata;
179
176
  }
177
+ /**
178
+ * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
179
+ * Own-property getters (not prototype accessors) so spread / Object.entries still see
180
+ * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
181
+ */
182
+ _defineLazyToolCallGetters(toolCallChunks) {
183
+ let collapsed;
184
+ const getCollapsed = () => {
185
+ collapsed ??= collapseToolCallChunks(toolCallChunks);
186
+ return collapsed;
187
+ };
188
+ const defineLazy = (target, prop) => {
189
+ Object.defineProperty(target, prop, {
190
+ get: () => getCollapsed()[prop],
191
+ set: (value) => {
192
+ Object.defineProperty(target, prop, {
193
+ value,
194
+ writable: true,
195
+ enumerable: true,
196
+ configurable: true
197
+ });
198
+ },
199
+ enumerable: true,
200
+ configurable: true
201
+ });
202
+ };
203
+ defineLazy(this, "tool_calls");
204
+ defineLazy(this, "invalid_tool_calls");
205
+ defineLazy(this.lc_kwargs, "tool_calls");
206
+ defineLazy(this.lc_kwargs, "invalid_tool_calls");
207
+ }
180
208
  get lc_aliases() {
181
209
  return {
182
210
  ...super.lc_aliases,
@@ -232,7 +260,7 @@ var AIMessageChunk = class extends BaseMessageChunk {
232
260
  const rawToolCalls = _mergeLists(this.tool_call_chunks, chunk.tool_call_chunks);
233
261
  if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_call_chunks = rawToolCalls;
234
262
  }
235
- if (this.tool_calls !== void 0 || chunk.tool_calls !== void 0) {
263
+ if ((combinedFields.tool_call_chunks === void 0 || combinedFields.tool_call_chunks.length === 0) && (this.tool_calls !== void 0 || chunk.tool_calls !== void 0)) {
236
264
  const rawToolCalls = _mergeLists(this.tool_calls, chunk.tool_calls);
237
265
  if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_calls = rawToolCalls;
238
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","names":[],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n const collapsed = collapseToolCallChunks(fields.tool_call_chunks ?? []);\n initParams = {\n ...fields,\n tool_call_chunks: collapsed.tool_call_chunks,\n tool_calls: collapsed.tool_calls as $InferToolCalls<TStructure>[],\n invalid_tool_calls: collapsed.invalid_tool_calls,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n this.usage_metadata = initParams.usage_metadata;\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n if (this.tool_calls !== undefined || chunk.tool_calls !== undefined) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","names":[],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n // Collapsed lazily on first read; see _defineLazyToolCallGetters.\n initParams = {\n ...fields,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n if (\n typeof fields !== \"string\" &&\n !Array.isArray(fields) &&\n fields.tool_call_chunks !== undefined &&\n fields.tool_call_chunks.length > 0\n ) {\n this._defineLazyToolCallGetters(\n fields.tool_call_chunks.map((chunk) => ({ ...chunk }))\n );\n } else {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n /**\n * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.\n * Own-property getters (not prototype accessors) so spread / Object.entries still see\n * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.\n */\n private _defineLazyToolCallGetters(toolCallChunks: ToolCallChunk[]) {\n let collapsed: ReturnType<typeof collapseToolCallChunks> | undefined;\n const getCollapsed = () => {\n collapsed ??= collapseToolCallChunks(toolCallChunks);\n return collapsed;\n };\n const defineLazy = (\n target: object,\n prop: \"tool_calls\" | \"invalid_tool_calls\"\n ) => {\n Object.defineProperty(target, prop, {\n get: () => getCollapsed()[prop],\n // Writing to the property replaces the getter with a plain value,\n // restoring normal assignment semantics.\n set: (value: unknown) => {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n },\n enumerable: true,\n configurable: true,\n });\n };\n defineLazy(this, \"tool_calls\");\n defineLazy(this, \"invalid_tool_calls\");\n defineLazy(this.lc_kwargs, \"tool_calls\");\n defineLazy(this.lc_kwargs, \"invalid_tool_calls\");\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n // Skip when chunks exist: the constructor derives tool_calls, and reading here forces a collapse.\n if (\n (combinedFields.tool_call_chunks === undefined ||\n combinedFields.tool_call_chunks.length === 0) &&\n (this.tool_calls !== undefined || chunk.tool_calls !== undefined)\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}