@langchain/core 1.1.40-dev-1777073688723 → 1.1.40-dev-1777128506086

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":"base.d.ts","names":[],"sources":["../../src/callbacks/base.ts"],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/callbacks/base.ts"],"mappings":"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"}
@@ -139,7 +139,7 @@ var BaseLangChain = class extends require_base.Runnable {
139
139
  this.callbacks = params.callbacks;
140
140
  this.tags = params.tags ?? [];
141
141
  this.metadata = params.metadata ?? {};
142
- this._addVersion("@langchain/core", "1.1.40-dev-1777073688723");
142
+ this._addVersion("@langchain/core", "1.1.40-dev-1777128506086");
143
143
  }
144
144
  _addVersion(pkg, version) {
145
145
  const existing = this.metadata?.versions;
@@ -138,7 +138,7 @@ var BaseLangChain = class extends Runnable {
138
138
  this.callbacks = params.callbacks;
139
139
  this.tags = params.tags ?? [];
140
140
  this.metadata = params.metadata ?? {};
141
- this._addVersion("@langchain/core", "1.1.40-dev-1777073688723");
141
+ this._addVersion("@langchain/core", "1.1.40-dev-1777128506086");
142
142
  }
143
143
  _addVersion(pkg, version) {
144
144
  const existing = this.metadata?.versions;
@@ -28,7 +28,7 @@ async function* convertChunksToEvents(chunks, options) {
28
28
  if (!messageStarted) {
29
29
  messageStarted = true;
30
30
  const startEvent = {
31
- type: "message-start",
31
+ event: "message-start",
32
32
  id: msg.id ?? void 0
33
33
  };
34
34
  if (require_ai.isAIMessageChunk(msg) && msg.usage_metadata) {
@@ -52,7 +52,7 @@ async function* convertChunksToEvents(chunks, options) {
52
52
  accumulated: initial
53
53
  });
54
54
  yield {
55
- type: "content-block-start",
55
+ event: "content-block-start",
56
56
  index: blockIndex,
57
57
  content: initial
58
58
  };
@@ -63,7 +63,7 @@ async function* convertChunksToEvents(chunks, options) {
63
63
  text: (block.accumulated.text ?? "") + content
64
64
  };
65
65
  yield {
66
- type: "content-block-delta",
66
+ event: "content-block-delta",
67
67
  index: blockIndex,
68
68
  content: {
69
69
  type: "text",
@@ -79,7 +79,7 @@ async function* convertChunksToEvents(chunks, options) {
79
79
  accumulated: { ...part }
80
80
  });
81
81
  yield {
82
- type: "content-block-start",
82
+ event: "content-block-start",
83
83
  index: blockIndex,
84
84
  content: { ...part }
85
85
  };
@@ -87,7 +87,7 @@ async function* convertChunksToEvents(chunks, options) {
87
87
  const block = activeBlocks.get(blockIndex);
88
88
  block.accumulated = applyDeltaToBlock(block.accumulated, part);
89
89
  yield {
90
- type: "content-block-delta",
90
+ event: "content-block-delta",
91
91
  index: blockIndex,
92
92
  content: part
93
93
  };
@@ -108,7 +108,7 @@ async function* convertChunksToEvents(chunks, options) {
108
108
  accumulated: initial
109
109
  });
110
110
  yield {
111
- type: "content-block-start",
111
+ event: "content-block-start",
112
112
  index: blockIndex,
113
113
  content: initial
114
114
  };
@@ -119,7 +119,7 @@ async function* convertChunksToEvents(chunks, options) {
119
119
  if (toolChunk.name != null) acc.name = toolChunk.name;
120
120
  acc.args = (acc.args ?? "") + (toolChunk.args ?? "");
121
121
  yield {
122
- type: "content-block-delta",
122
+ event: "content-block-delta",
123
123
  index: blockIndex,
124
124
  content: { ...block.accumulated }
125
125
  };
@@ -133,18 +133,18 @@ async function* convertChunksToEvents(chunks, options) {
133
133
  total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens
134
134
  };
135
135
  yield {
136
- type: "usage",
136
+ event: "usage",
137
137
  usage: { ...lastUsage }
138
138
  };
139
139
  }
140
140
  }
141
141
  for (const [index, block] of activeBlocks) yield {
142
- type: "content-block-finish",
142
+ event: "content-block-finish",
143
143
  index,
144
144
  content: finalizeContentBlock(block.accumulated)
145
145
  };
146
146
  yield {
147
- type: "message-finish",
147
+ event: "message-finish",
148
148
  reason: "stop",
149
149
  ...lastUsage ? { usage: lastUsage } : {}
150
150
  };
@@ -155,6 +155,14 @@ async function* convertChunksToEvents(chunks, options) {
155
155
  */
156
156
  function applyDeltaToBlock(block, delta) {
157
157
  if (block.type !== delta.type) return { ...delta };
158
+ if (delta.type === "thinking" && block.type === "thinking") {
159
+ const thinking = (block.thinking ?? "") + (delta.thinking ?? "");
160
+ return {
161
+ ...block,
162
+ ...delta,
163
+ thinking
164
+ };
165
+ }
158
166
  switch (delta.type) {
159
167
  case "text": return {
160
168
  ...block,
@@ -1 +1 @@
1
- {"version":3,"file":"compat.cjs","names":["isAIMessageChunk"],"sources":["../../src/language_models/compat.ts"],"sourcesContent":["/**\n * Compatibility bridge: converts legacy `_streamResponseChunks`\n * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new\n * `ChatModelStreamEvent` protocol.\n *\n * @module\n */\n\nimport { isAIMessageChunk } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { ChatGenerationChunk } from \"../outputs.js\";\nimport type { ChatModelStreamEvent } from \"./event.js\";\n\n/**\n * Convert an async iterable of legacy `ChatGenerationChunk`s into\n * `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertChunksToEvents(\n chunks: AsyncIterable<ChatGenerationChunk>,\n options?: { signal?: AbortSignal }\n): AsyncGenerator<ChatModelStreamEvent> {\n const activeBlocks = new Map<\n number,\n { type: string; accumulated: ContentBlock }\n >();\n let messageStarted = false;\n let lastUsage:\n | { input_tokens: number; output_tokens: number; total_tokens: number }\n | undefined;\n\n for await (const chunk of chunks) {\n options?.signal?.throwIfAborted();\n\n const msg = chunk.message;\n\n // Message start\n let usageHandledInStart = false;\n if (!messageStarted) {\n messageStarted = true;\n const startEvent: ChatModelStreamEvent = {\n type: \"message-start\" as const,\n id: msg.id ?? undefined,\n };\n if (isAIMessageChunk(msg) && msg.usage_metadata) {\n (startEvent as { usage?: unknown }).usage = msg.usage_metadata;\n lastUsage = { ...msg.usage_metadata };\n usageHandledInStart = true;\n }\n yield startEvent;\n }\n\n // Process content\n const content = msg.content;\n if (typeof content === \"string\") {\n if (content !== \"\") {\n const blockIndex = 0;\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock.Text = { type: \"text\", text: \"\" };\n activeBlocks.set(blockIndex, {\n type: \"text\",\n accumulated: initial,\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = {\n ...block.accumulated,\n text: ((block.accumulated as { text?: string }).text ?? \"\") + content,\n };\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: { type: \"text\" as const, text: content },\n };\n }\n } else if (Array.isArray(content)) {\n for (const part of content) {\n const blockIndex =\n typeof part.index === \"number\" ? part.index : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n activeBlocks.set(blockIndex, {\n type: part.type,\n accumulated: { ...part },\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...part },\n };\n } else {\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = applyDeltaToBlock(block.accumulated, part);\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: part,\n };\n }\n }\n }\n\n // Tool call chunks\n if (\n isAIMessageChunk(msg) &&\n msg.tool_call_chunks &&\n msg.tool_call_chunks.length > 0\n ) {\n for (const toolChunk of msg.tool_call_chunks) {\n const blockIndex =\n typeof toolChunk.index === \"number\"\n ? toolChunk.index\n : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock = {\n type: \"tool_call_chunk\" as const,\n id: toolChunk.id,\n name: toolChunk.name,\n args: \"\",\n index: blockIndex,\n };\n activeBlocks.set(blockIndex, {\n type: \"tool_call_chunk\",\n accumulated: initial,\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n\n // Accumulate tool call args internally, emit incremental content chunks.\n const block = activeBlocks.get(blockIndex)!;\n const acc = block.accumulated as {\n args?: string;\n id?: string;\n name?: string;\n };\n if (toolChunk.id != null) acc.id = toolChunk.id;\n if (toolChunk.name != null) acc.name = toolChunk.name;\n acc.args = (acc.args ?? \"\") + (toolChunk.args ?? \"\");\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: { ...(block.accumulated as ContentBlock) },\n };\n }\n }\n\n // Usage\n if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) {\n const chunkUsage = msg.usage_metadata;\n if (!lastUsage) {\n lastUsage = { ...chunkUsage };\n } else {\n lastUsage = {\n input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,\n output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,\n total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens,\n };\n }\n yield { type: \"usage\" as const, usage: { ...lastUsage } };\n }\n }\n\n // Finish all blocks\n for (const [index, block] of activeBlocks) {\n const finalized = finalizeContentBlock(block.accumulated);\n yield {\n type: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n }\n\n yield {\n type: \"message-finish\" as const,\n reason: \"stop\" as const,\n ...(lastUsage ? { usage: lastUsage } : {}),\n };\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n * @internal\n */\nfunction applyDeltaToBlock(\n block: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (block.type !== delta.type) {\n return { ...delta };\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...block,\n ...delta,\n text: ((block as { text?: string }).text ?? \"\") + delta.text,\n };\n case \"reasoning\":\n return {\n ...block,\n ...delta,\n reasoning:\n ((block as { reasoning?: string }).reasoning ?? \"\") + delta.reasoning,\n };\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n const merged = { ...block, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in block && block.id != null) {\n merged.id = block.id;\n }\n if (delta.name == null && \"name\" in block && block.name != null) {\n merged.name = block.name;\n }\n merged.args = `${(\"args\" in block ? block.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as ContentBlock;\n }\n default:\n return { ...block, ...delta };\n }\n}\n\n/**\n * Finalize a content block for the finish event.\n * For tool calls, parse the accumulated JSON args string.\n */\nexport function finalizeContentBlock(block: ContentBlock): ContentBlock {\n if (block.type === \"tool_call_chunk\") {\n const chunk = block as ContentBlock.Tools.ToolCallChunk;\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(chunk.args ?? \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: chunk.id,\n name: chunk.name,\n args: chunk.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: \"tool_call\" as const,\n id: chunk.id,\n name: chunk.name!,\n args: parsedArgs,\n } as ContentBlock.Tools.ToolCall;\n }\n\n return block;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiBA,gBAAuB,sBACrB,QACA,SACsC;CACtC,MAAM,+BAAe,IAAI,KAGtB;CACH,IAAI,iBAAiB;CACrB,IAAI;AAIJ,YAAW,MAAM,SAAS,QAAQ;AAChC,WAAS,QAAQ,gBAAgB;EAEjC,MAAM,MAAM,MAAM;EAGlB,IAAI,sBAAsB;AAC1B,MAAI,CAAC,gBAAgB;AACnB,oBAAiB;GACjB,MAAM,aAAmC;IACvC,MAAM;IACN,IAAI,IAAI,MAAM,KAAA;IACf;AACD,OAAIA,WAAAA,iBAAiB,IAAI,IAAI,IAAI,gBAAgB;AAC9C,eAAmC,QAAQ,IAAI;AAChD,gBAAY,EAAE,GAAG,IAAI,gBAAgB;AACrC,0BAAsB;;AAExB,SAAM;;EAIR,MAAM,UAAU,IAAI;AACpB,MAAI,OAAO,YAAY;OACjB,YAAY,IAAI;IAClB,MAAM,aAAa;AACnB,QAAI,CAAC,aAAa,IAAI,WAAW,EAAE;KACjC,MAAM,UAA6B;MAAE,MAAM;MAAQ,MAAM;MAAI;AAC7D,kBAAa,IAAI,YAAY;MAC3B,MAAM;MACN,aAAa;MACd,CAAC;AACF,WAAM;MACJ,MAAM;MACN,OAAO;MACP,SAAS;MACV;;IAEH,MAAM,QAAQ,aAAa,IAAI,WAAW;AAC1C,UAAM,cAAc;KAClB,GAAG,MAAM;KACT,OAAQ,MAAM,YAAkC,QAAQ,MAAM;KAC/D;AACD,UAAM;KACJ,MAAM;KACN,OAAO;KACP,SAAS;MAAE,MAAM;MAAiB,MAAM;MAAS;KAClD;;aAEM,MAAM,QAAQ,QAAQ,CAC/B,MAAK,MAAM,QAAQ,SAAS;GAC1B,MAAM,aACJ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,aAAa;AAE7D,OAAI,CAAC,aAAa,IAAI,WAAW,EAAE;AACjC,iBAAa,IAAI,YAAY;KAC3B,MAAM,KAAK;KACX,aAAa,EAAE,GAAG,MAAM;KACzB,CAAC;AACF,UAAM;KACJ,MAAM;KACN,OAAO;KACP,SAAS,EAAE,GAAG,MAAM;KACrB;UACI;IACL,MAAM,QAAQ,aAAa,IAAI,WAAW;AAC1C,UAAM,cAAc,kBAAkB,MAAM,aAAa,KAAK;AAC9D,UAAM;KACJ,MAAM;KACN,OAAO;KACP,SAAS;KACV;;;AAMP,MACEA,WAAAA,iBAAiB,IAAI,IACrB,IAAI,oBACJ,IAAI,iBAAiB,SAAS,EAE9B,MAAK,MAAM,aAAa,IAAI,kBAAkB;GAC5C,MAAM,aACJ,OAAO,UAAU,UAAU,WACvB,UAAU,QACV,aAAa;AAEnB,OAAI,CAAC,aAAa,IAAI,WAAW,EAAE;IACjC,MAAM,UAAwB;KAC5B,MAAM;KACN,IAAI,UAAU;KACd,MAAM,UAAU;KAChB,MAAM;KACN,OAAO;KACR;AACD,iBAAa,IAAI,YAAY;KAC3B,MAAM;KACN,aAAa;KACd,CAAC;AACF,UAAM;KACJ,MAAM;KACN,OAAO;KACP,SAAS;KACV;;GAIH,MAAM,QAAQ,aAAa,IAAI,WAAW;GAC1C,MAAM,MAAM,MAAM;AAKlB,OAAI,UAAU,MAAM,KAAM,KAAI,KAAK,UAAU;AAC7C,OAAI,UAAU,QAAQ,KAAM,KAAI,OAAO,UAAU;AACjD,OAAI,QAAQ,IAAI,QAAQ,OAAO,UAAU,QAAQ;AACjD,SAAM;IACJ,MAAM;IACN,OAAO;IACP,SAAS,EAAE,GAAI,MAAM,aAA8B;IACpD;;AAKL,MAAI,CAAC,uBAAuBA,WAAAA,iBAAiB,IAAI,IAAI,IAAI,gBAAgB;GACvE,MAAM,aAAa,IAAI;AACvB,OAAI,CAAC,UACH,aAAY,EAAE,GAAG,YAAY;OAE7B,aAAY;IACV,cAAc,UAAU,eAAe,WAAW;IAClD,eAAe,UAAU,gBAAgB,WAAW;IACpD,cAAc,UAAU,eAAe,WAAW;IACnD;AAEH,SAAM;IAAE,MAAM;IAAkB,OAAO,EAAE,GAAG,WAAW;IAAE;;;AAK7D,MAAK,MAAM,CAAC,OAAO,UAAU,aAE3B,OAAM;EACJ,MAAM;EACN;EACA,SAJgB,qBAAqB,MAAM,YAAY;EAKxD;AAGH,OAAM;EACJ,MAAM;EACN,QAAQ;EACR,GAAI,YAAY,EAAE,OAAO,WAAW,GAAG,EAAE;EAC1C;;;;;;AAOH,SAAS,kBACP,OACA,OACc;AACd,KAAI,MAAM,SAAS,MAAM,KACvB,QAAO,EAAE,GAAG,OAAO;AAGrB,SAAQ,MAAM,MAAd;EACE,KAAK,OACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,OAAQ,MAA4B,QAAQ,MAAM,MAAM;GACzD;EACH,KAAK,YACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,YACI,MAAiC,aAAa,MAAM,MAAM;GAC/D;EACH,KAAK;EACL,KAAK,0BAA0B;GAC7B,MAAM,SAAS;IAAE,GAAG;IAAO,GAAG;IAAO;AACrC,OAAI,MAAM,MAAM,QAAQ,QAAQ,SAAS,MAAM,MAAM,KACnD,QAAO,KAAK,MAAM;AAEpB,OAAI,MAAM,QAAQ,QAAQ,UAAU,SAAS,MAAM,QAAQ,KACzD,QAAO,OAAO,MAAM;AAEtB,UAAO,OAAO,IAAI,UAAU,QAAQ,MAAM,OAAO,OAAO,KAAK,MAAM,QAAQ;AAC3E,UAAO;;EAET,QACE,QAAO;GAAE,GAAG;GAAO,GAAG;GAAO;;;;;;;AAQnC,SAAgB,qBAAqB,OAAmC;AACtE,KAAI,MAAM,SAAS,mBAAmB;EACpC,MAAM,QAAQ;EACd,IAAI;AACJ,MAAI;AACF,gBAAa,KAAK,MAAM,MAAM,QAAQ,KAAK;UACrC;AACN,UAAO;IACL,MAAM;IACN,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,OAAO;IACR;;AAEH,SAAO;GACL,MAAM;GACN,IAAI,MAAM;GACV,MAAM,MAAM;GACZ,MAAM;GACP;;AAGH,QAAO"}
1
+ {"version":3,"file":"compat.cjs","names":["isAIMessageChunk"],"sources":["../../src/language_models/compat.ts"],"sourcesContent":["/**\n * Compatibility bridge: converts legacy `_streamResponseChunks`\n * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new\n * `ChatModelStreamEvent` protocol.\n *\n * @module\n */\n\nimport { isAIMessageChunk } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { ChatGenerationChunk } from \"../outputs.js\";\nimport type { ChatModelStreamEvent } from \"./event.js\";\n\n/**\n * Convert an async iterable of legacy `ChatGenerationChunk`s into\n * `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertChunksToEvents(\n chunks: AsyncIterable<ChatGenerationChunk>,\n options?: { signal?: AbortSignal }\n): AsyncGenerator<ChatModelStreamEvent> {\n const activeBlocks = new Map<\n number,\n { type: string; accumulated: ContentBlock }\n >();\n let messageStarted = false;\n let lastUsage:\n | { input_tokens: number; output_tokens: number; total_tokens: number }\n | undefined;\n\n for await (const chunk of chunks) {\n options?.signal?.throwIfAborted();\n\n const msg = chunk.message;\n\n // Message start\n let usageHandledInStart = false;\n if (!messageStarted) {\n messageStarted = true;\n const startEvent: ChatModelStreamEvent = {\n event: \"message-start\" as const,\n id: msg.id ?? undefined,\n };\n if (isAIMessageChunk(msg) && msg.usage_metadata) {\n (startEvent as { usage?: unknown }).usage = msg.usage_metadata;\n lastUsage = { ...msg.usage_metadata };\n usageHandledInStart = true;\n }\n yield startEvent;\n }\n\n // Process content\n const content = msg.content;\n if (typeof content === \"string\") {\n if (content !== \"\") {\n const blockIndex = 0;\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock.Text = { type: \"text\", text: \"\" };\n activeBlocks.set(blockIndex, {\n type: \"text\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = {\n ...block.accumulated,\n text: ((block.accumulated as { text?: string }).text ?? \"\") + content,\n };\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n content: { type: \"text\" as const, text: content },\n };\n }\n } else if (Array.isArray(content)) {\n for (const part of content) {\n const blockIndex =\n typeof part.index === \"number\" ? part.index : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n activeBlocks.set(blockIndex, {\n type: part.type,\n accumulated: { ...part },\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...part },\n };\n } else {\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = applyDeltaToBlock(block.accumulated, part);\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n content: part,\n };\n }\n }\n }\n\n // Tool call chunks\n if (\n isAIMessageChunk(msg) &&\n msg.tool_call_chunks &&\n msg.tool_call_chunks.length > 0\n ) {\n for (const toolChunk of msg.tool_call_chunks) {\n const blockIndex =\n typeof toolChunk.index === \"number\"\n ? toolChunk.index\n : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock = {\n type: \"tool_call_chunk\" as const,\n id: toolChunk.id,\n name: toolChunk.name,\n args: \"\",\n index: blockIndex,\n };\n activeBlocks.set(blockIndex, {\n type: \"tool_call_chunk\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n\n // Accumulate tool call args internally, emit incremental content chunks.\n const block = activeBlocks.get(blockIndex)!;\n const acc = block.accumulated as {\n args?: string;\n id?: string;\n name?: string;\n };\n if (toolChunk.id != null) acc.id = toolChunk.id;\n if (toolChunk.name != null) acc.name = toolChunk.name;\n acc.args = (acc.args ?? \"\") + (toolChunk.args ?? \"\");\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n content: { ...(block.accumulated as ContentBlock) },\n };\n }\n }\n\n // Usage\n if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) {\n const chunkUsage = msg.usage_metadata;\n if (!lastUsage) {\n lastUsage = { ...chunkUsage };\n } else {\n lastUsage = {\n input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,\n output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,\n total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens,\n };\n }\n yield { event: \"usage\" as const, usage: { ...lastUsage } };\n }\n }\n\n // Finish all blocks\n for (const [index, block] of activeBlocks) {\n const finalized = finalizeContentBlock(block.accumulated);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: \"stop\" as const,\n ...(lastUsage ? { usage: lastUsage } : {}),\n };\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n * @internal\n */\nfunction applyDeltaToBlock(\n block: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (block.type !== delta.type) {\n return { ...delta };\n }\n\n if (\n (delta as { type?: string }).type === \"thinking\" &&\n (block as { type?: string }).type === \"thinking\"\n ) {\n const thinking =\n ((block as { thinking?: string }).thinking ?? \"\") +\n ((delta as { thinking?: string }).thinking ?? \"\");\n return { ...block, ...delta, thinking } as unknown as ContentBlock;\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...block,\n ...delta,\n text: ((block as { text?: string }).text ?? \"\") + delta.text,\n };\n case \"reasoning\":\n return {\n ...block,\n ...delta,\n reasoning:\n ((block as { reasoning?: string }).reasoning ?? \"\") + delta.reasoning,\n };\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n const merged = { ...block, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in block && block.id != null) {\n merged.id = block.id;\n }\n if (delta.name == null && \"name\" in block && block.name != null) {\n merged.name = block.name;\n }\n merged.args = `${(\"args\" in block ? block.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as ContentBlock;\n }\n default:\n return { ...block, ...delta };\n }\n}\n\n/**\n * Finalize a content block for the finish event.\n * For tool calls, parse the accumulated JSON args string.\n */\nexport function finalizeContentBlock(block: ContentBlock): ContentBlock {\n if (block.type === \"tool_call_chunk\") {\n const chunk = block as ContentBlock.Tools.ToolCallChunk;\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(chunk.args ?? \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: chunk.id,\n name: chunk.name,\n args: chunk.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: \"tool_call\" as const,\n id: chunk.id,\n name: chunk.name!,\n args: parsedArgs,\n } as ContentBlock.Tools.ToolCall;\n }\n\n return block;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.cts","names":[],"sources":["../../src/language_models/compat.ts"],"mappings":";;;;;;;;;iBAiBuB,qBAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,mBAAA,GACtB,OAAA;EAAY,MAAA,GAAS,WAAA;AAAA,IACpB,cAAA,CAAe,oBAAA;;;;;iBAuNF,oBAAA,CAAqB,KAAA,EAAO,YAAA,GAAe,YAAA"}
1
+ {"version":3,"file":"compat.d.cts","names":[],"sources":["../../src/language_models/compat.ts"],"mappings":";;;;;;;;;iBAiBuB,qBAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,mBAAA,GACtB,OAAA;EAAY,MAAA,GAAS,WAAA;AAAA,IACpB,cAAA,CAAe,oBAAA;;;;;iBAiOF,oBAAA,CAAqB,KAAA,EAAO,YAAA,GAAe,YAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.ts","names":[],"sources":["../../src/language_models/compat.ts"],"mappings":";;;;;;;;;iBAiBuB,qBAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,mBAAA,GACtB,OAAA;EAAY,MAAA,GAAS,WAAA;AAAA,IACpB,cAAA,CAAe,oBAAA;;;;;iBAuNF,oBAAA,CAAqB,KAAA,EAAO,YAAA,GAAe,YAAA"}
1
+ {"version":3,"file":"compat.d.ts","names":[],"sources":["../../src/language_models/compat.ts"],"mappings":";;;;;;;;;iBAiBuB,qBAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,mBAAA,GACtB,OAAA;EAAY,MAAA,GAAS,WAAA;AAAA,IACpB,cAAA,CAAe,oBAAA;;;;;iBAiOF,oBAAA,CAAqB,KAAA,EAAO,YAAA,GAAe,YAAA"}
@@ -27,7 +27,7 @@ async function* convertChunksToEvents(chunks, options) {
27
27
  if (!messageStarted) {
28
28
  messageStarted = true;
29
29
  const startEvent = {
30
- type: "message-start",
30
+ event: "message-start",
31
31
  id: msg.id ?? void 0
32
32
  };
33
33
  if (isAIMessageChunk(msg) && msg.usage_metadata) {
@@ -51,7 +51,7 @@ async function* convertChunksToEvents(chunks, options) {
51
51
  accumulated: initial
52
52
  });
53
53
  yield {
54
- type: "content-block-start",
54
+ event: "content-block-start",
55
55
  index: blockIndex,
56
56
  content: initial
57
57
  };
@@ -62,7 +62,7 @@ async function* convertChunksToEvents(chunks, options) {
62
62
  text: (block.accumulated.text ?? "") + content
63
63
  };
64
64
  yield {
65
- type: "content-block-delta",
65
+ event: "content-block-delta",
66
66
  index: blockIndex,
67
67
  content: {
68
68
  type: "text",
@@ -78,7 +78,7 @@ async function* convertChunksToEvents(chunks, options) {
78
78
  accumulated: { ...part }
79
79
  });
80
80
  yield {
81
- type: "content-block-start",
81
+ event: "content-block-start",
82
82
  index: blockIndex,
83
83
  content: { ...part }
84
84
  };
@@ -86,7 +86,7 @@ async function* convertChunksToEvents(chunks, options) {
86
86
  const block = activeBlocks.get(blockIndex);
87
87
  block.accumulated = applyDeltaToBlock(block.accumulated, part);
88
88
  yield {
89
- type: "content-block-delta",
89
+ event: "content-block-delta",
90
90
  index: blockIndex,
91
91
  content: part
92
92
  };
@@ -107,7 +107,7 @@ async function* convertChunksToEvents(chunks, options) {
107
107
  accumulated: initial
108
108
  });
109
109
  yield {
110
- type: "content-block-start",
110
+ event: "content-block-start",
111
111
  index: blockIndex,
112
112
  content: initial
113
113
  };
@@ -118,7 +118,7 @@ async function* convertChunksToEvents(chunks, options) {
118
118
  if (toolChunk.name != null) acc.name = toolChunk.name;
119
119
  acc.args = (acc.args ?? "") + (toolChunk.args ?? "");
120
120
  yield {
121
- type: "content-block-delta",
121
+ event: "content-block-delta",
122
122
  index: blockIndex,
123
123
  content: { ...block.accumulated }
124
124
  };
@@ -132,18 +132,18 @@ async function* convertChunksToEvents(chunks, options) {
132
132
  total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens
133
133
  };
134
134
  yield {
135
- type: "usage",
135
+ event: "usage",
136
136
  usage: { ...lastUsage }
137
137
  };
138
138
  }
139
139
  }
140
140
  for (const [index, block] of activeBlocks) yield {
141
- type: "content-block-finish",
141
+ event: "content-block-finish",
142
142
  index,
143
143
  content: finalizeContentBlock(block.accumulated)
144
144
  };
145
145
  yield {
146
- type: "message-finish",
146
+ event: "message-finish",
147
147
  reason: "stop",
148
148
  ...lastUsage ? { usage: lastUsage } : {}
149
149
  };
@@ -154,6 +154,14 @@ async function* convertChunksToEvents(chunks, options) {
154
154
  */
155
155
  function applyDeltaToBlock(block, delta) {
156
156
  if (block.type !== delta.type) return { ...delta };
157
+ if (delta.type === "thinking" && block.type === "thinking") {
158
+ const thinking = (block.thinking ?? "") + (delta.thinking ?? "");
159
+ return {
160
+ ...block,
161
+ ...delta,
162
+ thinking
163
+ };
164
+ }
157
165
  switch (delta.type) {
158
166
  case "text": return {
159
167
  ...block,
@@ -1 +1 @@
1
- {"version":3,"file":"compat.js","names":[],"sources":["../../src/language_models/compat.ts"],"sourcesContent":["/**\n * Compatibility bridge: converts legacy `_streamResponseChunks`\n * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new\n * `ChatModelStreamEvent` protocol.\n *\n * @module\n */\n\nimport { isAIMessageChunk } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { ChatGenerationChunk } from \"../outputs.js\";\nimport type { ChatModelStreamEvent } from \"./event.js\";\n\n/**\n * Convert an async iterable of legacy `ChatGenerationChunk`s into\n * `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertChunksToEvents(\n chunks: AsyncIterable<ChatGenerationChunk>,\n options?: { signal?: AbortSignal }\n): AsyncGenerator<ChatModelStreamEvent> {\n const activeBlocks = new Map<\n number,\n { type: string; accumulated: ContentBlock }\n >();\n let messageStarted = false;\n let lastUsage:\n | { input_tokens: number; output_tokens: number; total_tokens: number }\n | undefined;\n\n for await (const chunk of chunks) {\n options?.signal?.throwIfAborted();\n\n const msg = chunk.message;\n\n // Message start\n let usageHandledInStart = false;\n if (!messageStarted) {\n messageStarted = true;\n const startEvent: ChatModelStreamEvent = {\n type: \"message-start\" as const,\n id: msg.id ?? undefined,\n };\n if (isAIMessageChunk(msg) && msg.usage_metadata) {\n (startEvent as { usage?: unknown }).usage = msg.usage_metadata;\n lastUsage = { ...msg.usage_metadata };\n usageHandledInStart = true;\n }\n yield startEvent;\n }\n\n // Process content\n const content = msg.content;\n if (typeof content === \"string\") {\n if (content !== \"\") {\n const blockIndex = 0;\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock.Text = { type: \"text\", text: \"\" };\n activeBlocks.set(blockIndex, {\n type: \"text\",\n accumulated: initial,\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = {\n ...block.accumulated,\n text: ((block.accumulated as { text?: string }).text ?? \"\") + content,\n };\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: { type: \"text\" as const, text: content },\n };\n }\n } else if (Array.isArray(content)) {\n for (const part of content) {\n const blockIndex =\n typeof part.index === \"number\" ? part.index : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n activeBlocks.set(blockIndex, {\n type: part.type,\n accumulated: { ...part },\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...part },\n };\n } else {\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = applyDeltaToBlock(block.accumulated, part);\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: part,\n };\n }\n }\n }\n\n // Tool call chunks\n if (\n isAIMessageChunk(msg) &&\n msg.tool_call_chunks &&\n msg.tool_call_chunks.length > 0\n ) {\n for (const toolChunk of msg.tool_call_chunks) {\n const blockIndex =\n typeof toolChunk.index === \"number\"\n ? toolChunk.index\n : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock = {\n type: \"tool_call_chunk\" as const,\n id: toolChunk.id,\n name: toolChunk.name,\n args: \"\",\n index: blockIndex,\n };\n activeBlocks.set(blockIndex, {\n type: \"tool_call_chunk\",\n accumulated: initial,\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n\n // Accumulate tool call args internally, emit incremental content chunks.\n const block = activeBlocks.get(blockIndex)!;\n const acc = block.accumulated as {\n args?: string;\n id?: string;\n name?: string;\n };\n if (toolChunk.id != null) acc.id = toolChunk.id;\n if (toolChunk.name != null) acc.name = toolChunk.name;\n acc.args = (acc.args ?? \"\") + (toolChunk.args ?? \"\");\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: { ...(block.accumulated as ContentBlock) },\n };\n }\n }\n\n // Usage\n if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) {\n const chunkUsage = msg.usage_metadata;\n if (!lastUsage) {\n lastUsage = { ...chunkUsage };\n } else {\n lastUsage = {\n input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,\n output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,\n total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens,\n };\n }\n yield { type: \"usage\" as const, usage: { ...lastUsage } };\n }\n }\n\n // Finish all blocks\n for (const [index, block] of activeBlocks) {\n const finalized = finalizeContentBlock(block.accumulated);\n yield {\n type: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n }\n\n yield {\n type: \"message-finish\" as const,\n reason: \"stop\" as const,\n ...(lastUsage ? { usage: lastUsage } : {}),\n };\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n * @internal\n */\nfunction applyDeltaToBlock(\n block: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (block.type !== delta.type) {\n return { ...delta };\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...block,\n ...delta,\n text: ((block as { text?: string }).text ?? \"\") + delta.text,\n };\n case \"reasoning\":\n return {\n ...block,\n ...delta,\n reasoning:\n ((block as { reasoning?: string }).reasoning ?? \"\") + delta.reasoning,\n };\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n const merged = { ...block, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in block && block.id != null) {\n merged.id = block.id;\n }\n if (delta.name == null && \"name\" in block && block.name != null) {\n merged.name = block.name;\n }\n merged.args = `${(\"args\" in block ? block.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as ContentBlock;\n }\n default:\n return { ...block, ...delta };\n }\n}\n\n/**\n * Finalize a content block for the finish event.\n * For tool calls, parse the accumulated JSON args string.\n */\nexport function finalizeContentBlock(block: ContentBlock): ContentBlock {\n if (block.type === \"tool_call_chunk\") {\n const chunk = block as ContentBlock.Tools.ToolCallChunk;\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(chunk.args ?? \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: chunk.id,\n name: chunk.name,\n args: chunk.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: \"tool_call\" as const,\n id: chunk.id,\n name: chunk.name!,\n args: parsedArgs,\n } as ContentBlock.Tools.ToolCall;\n }\n\n return block;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"compat.js","names":[],"sources":["../../src/language_models/compat.ts"],"sourcesContent":["/**\n * Compatibility bridge: converts legacy `_streamResponseChunks`\n * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new\n * `ChatModelStreamEvent` protocol.\n *\n * @module\n */\n\nimport { isAIMessageChunk } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { ChatGenerationChunk } from \"../outputs.js\";\nimport type { ChatModelStreamEvent } from \"./event.js\";\n\n/**\n * Convert an async iterable of legacy `ChatGenerationChunk`s into\n * `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertChunksToEvents(\n chunks: AsyncIterable<ChatGenerationChunk>,\n options?: { signal?: AbortSignal }\n): AsyncGenerator<ChatModelStreamEvent> {\n const activeBlocks = new Map<\n number,\n { type: string; accumulated: ContentBlock }\n >();\n let messageStarted = false;\n let lastUsage:\n | { input_tokens: number; output_tokens: number; total_tokens: number }\n | undefined;\n\n for await (const chunk of chunks) {\n options?.signal?.throwIfAborted();\n\n const msg = chunk.message;\n\n // Message start\n let usageHandledInStart = false;\n if (!messageStarted) {\n messageStarted = true;\n const startEvent: ChatModelStreamEvent = {\n event: \"message-start\" as const,\n id: msg.id ?? undefined,\n };\n if (isAIMessageChunk(msg) && msg.usage_metadata) {\n (startEvent as { usage?: unknown }).usage = msg.usage_metadata;\n lastUsage = { ...msg.usage_metadata };\n usageHandledInStart = true;\n }\n yield startEvent;\n }\n\n // Process content\n const content = msg.content;\n if (typeof content === \"string\") {\n if (content !== \"\") {\n const blockIndex = 0;\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock.Text = { type: \"text\", text: \"\" };\n activeBlocks.set(blockIndex, {\n type: \"text\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = {\n ...block.accumulated,\n text: ((block.accumulated as { text?: string }).text ?? \"\") + content,\n };\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n content: { type: \"text\" as const, text: content },\n };\n }\n } else if (Array.isArray(content)) {\n for (const part of content) {\n const blockIndex =\n typeof part.index === \"number\" ? part.index : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n activeBlocks.set(blockIndex, {\n type: part.type,\n accumulated: { ...part },\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...part },\n };\n } else {\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = applyDeltaToBlock(block.accumulated, part);\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n content: part,\n };\n }\n }\n }\n\n // Tool call chunks\n if (\n isAIMessageChunk(msg) &&\n msg.tool_call_chunks &&\n msg.tool_call_chunks.length > 0\n ) {\n for (const toolChunk of msg.tool_call_chunks) {\n const blockIndex =\n typeof toolChunk.index === \"number\"\n ? toolChunk.index\n : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock = {\n type: \"tool_call_chunk\" as const,\n id: toolChunk.id,\n name: toolChunk.name,\n args: \"\",\n index: blockIndex,\n };\n activeBlocks.set(blockIndex, {\n type: \"tool_call_chunk\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n\n // Accumulate tool call args internally, emit incremental content chunks.\n const block = activeBlocks.get(blockIndex)!;\n const acc = block.accumulated as {\n args?: string;\n id?: string;\n name?: string;\n };\n if (toolChunk.id != null) acc.id = toolChunk.id;\n if (toolChunk.name != null) acc.name = toolChunk.name;\n acc.args = (acc.args ?? \"\") + (toolChunk.args ?? \"\");\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n content: { ...(block.accumulated as ContentBlock) },\n };\n }\n }\n\n // Usage\n if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) {\n const chunkUsage = msg.usage_metadata;\n if (!lastUsage) {\n lastUsage = { ...chunkUsage };\n } else {\n lastUsage = {\n input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,\n output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,\n total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens,\n };\n }\n yield { event: \"usage\" as const, usage: { ...lastUsage } };\n }\n }\n\n // Finish all blocks\n for (const [index, block] of activeBlocks) {\n const finalized = finalizeContentBlock(block.accumulated);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: \"stop\" as const,\n ...(lastUsage ? { usage: lastUsage } : {}),\n };\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n * @internal\n */\nfunction applyDeltaToBlock(\n block: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (block.type !== delta.type) {\n return { ...delta };\n }\n\n if (\n (delta as { type?: string }).type === \"thinking\" &&\n (block as { type?: string }).type === \"thinking\"\n ) {\n const thinking =\n ((block as { thinking?: string }).thinking ?? \"\") +\n ((delta as { thinking?: string }).thinking ?? \"\");\n return { ...block, ...delta, thinking } as unknown as ContentBlock;\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...block,\n ...delta,\n text: ((block as { text?: string }).text ?? \"\") + delta.text,\n };\n case \"reasoning\":\n return {\n ...block,\n ...delta,\n reasoning:\n ((block as { reasoning?: string }).reasoning ?? \"\") + delta.reasoning,\n };\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n const merged = { ...block, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in block && block.id != null) {\n merged.id = block.id;\n }\n if (delta.name == null && \"name\" in block && block.name != null) {\n merged.name = block.name;\n }\n merged.args = `${(\"args\" in block ? block.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as ContentBlock;\n }\n default:\n return { ...block, ...delta };\n }\n}\n\n/**\n * Finalize a content block for the finish event.\n * For tool calls, parse the accumulated JSON args string.\n */\nexport function finalizeContentBlock(block: ContentBlock): ContentBlock {\n if (block.type === \"tool_call_chunk\") {\n const chunk = block as ContentBlock.Tools.ToolCallChunk;\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(chunk.args ?? \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: chunk.id,\n name: chunk.name,\n args: chunk.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: \"tool_call\" as const,\n id: chunk.id,\n name: chunk.name!,\n args: parsedArgs,\n } as ContentBlock.Tools.ToolCall;\n }\n\n return block;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,gBAAuB,sBACrB,QACA,SACsC;CACtC,MAAM,+BAAe,IAAI,KAGtB;CACH,IAAI,iBAAiB;CACrB,IAAI;AAIJ,YAAW,MAAM,SAAS,QAAQ;AAChC,WAAS,QAAQ,gBAAgB;EAEjC,MAAM,MAAM,MAAM;EAGlB,IAAI,sBAAsB;AAC1B,MAAI,CAAC,gBAAgB;AACnB,oBAAiB;GACjB,MAAM,aAAmC;IACvC,OAAO;IACP,IAAI,IAAI,MAAM,KAAA;IACf;AACD,OAAI,iBAAiB,IAAI,IAAI,IAAI,gBAAgB;AAC9C,eAAmC,QAAQ,IAAI;AAChD,gBAAY,EAAE,GAAG,IAAI,gBAAgB;AACrC,0BAAsB;;AAExB,SAAM;;EAIR,MAAM,UAAU,IAAI;AACpB,MAAI,OAAO,YAAY;OACjB,YAAY,IAAI;IAClB,MAAM,aAAa;AACnB,QAAI,CAAC,aAAa,IAAI,WAAW,EAAE;KACjC,MAAM,UAA6B;MAAE,MAAM;MAAQ,MAAM;MAAI;AAC7D,kBAAa,IAAI,YAAY;MAC3B,MAAM;MACN,aAAa;MACd,CAAC;AACF,WAAM;MACJ,OAAO;MACP,OAAO;MACP,SAAS;MACV;;IAEH,MAAM,QAAQ,aAAa,IAAI,WAAW;AAC1C,UAAM,cAAc;KAClB,GAAG,MAAM;KACT,OAAQ,MAAM,YAAkC,QAAQ,MAAM;KAC/D;AACD,UAAM;KACJ,OAAO;KACP,OAAO;KACP,SAAS;MAAE,MAAM;MAAiB,MAAM;MAAS;KAClD;;aAEM,MAAM,QAAQ,QAAQ,CAC/B,MAAK,MAAM,QAAQ,SAAS;GAC1B,MAAM,aACJ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,aAAa;AAE7D,OAAI,CAAC,aAAa,IAAI,WAAW,EAAE;AACjC,iBAAa,IAAI,YAAY;KAC3B,MAAM,KAAK;KACX,aAAa,EAAE,GAAG,MAAM;KACzB,CAAC;AACF,UAAM;KACJ,OAAO;KACP,OAAO;KACP,SAAS,EAAE,GAAG,MAAM;KACrB;UACI;IACL,MAAM,QAAQ,aAAa,IAAI,WAAW;AAC1C,UAAM,cAAc,kBAAkB,MAAM,aAAa,KAAK;AAC9D,UAAM;KACJ,OAAO;KACP,OAAO;KACP,SAAS;KACV;;;AAMP,MACE,iBAAiB,IAAI,IACrB,IAAI,oBACJ,IAAI,iBAAiB,SAAS,EAE9B,MAAK,MAAM,aAAa,IAAI,kBAAkB;GAC5C,MAAM,aACJ,OAAO,UAAU,UAAU,WACvB,UAAU,QACV,aAAa;AAEnB,OAAI,CAAC,aAAa,IAAI,WAAW,EAAE;IACjC,MAAM,UAAwB;KAC5B,MAAM;KACN,IAAI,UAAU;KACd,MAAM,UAAU;KAChB,MAAM;KACN,OAAO;KACR;AACD,iBAAa,IAAI,YAAY;KAC3B,MAAM;KACN,aAAa;KACd,CAAC;AACF,UAAM;KACJ,OAAO;KACP,OAAO;KACP,SAAS;KACV;;GAIH,MAAM,QAAQ,aAAa,IAAI,WAAW;GAC1C,MAAM,MAAM,MAAM;AAKlB,OAAI,UAAU,MAAM,KAAM,KAAI,KAAK,UAAU;AAC7C,OAAI,UAAU,QAAQ,KAAM,KAAI,OAAO,UAAU;AACjD,OAAI,QAAQ,IAAI,QAAQ,OAAO,UAAU,QAAQ;AACjD,SAAM;IACJ,OAAO;IACP,OAAO;IACP,SAAS,EAAE,GAAI,MAAM,aAA8B;IACpD;;AAKL,MAAI,CAAC,uBAAuB,iBAAiB,IAAI,IAAI,IAAI,gBAAgB;GACvE,MAAM,aAAa,IAAI;AACvB,OAAI,CAAC,UACH,aAAY,EAAE,GAAG,YAAY;OAE7B,aAAY;IACV,cAAc,UAAU,eAAe,WAAW;IAClD,eAAe,UAAU,gBAAgB,WAAW;IACpD,cAAc,UAAU,eAAe,WAAW;IACnD;AAEH,SAAM;IAAE,OAAO;IAAkB,OAAO,EAAE,GAAG,WAAW;IAAE;;;AAK9D,MAAK,MAAM,CAAC,OAAO,UAAU,aAE3B,OAAM;EACJ,OAAO;EACP;EACA,SAJgB,qBAAqB,MAAM,YAAY;EAKxD;AAGH,OAAM;EACJ,OAAO;EACP,QAAQ;EACR,GAAI,YAAY,EAAE,OAAO,WAAW,GAAG,EAAE;EAC1C;;;;;;AAOH,SAAS,kBACP,OACA,OACc;AACd,KAAI,MAAM,SAAS,MAAM,KACvB,QAAO,EAAE,GAAG,OAAO;AAGrB,KACG,MAA4B,SAAS,cACrC,MAA4B,SAAS,YACtC;EACA,MAAM,YACF,MAAgC,YAAY,OAC5C,MAAgC,YAAY;AAChD,SAAO;GAAE,GAAG;GAAO,GAAG;GAAO;GAAU;;AAGzC,SAAQ,MAAM,MAAd;EACE,KAAK,OACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,OAAQ,MAA4B,QAAQ,MAAM,MAAM;GACzD;EACH,KAAK,YACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,YACI,MAAiC,aAAa,MAAM,MAAM;GAC/D;EACH,KAAK;EACL,KAAK,0BAA0B;GAC7B,MAAM,SAAS;IAAE,GAAG;IAAO,GAAG;IAAO;AACrC,OAAI,MAAM,MAAM,QAAQ,QAAQ,SAAS,MAAM,MAAM,KACnD,QAAO,KAAK,MAAM;AAEpB,OAAI,MAAM,QAAQ,QAAQ,UAAU,SAAS,MAAM,QAAQ,KACzD,QAAO,OAAO,MAAM;AAEtB,UAAO,OAAO,IAAI,UAAU,QAAQ,MAAM,OAAO,OAAO,KAAK,MAAM,QAAQ;AAC3E,UAAO;;EAET,QACE,QAAO;GAAE,GAAG;GAAO,GAAG;GAAO;;;;;;;AAQnC,SAAgB,qBAAqB,OAAmC;AACtE,KAAI,MAAM,SAAS,mBAAmB;EACpC,MAAM,QAAQ;EACd,IAAI;AACJ,MAAI;AACF,gBAAa,KAAK,MAAM,MAAM,QAAQ,KAAK;UACrC;AACN,UAAO;IACL,MAAM;IACN,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,OAAO;IACR;;AAEH,SAAO;GACL,MAAM;GACN,IAAI,MAAM;GACV,MAAM,MAAM;GACZ,MAAM;GACP;;AAGH,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"event.cjs","names":[],"sources":["../../src/language_models/event.ts"],"sourcesContent":["/**\n * Chat model streaming event protocol.\n *\n * Defines a content-block-centric event model for streaming chat model responses.\n * Events carry LangChain {@link ContentBlock} types on lifecycle boundaries\n * and as incremental content updates during streaming.\n *\n * ## Design Principles\n *\n * 1. **Content-block deltas use the content block shape.** Text, reasoning,\n * and tool-call chunks are emitted as partial {@link ContentBlock} values\n * with explicit append semantics.\n *\n * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish\n * events. Consumers never need to infer boundaries from absence of events.\n *\n * 3. **Interleaving allowed.** Content blocks may interleave (e.g., parallel tool calls).\n * The only invariant: a block's start precedes its deltas, and its deltas precede\n * its finish. No ordering constraint between different blocks.\n *\n * 4. **Provider passthrough.** Native provider events that don't map to standard types\n * are forwarded as {@link ProviderEvent} rather than silently dropped.\n *\n * ## Lifecycle Contract\n *\n * ```\n * MessageStart\n * -> ContentBlockStart(index=0, content=...)\n * -> ContentBlockDelta(index=0, content={ type: \"text\", text: \"Hello\" })\n * -> ContentBlockDelta(index=0, content={ type: \"text\", text: \" world\" })\n * -> ContentBlockFinish(index=0, content=...)\n * -> UsageUpdate(...)\n * -> MessageFinish(reason, usage?)\n * ```\n *\n * @module\n */\n\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { UsageMetadata } from \"../messages/metadata.js\";\n\n// ─── Message Lifecycle ──────────────────────────────────────────\n\n/**\n * Emitted once at the start of a model response.\n */\nexport interface MessageStartEvent {\n type: \"message-start\";\n /** Optional message ID assigned by the provider. */\n id?: string;\n /**\n * Initial usage snapshot, if the provider reports input token counts\n * before content begins streaming (e.g., Anthropic's `message_start`).\n */\n usage?: UsageMetadata;\n}\n\n/**\n * Finish reason for a model response.\n *\n * - `\"stop\"`: Natural end of generation.\n * - `\"length\"`: Hit max token limit.\n * - `\"tool_use\"`: Model is requesting tool execution.\n * - `\"content_filter\"`: Content was filtered by safety systems.\n */\nexport type FinishReason = \"stop\" | \"length\" | \"tool_use\" | \"content_filter\";\n\n/**\n * Emitted once when the model response is complete.\n */\nexport interface MessageFinishEvent {\n type: \"message-finish\";\n /** Why the model stopped generating. */\n reason?: FinishReason;\n /** Final usage snapshot. */\n usage?: UsageMetadata;\n /** Provider-specific response metadata (model name, response ID, headers, etc.). */\n responseMetadata?: Record<string, unknown>;\n}\n\n// ─── Content Block Lifecycle ────────────────────────────────────\n\n/**\n * Emitted when a new content block begins streaming.\n *\n * @example\n * ```ts\n * { type: \"content-block-start\", index: 0,\n * content: { type: \"text\", text: \"\" } }\n * ```\n */\nexport interface ContentBlockStartEvent {\n type: \"content-block-start\";\n /** Positional index of this block within the message. */\n index: number;\n /** Initial state of the content block. */\n content: ContentBlock;\n}\n\n/**\n * Emitted for each incremental update within a content block.\n *\n * The `content` field carries the incremental content block update.\n * Accumulation rules:\n * - `text` → append `text` to the block's text field\n * - `reasoning` → append `reasoning` to the block's reasoning field\n * - `tool_call_chunk` / `server_tool_call_chunk` → append `args`,\n * preserving stable `id`/`name` when later chunks omit them\n * - all other fields are shallow-merged\n *\n * @example\n * ```ts\n * // Text token\n * { type: \"content-block-delta\", index: 0,\n * content: { type: \"text\", text: \" world\" } }\n *\n * // Tool call args chunk\n * { type: \"content-block-delta\", index: 1,\n * content: { type: \"tool_call_chunk\", args: '{\"q\":\"wea' } }\n *\n * // Provider-specific field (e.g., signature)\n * { type: \"content-block-delta\", index: 0,\n * content: { type: \"reasoning\", signature: \"sig_abc\" } }\n * ```\n */\nexport interface ContentBlockDeltaEvent {\n type: \"content-block-delta\";\n /** Positional index of the block being updated. */\n index: number;\n /** Incremental content block update. */\n content: ContentBlock;\n}\n\n/**\n * Emitted when a content block is complete.\n *\n * @example\n * ```ts\n * { type: \"content-block-finish\", index: 0,\n * content: { type: \"text\", text: \"Hello world\" } }\n * ```\n */\nexport interface ContentBlockFinishEvent {\n type: \"content-block-finish\";\n /** Positional index of the completed block. */\n index: number;\n /** Finalized content block. */\n content: ContentBlock;\n}\n\n// ─── Usage ──────────────────────────────────────────────────────\n\n/**\n * Emitted whenever the provider reports updated usage information.\n * Each event carries a **running snapshot** (not an additive delta).\n */\nexport interface UsageUpdateEvent {\n type: \"usage\";\n /** Current usage snapshot. */\n usage: UsageMetadata;\n}\n\n// ─── Provider Passthrough ───────────────────────────────────────\n\n/**\n * Passthrough for native provider events that don't map to standard types.\n */\nexport interface ProviderEvent {\n type: \"provider\";\n /** Provider identifier (e.g., `\"openai\"`, `\"anthropic\"`, `\"google\"`). */\n provider: string;\n /** Raw event type name from the provider SDK. */\n name: string;\n /** Raw event payload from the provider SDK. */\n payload: unknown;\n}\n\n// ─── Error ──────────────────────────────────────────────────────\n\n/**\n * Emitted on unrecoverable stream errors.\n */\nexport interface StreamErrorEvent {\n type: \"error\";\n /** Human-readable error message. */\n message: string;\n /** Optional error code for programmatic handling. */\n code?: string;\n}\n\n// ─── Union ──────────────────────────────────────────────────────\n\n/**\n * Union of all chat model stream event types.\n */\nexport type ChatModelStreamEvent =\n | MessageStartEvent\n | MessageFinishEvent\n | ContentBlockStartEvent\n | ContentBlockDeltaEvent\n | ContentBlockFinishEvent\n | UsageUpdateEvent\n | ProviderEvent\n | StreamErrorEvent;\n"],"mappings":""}
1
+ {"version":3,"file":"event.cjs","names":[],"sources":["../../src/language_models/event.ts"],"sourcesContent":["/**\n * Chat model streaming event protocol.\n *\n * Defines a content-block-centric event model for streaming chat model responses.\n * Events carry LangChain {@link ContentBlock} types on lifecycle boundaries\n * and as incremental content updates during streaming.\n *\n * ## Design Principles\n *\n * 1. **Content-block deltas use the content block shape.** Text, reasoning,\n * and tool-call chunks are emitted as partial {@link ContentBlock} values\n * with explicit append semantics.\n *\n * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish\n * events. Consumers never need to infer boundaries from absence of events.\n *\n * 3. **Interleaving allowed.** Content blocks may interleave (e.g., parallel tool calls).\n * The only invariant: a block's start precedes its deltas, and its deltas precede\n * its finish. No ordering constraint between different blocks.\n *\n * 4. **Provider passthrough.** Native provider events that don't map to standard types\n * are forwarded as {@link ProviderEvent} rather than silently dropped.\n *\n * ## Lifecycle Contract\n *\n * ```\n * MessageStart\n * -> ContentBlockStart(index=0, content=...)\n * -> ContentBlockDelta(index=0, content={ type: \"text\", text: \"Hello\" })\n * -> ContentBlockDelta(index=0, content={ type: \"text\", text: \" world\" })\n * -> ContentBlockFinish(index=0, content=...)\n * -> UsageUpdate(...)\n * -> MessageFinish(reason, usage?)\n * ```\n *\n * @module\n */\n\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { UsageMetadata } from \"../messages/metadata.js\";\n\n// ─── Message Lifecycle ──────────────────────────────────────────\n\n/**\n * Emitted once at the start of a model response.\n */\nexport interface MessageStartEvent {\n event: \"message-start\";\n /** Optional message ID assigned by the provider. */\n id?: string;\n /**\n * Initial usage snapshot, if the provider reports input token counts\n * before content begins streaming (e.g., Anthropic's `message_start`).\n */\n usage?: UsageMetadata;\n}\n\n/**\n * Finish reason for a model response.\n *\n * - `\"stop\"`: Natural end of generation.\n * - `\"length\"`: Hit max token limit.\n * - `\"tool_use\"`: Model is requesting tool execution.\n * - `\"content_filter\"`: Content was filtered by safety systems.\n */\nexport type FinishReason = \"stop\" | \"length\" | \"tool_use\" | \"content_filter\";\n\n/**\n * Emitted once when the model response is complete.\n */\nexport interface MessageFinishEvent {\n event: \"message-finish\";\n /** Why the model stopped generating. */\n reason?: FinishReason;\n /** Final usage snapshot. */\n usage?: UsageMetadata;\n /** Provider-specific response metadata (model name, response ID, headers, etc.). */\n metadata?: Record<string, unknown>;\n}\n\n// ─── Content Block Lifecycle ────────────────────────────────────\n\n/**\n * Emitted when a new content block begins streaming.\n *\n * @example\n * ```ts\n * { event: \"content-block-start\", index: 0,\n * content: { type: \"text\", text: \"\" } }\n * ```\n */\nexport interface ContentBlockStartEvent {\n event: \"content-block-start\";\n /** Positional index of this block within the message. */\n index: number;\n /** Initial state of the content block. */\n content: ContentBlock;\n}\n\n/**\n * Emitted for each incremental update within a content block.\n *\n * The `content` field carries the incremental content block update.\n * Accumulation rules:\n * - `text` → append `text` to the block's text field\n * - `reasoning` → append `reasoning` to the block's reasoning field\n * - `tool_call_chunk` / `server_tool_call_chunk` → append `args`,\n * preserving stable `id`/`name` when later chunks omit them\n * - all other fields are shallow-merged\n *\n * @example\n * ```ts\n * // Text token\n * { event: \"content-block-delta\", index: 0,\n * content: { type: \"text\", text: \" world\" } }\n *\n * // Tool call args chunk\n * { event: \"content-block-delta\", index: 1,\n * content: { type: \"tool_call_chunk\", args: '{\"q\":\"wea' } }\n *\n * // Provider-specific field (e.g., signature)\n * { event: \"content-block-delta\", index: 0,\n * content: { type: \"reasoning\", signature: \"sig_abc\" } }\n * ```\n */\nexport interface ContentBlockDeltaEvent {\n event: \"content-block-delta\";\n /** Positional index of the block being updated. */\n index: number;\n /** Incremental content block update. */\n content: ContentBlock;\n}\n\n/**\n * Emitted when a content block is complete.\n *\n * @example\n * ```ts\n * { event: \"content-block-finish\", index: 0,\n * content: { type: \"text\", text: \"Hello world\" } }\n * ```\n */\nexport interface ContentBlockFinishEvent {\n event: \"content-block-finish\";\n /** Positional index of the completed block. */\n index: number;\n /** Finalized content block. */\n content: ContentBlock;\n}\n\n// ─── Usage ──────────────────────────────────────────────────────\n\n/**\n * Emitted whenever the provider reports updated usage information.\n * Each event carries a **running snapshot** (not an additive delta).\n */\nexport interface UsageUpdateEvent {\n event: \"usage\";\n /** Current usage snapshot. */\n usage: UsageMetadata;\n}\n\n// ─── Provider Passthrough ───────────────────────────────────────\n\n/**\n * Passthrough for native provider events that don't map to standard types.\n */\nexport interface ProviderEvent {\n event: \"provider\";\n /** Provider identifier (e.g., `\"openai\"`, `\"anthropic\"`, `\"google\"`). */\n provider: string;\n /** Raw event type name from the provider SDK. */\n name: string;\n /** Raw event payload from the provider SDK. */\n payload: unknown;\n}\n\n// ─── Error ──────────────────────────────────────────────────────\n\n/**\n * Emitted on unrecoverable stream errors.\n */\nexport interface StreamErrorEvent {\n event: \"error\";\n /** Human-readable error message. */\n message: string;\n /** Optional error code for programmatic handling. */\n code?: string;\n}\n\n// ─── Union ──────────────────────────────────────────────────────\n\n/**\n * Union of all chat model stream event types.\n */\nexport type ChatModelStreamEvent =\n | MessageStartEvent\n | MessageFinishEvent\n | ContentBlockStartEvent\n | ContentBlockDeltaEvent\n | ContentBlockFinishEvent\n | UsageUpdateEvent\n | ProviderEvent\n | StreamErrorEvent;\n"],"mappings":""}
@@ -6,7 +6,7 @@ import { UsageMetadata } from "../messages/metadata.cjs";
6
6
  * Emitted once at the start of a model response.
7
7
  */
8
8
  interface MessageStartEvent {
9
- type: "message-start";
9
+ event: "message-start";
10
10
  /** Optional message ID assigned by the provider. */
11
11
  id?: string;
12
12
  /**
@@ -28,25 +28,25 @@ type FinishReason = "stop" | "length" | "tool_use" | "content_filter";
28
28
  * Emitted once when the model response is complete.
29
29
  */
30
30
  interface MessageFinishEvent {
31
- type: "message-finish";
31
+ event: "message-finish";
32
32
  /** Why the model stopped generating. */
33
33
  reason?: FinishReason;
34
34
  /** Final usage snapshot. */
35
35
  usage?: UsageMetadata;
36
36
  /** Provider-specific response metadata (model name, response ID, headers, etc.). */
37
- responseMetadata?: Record<string, unknown>;
37
+ metadata?: Record<string, unknown>;
38
38
  }
39
39
  /**
40
40
  * Emitted when a new content block begins streaming.
41
41
  *
42
42
  * @example
43
43
  * ```ts
44
- * { type: "content-block-start", index: 0,
44
+ * { event: "content-block-start", index: 0,
45
45
  * content: { type: "text", text: "" } }
46
46
  * ```
47
47
  */
48
48
  interface ContentBlockStartEvent {
49
- type: "content-block-start";
49
+ event: "content-block-start";
50
50
  /** Positional index of this block within the message. */
51
51
  index: number;
52
52
  /** Initial state of the content block. */
@@ -66,20 +66,20 @@ interface ContentBlockStartEvent {
66
66
  * @example
67
67
  * ```ts
68
68
  * // Text token
69
- * { type: "content-block-delta", index: 0,
69
+ * { event: "content-block-delta", index: 0,
70
70
  * content: { type: "text", text: " world" } }
71
71
  *
72
72
  * // Tool call args chunk
73
- * { type: "content-block-delta", index: 1,
73
+ * { event: "content-block-delta", index: 1,
74
74
  * content: { type: "tool_call_chunk", args: '{"q":"wea' } }
75
75
  *
76
76
  * // Provider-specific field (e.g., signature)
77
- * { type: "content-block-delta", index: 0,
77
+ * { event: "content-block-delta", index: 0,
78
78
  * content: { type: "reasoning", signature: "sig_abc" } }
79
79
  * ```
80
80
  */
81
81
  interface ContentBlockDeltaEvent {
82
- type: "content-block-delta";
82
+ event: "content-block-delta";
83
83
  /** Positional index of the block being updated. */
84
84
  index: number;
85
85
  /** Incremental content block update. */
@@ -90,12 +90,12 @@ interface ContentBlockDeltaEvent {
90
90
  *
91
91
  * @example
92
92
  * ```ts
93
- * { type: "content-block-finish", index: 0,
93
+ * { event: "content-block-finish", index: 0,
94
94
  * content: { type: "text", text: "Hello world" } }
95
95
  * ```
96
96
  */
97
97
  interface ContentBlockFinishEvent {
98
- type: "content-block-finish";
98
+ event: "content-block-finish";
99
99
  /** Positional index of the completed block. */
100
100
  index: number;
101
101
  /** Finalized content block. */
@@ -106,7 +106,7 @@ interface ContentBlockFinishEvent {
106
106
  * Each event carries a **running snapshot** (not an additive delta).
107
107
  */
108
108
  interface UsageUpdateEvent {
109
- type: "usage";
109
+ event: "usage";
110
110
  /** Current usage snapshot. */
111
111
  usage: UsageMetadata;
112
112
  }
@@ -114,7 +114,7 @@ interface UsageUpdateEvent {
114
114
  * Passthrough for native provider events that don't map to standard types.
115
115
  */
116
116
  interface ProviderEvent {
117
- type: "provider";
117
+ event: "provider";
118
118
  /** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */
119
119
  provider: string;
120
120
  /** Raw event type name from the provider SDK. */
@@ -126,7 +126,7 @@ interface ProviderEvent {
126
126
  * Emitted on unrecoverable stream errors.
127
127
  */
128
128
  interface StreamErrorEvent {
129
- type: "error";
129
+ event: "error";
130
130
  /** Human-readable error message. */
131
131
  message: string;
132
132
  /** Optional error code for programmatic handling. */
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.cts","names":[],"sources":["../../src/language_models/event.ts"],"mappings":";;;;;;;UA8CiB,iBAAA;EACf,IAAA;EAiDqB;EA/CrB,EAAA;EA4Ee;;;;EAvEf,KAAA,GAAQ,aAAA;AAAA;;;;;AAwFV;;;;KA7EY,YAAA;;;;UAKK,kBAAA;EACf,IAAA;EAqFe;EAnFf,MAAA,GAAS,YAAA;;EAET,KAAA,GAAQ,aAAA;EAkFR;EAhFA,gBAAA,GAAmB,MAAA;AAAA;;;AA0FrB;;;;;;;UA5EiB,sBAAA;EACf,IAAA;EAkFO;EAhFP,KAAA;EAwF+B;EAtF/B,OAAA,EAAS,YAAA;AAAA;;;;;;AAmGX;;;;;;;;;;;;;;;;;;;;;UAtEiB,sBAAA;EACf,IAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;;;;;;UAYM,uBAAA;EACf,IAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;UASM,gBAAA;EACf,IAAA;;EAEA,KAAA,EAAO,aAAA;AAAA;;;;UAQQ,aAAA;EACf,IAAA;;EAEA,QAAA;;EAEA,IAAA;;EAEA,OAAA;AAAA;;;;UAQe,gBAAA;EACf,IAAA;;EAEA,OAAA;;EAEA,IAAA;AAAA;;;;KAQU,oBAAA,GACR,iBAAA,GACA,kBAAA,GACA,sBAAA,GACA,sBAAA,GACA,uBAAA,GACA,gBAAA,GACA,aAAA,GACA,gBAAA"}
1
+ {"version":3,"file":"event.d.cts","names":[],"sources":["../../src/language_models/event.ts"],"mappings":";;;;;;;UA8CiB,iBAAA;EACf,KAAA;EAiDqB;EA/CrB,EAAA;EA4Ee;;;;EAvEf,KAAA,GAAQ,aAAA;AAAA;;;;;AAwFV;;;;KA7EY,YAAA;;;;UAKK,kBAAA;EACf,KAAA;EAqFe;EAnFf,MAAA,GAAS,YAAA;;EAET,KAAA,GAAQ,aAAA;EAkFR;EAhFA,QAAA,GAAW,MAAA;AAAA;;;AA0Fb;;;;;;;UA5EiB,sBAAA;EACf,KAAA;EAkFO;EAhFP,KAAA;EAwF+B;EAtF/B,OAAA,EAAS,YAAA;AAAA;;;;;;AAmGX;;;;;;;;;;;;;;;;;;;;;UAtEiB,sBAAA;EACf,KAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;;;;;;UAYM,uBAAA;EACf,KAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;UASM,gBAAA;EACf,KAAA;;EAEA,KAAA,EAAO,aAAA;AAAA;;;;UAQQ,aAAA;EACf,KAAA;;EAEA,QAAA;;EAEA,IAAA;;EAEA,OAAA;AAAA;;;;UAQe,gBAAA;EACf,KAAA;;EAEA,OAAA;;EAEA,IAAA;AAAA;;;;KAQU,oBAAA,GACR,iBAAA,GACA,kBAAA,GACA,sBAAA,GACA,sBAAA,GACA,uBAAA,GACA,gBAAA,GACA,aAAA,GACA,gBAAA"}
@@ -6,7 +6,7 @@ import { UsageMetadata } from "../messages/metadata.js";
6
6
  * Emitted once at the start of a model response.
7
7
  */
8
8
  interface MessageStartEvent {
9
- type: "message-start";
9
+ event: "message-start";
10
10
  /** Optional message ID assigned by the provider. */
11
11
  id?: string;
12
12
  /**
@@ -28,25 +28,25 @@ type FinishReason = "stop" | "length" | "tool_use" | "content_filter";
28
28
  * Emitted once when the model response is complete.
29
29
  */
30
30
  interface MessageFinishEvent {
31
- type: "message-finish";
31
+ event: "message-finish";
32
32
  /** Why the model stopped generating. */
33
33
  reason?: FinishReason;
34
34
  /** Final usage snapshot. */
35
35
  usage?: UsageMetadata;
36
36
  /** Provider-specific response metadata (model name, response ID, headers, etc.). */
37
- responseMetadata?: Record<string, unknown>;
37
+ metadata?: Record<string, unknown>;
38
38
  }
39
39
  /**
40
40
  * Emitted when a new content block begins streaming.
41
41
  *
42
42
  * @example
43
43
  * ```ts
44
- * { type: "content-block-start", index: 0,
44
+ * { event: "content-block-start", index: 0,
45
45
  * content: { type: "text", text: "" } }
46
46
  * ```
47
47
  */
48
48
  interface ContentBlockStartEvent {
49
- type: "content-block-start";
49
+ event: "content-block-start";
50
50
  /** Positional index of this block within the message. */
51
51
  index: number;
52
52
  /** Initial state of the content block. */
@@ -66,20 +66,20 @@ interface ContentBlockStartEvent {
66
66
  * @example
67
67
  * ```ts
68
68
  * // Text token
69
- * { type: "content-block-delta", index: 0,
69
+ * { event: "content-block-delta", index: 0,
70
70
  * content: { type: "text", text: " world" } }
71
71
  *
72
72
  * // Tool call args chunk
73
- * { type: "content-block-delta", index: 1,
73
+ * { event: "content-block-delta", index: 1,
74
74
  * content: { type: "tool_call_chunk", args: '{"q":"wea' } }
75
75
  *
76
76
  * // Provider-specific field (e.g., signature)
77
- * { type: "content-block-delta", index: 0,
77
+ * { event: "content-block-delta", index: 0,
78
78
  * content: { type: "reasoning", signature: "sig_abc" } }
79
79
  * ```
80
80
  */
81
81
  interface ContentBlockDeltaEvent {
82
- type: "content-block-delta";
82
+ event: "content-block-delta";
83
83
  /** Positional index of the block being updated. */
84
84
  index: number;
85
85
  /** Incremental content block update. */
@@ -90,12 +90,12 @@ interface ContentBlockDeltaEvent {
90
90
  *
91
91
  * @example
92
92
  * ```ts
93
- * { type: "content-block-finish", index: 0,
93
+ * { event: "content-block-finish", index: 0,
94
94
  * content: { type: "text", text: "Hello world" } }
95
95
  * ```
96
96
  */
97
97
  interface ContentBlockFinishEvent {
98
- type: "content-block-finish";
98
+ event: "content-block-finish";
99
99
  /** Positional index of the completed block. */
100
100
  index: number;
101
101
  /** Finalized content block. */
@@ -106,7 +106,7 @@ interface ContentBlockFinishEvent {
106
106
  * Each event carries a **running snapshot** (not an additive delta).
107
107
  */
108
108
  interface UsageUpdateEvent {
109
- type: "usage";
109
+ event: "usage";
110
110
  /** Current usage snapshot. */
111
111
  usage: UsageMetadata;
112
112
  }
@@ -114,7 +114,7 @@ interface UsageUpdateEvent {
114
114
  * Passthrough for native provider events that don't map to standard types.
115
115
  */
116
116
  interface ProviderEvent {
117
- type: "provider";
117
+ event: "provider";
118
118
  /** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */
119
119
  provider: string;
120
120
  /** Raw event type name from the provider SDK. */
@@ -126,7 +126,7 @@ interface ProviderEvent {
126
126
  * Emitted on unrecoverable stream errors.
127
127
  */
128
128
  interface StreamErrorEvent {
129
- type: "error";
129
+ event: "error";
130
130
  /** Human-readable error message. */
131
131
  message: string;
132
132
  /** Optional error code for programmatic handling. */
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","names":[],"sources":["../../src/language_models/event.ts"],"mappings":";;;;;;;UA8CiB,iBAAA;EACf,IAAA;EAiDqB;EA/CrB,EAAA;EA4Ee;;;;EAvEf,KAAA,GAAQ,aAAA;AAAA;;;;;AAwFV;;;;KA7EY,YAAA;;;;UAKK,kBAAA;EACf,IAAA;EAqFe;EAnFf,MAAA,GAAS,YAAA;;EAET,KAAA,GAAQ,aAAA;EAkFR;EAhFA,gBAAA,GAAmB,MAAA;AAAA;;;AA0FrB;;;;;;;UA5EiB,sBAAA;EACf,IAAA;EAkFO;EAhFP,KAAA;EAwF+B;EAtF/B,OAAA,EAAS,YAAA;AAAA;;;;;;AAmGX;;;;;;;;;;;;;;;;;;;;;UAtEiB,sBAAA;EACf,IAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;;;;;;UAYM,uBAAA;EACf,IAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;UASM,gBAAA;EACf,IAAA;;EAEA,KAAA,EAAO,aAAA;AAAA;;;;UAQQ,aAAA;EACf,IAAA;;EAEA,QAAA;;EAEA,IAAA;;EAEA,OAAA;AAAA;;;;UAQe,gBAAA;EACf,IAAA;;EAEA,OAAA;;EAEA,IAAA;AAAA;;;;KAQU,oBAAA,GACR,iBAAA,GACA,kBAAA,GACA,sBAAA,GACA,sBAAA,GACA,uBAAA,GACA,gBAAA,GACA,aAAA,GACA,gBAAA"}
1
+ {"version":3,"file":"event.d.ts","names":[],"sources":["../../src/language_models/event.ts"],"mappings":";;;;;;;UA8CiB,iBAAA;EACf,KAAA;EAiDqB;EA/CrB,EAAA;EA4Ee;;;;EAvEf,KAAA,GAAQ,aAAA;AAAA;;;;;AAwFV;;;;KA7EY,YAAA;;;;UAKK,kBAAA;EACf,KAAA;EAqFe;EAnFf,MAAA,GAAS,YAAA;;EAET,KAAA,GAAQ,aAAA;EAkFR;EAhFA,QAAA,GAAW,MAAA;AAAA;;;AA0Fb;;;;;;;UA5EiB,sBAAA;EACf,KAAA;EAkFO;EAhFP,KAAA;EAwF+B;EAtF/B,OAAA,EAAS,YAAA;AAAA;;;;;;AAmGX;;;;;;;;;;;;;;;;;;;;;UAtEiB,sBAAA;EACf,KAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;;;;;;UAYM,uBAAA;EACf,KAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;UASM,gBAAA;EACf,KAAA;;EAEA,KAAA,EAAO,aAAA;AAAA;;;;UAQQ,aAAA;EACf,KAAA;;EAEA,QAAA;;EAEA,IAAA;;EAEA,OAAA;AAAA;;;;UAQe,gBAAA;EACf,KAAA;;EAEA,OAAA;;EAEA,IAAA;AAAA;;;;KAQU,oBAAA,GACR,iBAAA,GACA,kBAAA,GACA,sBAAA,GACA,sBAAA,GACA,uBAAA,GACA,gBAAA,GACA,aAAA,GACA,gBAAA"}