UNPKG

@langchain/core

Version:
1 lines 29 kB
{"version":3,"file":"stream.cjs","names":["AIMessage"],"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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"}