@langchain/core 1.1.42 → 1.1.43-dev-1777615538778

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.
Files changed (354) hide show
  1. package/README.md +1 -1
  2. package/dist/callbacks/base.cjs +5 -0
  3. package/dist/callbacks/base.cjs.map +1 -1
  4. package/dist/callbacks/base.d.cts +20 -1
  5. package/dist/callbacks/base.d.cts.map +1 -1
  6. package/dist/callbacks/base.d.ts +20 -1
  7. package/dist/callbacks/base.d.ts.map +1 -1
  8. package/dist/callbacks/base.js +5 -1
  9. package/dist/callbacks/base.js.map +1 -1
  10. package/dist/callbacks/manager.cjs +10 -0
  11. package/dist/callbacks/manager.cjs.map +1 -1
  12. package/dist/callbacks/manager.d.cts +2 -0
  13. package/dist/callbacks/manager.d.cts.map +1 -1
  14. package/dist/callbacks/manager.d.ts +2 -0
  15. package/dist/callbacks/manager.d.ts.map +1 -1
  16. package/dist/callbacks/manager.js +10 -0
  17. package/dist/callbacks/manager.js.map +1 -1
  18. package/dist/language_models/base.cjs +1 -1
  19. package/dist/language_models/base.cjs.map +1 -1
  20. package/dist/language_models/base.js +1 -1
  21. package/dist/language_models/base.js.map +1 -1
  22. package/dist/language_models/chat_models.cjs +103 -1
  23. package/dist/language_models/chat_models.cjs.map +1 -1
  24. package/dist/language_models/chat_models.d.cts +55 -0
  25. package/dist/language_models/chat_models.d.cts.map +1 -1
  26. package/dist/language_models/chat_models.d.ts +55 -0
  27. package/dist/language_models/chat_models.d.ts.map +1 -1
  28. package/dist/language_models/chat_models.js +104 -2
  29. package/dist/language_models/chat_models.js.map +1 -1
  30. package/dist/language_models/compat.cjs +399 -0
  31. package/dist/language_models/compat.cjs.map +1 -0
  32. package/dist/language_models/compat.d.cts +20 -0
  33. package/dist/language_models/compat.d.cts.map +1 -0
  34. package/dist/language_models/compat.d.ts +20 -0
  35. package/dist/language_models/compat.d.ts.map +1 -0
  36. package/dist/language_models/compat.js +391 -0
  37. package/dist/language_models/compat.js.map +1 -0
  38. package/dist/language_models/event.cjs +12 -0
  39. package/dist/language_models/event.cjs.map +1 -0
  40. package/dist/language_models/event.d.cts +185 -0
  41. package/dist/language_models/event.d.cts.map +1 -0
  42. package/dist/language_models/event.d.ts +185 -0
  43. package/dist/language_models/event.d.ts.map +1 -0
  44. package/dist/language_models/event.js +7 -0
  45. package/dist/language_models/event.js.map +1 -0
  46. package/dist/language_models/stream.cjs +488 -0
  47. package/dist/language_models/stream.cjs.map +1 -0
  48. package/dist/language_models/stream.d.cts +106 -0
  49. package/dist/language_models/stream.d.cts.map +1 -0
  50. package/dist/language_models/stream.d.ts +106 -0
  51. package/dist/language_models/stream.d.ts.map +1 -0
  52. package/dist/language_models/stream.js +477 -0
  53. package/dist/language_models/stream.js.map +1 -0
  54. package/dist/load/import_map.cjs +6 -0
  55. package/dist/load/import_map.cjs.map +1 -1
  56. package/dist/load/import_map.js +8 -2
  57. package/dist/load/import_map.js.map +1 -1
  58. package/dist/load/map_keys.cjs +2 -2
  59. package/dist/messages/ai.cjs +11 -8
  60. package/dist/messages/ai.cjs.map +1 -1
  61. package/dist/messages/ai.d.cts.map +1 -1
  62. package/dist/messages/ai.d.ts.map +1 -1
  63. package/dist/messages/ai.js +11 -8
  64. package/dist/messages/ai.js.map +1 -1
  65. package/dist/messages/content/index.cjs.map +1 -1
  66. package/dist/messages/content/index.d.cts +5 -1
  67. package/dist/messages/content/index.d.cts.map +1 -1
  68. package/dist/messages/content/index.d.ts +5 -1
  69. package/dist/messages/content/index.d.ts.map +1 -1
  70. package/dist/messages/content/index.js.map +1 -1
  71. package/dist/messages/index.d.cts +2 -2
  72. package/dist/messages/index.d.ts +2 -2
  73. package/dist/output_parsers/openai_functions/json_output_functions_parsers.d.cts +1 -1
  74. package/dist/output_parsers/openai_functions/json_output_functions_parsers.d.ts +1 -1
  75. package/dist/prompts/template.cjs +1 -1
  76. package/dist/singletons/callbacks.cjs +1 -1
  77. package/dist/tracers/console.cjs +1 -1
  78. package/dist/types/type-utils.d.cts +2 -1
  79. package/dist/types/type-utils.d.cts.map +1 -1
  80. package/dist/types/type-utils.d.ts +2 -1
  81. package/dist/types/type-utils.d.ts.map +1 -1
  82. package/dist/utils/async_caller.cjs +3 -2
  83. package/dist/utils/async_caller.cjs.map +1 -1
  84. package/dist/utils/async_caller.js +2 -1
  85. package/dist/utils/async_caller.js.map +1 -1
  86. package/dist/utils/event_source_parse.cjs +5 -12
  87. package/dist/utils/event_source_parse.cjs.map +1 -1
  88. package/dist/utils/event_source_parse.js +5 -12
  89. package/dist/utils/event_source_parse.js.map +1 -1
  90. package/dist/utils/uuid/max.d.cts +1 -1
  91. package/dist/utils/uuid/max.d.ts +1 -1
  92. package/dist/utils/uuid/nil.d.cts +1 -1
  93. package/dist/utils/uuid/nil.d.ts +1 -1
  94. package/package.json +34 -1
  95. package/agents.cjs +0 -1
  96. package/agents.d.cts +0 -1
  97. package/agents.d.ts +0 -1
  98. package/agents.js +0 -1
  99. package/caches.cjs +0 -1
  100. package/caches.d.cts +0 -1
  101. package/caches.d.ts +0 -1
  102. package/caches.js +0 -1
  103. package/callbacks/base.cjs +0 -1
  104. package/callbacks/base.d.cts +0 -1
  105. package/callbacks/base.d.ts +0 -1
  106. package/callbacks/base.js +0 -1
  107. package/callbacks/dispatch/web.cjs +0 -1
  108. package/callbacks/dispatch/web.d.cts +0 -1
  109. package/callbacks/dispatch/web.d.ts +0 -1
  110. package/callbacks/dispatch/web.js +0 -1
  111. package/callbacks/dispatch.cjs +0 -1
  112. package/callbacks/dispatch.d.cts +0 -1
  113. package/callbacks/dispatch.d.ts +0 -1
  114. package/callbacks/dispatch.js +0 -1
  115. package/callbacks/manager.cjs +0 -1
  116. package/callbacks/manager.d.cts +0 -1
  117. package/callbacks/manager.d.ts +0 -1
  118. package/callbacks/manager.js +0 -1
  119. package/callbacks/promises.cjs +0 -1
  120. package/callbacks/promises.d.cts +0 -1
  121. package/callbacks/promises.d.ts +0 -1
  122. package/callbacks/promises.js +0 -1
  123. package/chat_history.cjs +0 -1
  124. package/chat_history.d.cts +0 -1
  125. package/chat_history.d.ts +0 -1
  126. package/chat_history.js +0 -1
  127. package/context.cjs +0 -1
  128. package/context.d.cts +0 -1
  129. package/context.d.ts +0 -1
  130. package/context.js +0 -1
  131. package/document_loaders/base.cjs +0 -1
  132. package/document_loaders/base.d.cts +0 -1
  133. package/document_loaders/base.d.ts +0 -1
  134. package/document_loaders/base.js +0 -1
  135. package/document_loaders/langsmith.cjs +0 -1
  136. package/document_loaders/langsmith.d.cts +0 -1
  137. package/document_loaders/langsmith.d.ts +0 -1
  138. package/document_loaders/langsmith.js +0 -1
  139. package/documents.cjs +0 -1
  140. package/documents.d.cts +0 -1
  141. package/documents.d.ts +0 -1
  142. package/documents.js +0 -1
  143. package/embeddings.cjs +0 -1
  144. package/embeddings.d.cts +0 -1
  145. package/embeddings.d.ts +0 -1
  146. package/embeddings.js +0 -1
  147. package/errors.cjs +0 -1
  148. package/errors.d.cts +0 -1
  149. package/errors.d.ts +0 -1
  150. package/errors.js +0 -1
  151. package/example_selectors.cjs +0 -1
  152. package/example_selectors.d.cts +0 -1
  153. package/example_selectors.d.ts +0 -1
  154. package/example_selectors.js +0 -1
  155. package/indexing.cjs +0 -1
  156. package/indexing.d.cts +0 -1
  157. package/indexing.d.ts +0 -1
  158. package/indexing.js +0 -1
  159. package/language_models/base.cjs +0 -1
  160. package/language_models/base.d.cts +0 -1
  161. package/language_models/base.d.ts +0 -1
  162. package/language_models/base.js +0 -1
  163. package/language_models/chat_models.cjs +0 -1
  164. package/language_models/chat_models.d.cts +0 -1
  165. package/language_models/chat_models.d.ts +0 -1
  166. package/language_models/chat_models.js +0 -1
  167. package/language_models/llms.cjs +0 -1
  168. package/language_models/llms.d.cts +0 -1
  169. package/language_models/llms.d.ts +0 -1
  170. package/language_models/llms.js +0 -1
  171. package/language_models/profile.cjs +0 -1
  172. package/language_models/profile.d.cts +0 -1
  173. package/language_models/profile.d.ts +0 -1
  174. package/language_models/profile.js +0 -1
  175. package/language_models/structured_output.cjs +0 -1
  176. package/language_models/structured_output.d.cts +0 -1
  177. package/language_models/structured_output.d.ts +0 -1
  178. package/language_models/structured_output.js +0 -1
  179. package/load/serializable.cjs +0 -1
  180. package/load/serializable.d.cts +0 -1
  181. package/load/serializable.d.ts +0 -1
  182. package/load/serializable.js +0 -1
  183. package/load.cjs +0 -1
  184. package/load.d.cts +0 -1
  185. package/load.d.ts +0 -1
  186. package/load.js +0 -1
  187. package/memory.cjs +0 -1
  188. package/memory.d.cts +0 -1
  189. package/memory.d.ts +0 -1
  190. package/memory.js +0 -1
  191. package/messages/tool.cjs +0 -1
  192. package/messages/tool.d.cts +0 -1
  193. package/messages/tool.d.ts +0 -1
  194. package/messages/tool.js +0 -1
  195. package/messages.cjs +0 -1
  196. package/messages.d.cts +0 -1
  197. package/messages.d.ts +0 -1
  198. package/messages.js +0 -1
  199. package/output_parsers/openai_functions.cjs +0 -1
  200. package/output_parsers/openai_functions.d.cts +0 -1
  201. package/output_parsers/openai_functions.d.ts +0 -1
  202. package/output_parsers/openai_functions.js +0 -1
  203. package/output_parsers/openai_tools.cjs +0 -1
  204. package/output_parsers/openai_tools.d.cts +0 -1
  205. package/output_parsers/openai_tools.d.ts +0 -1
  206. package/output_parsers/openai_tools.js +0 -1
  207. package/output_parsers.cjs +0 -1
  208. package/output_parsers.d.cts +0 -1
  209. package/output_parsers.d.ts +0 -1
  210. package/output_parsers.js +0 -1
  211. package/outputs.cjs +0 -1
  212. package/outputs.d.cts +0 -1
  213. package/outputs.d.ts +0 -1
  214. package/outputs.js +0 -1
  215. package/prompt_values.cjs +0 -1
  216. package/prompt_values.d.cts +0 -1
  217. package/prompt_values.d.ts +0 -1
  218. package/prompt_values.js +0 -1
  219. package/prompts.cjs +0 -1
  220. package/prompts.d.cts +0 -1
  221. package/prompts.d.ts +0 -1
  222. package/prompts.js +0 -1
  223. package/retrievers/document_compressors.cjs +0 -1
  224. package/retrievers/document_compressors.d.cts +0 -1
  225. package/retrievers/document_compressors.d.ts +0 -1
  226. package/retrievers/document_compressors.js +0 -1
  227. package/retrievers.cjs +0 -1
  228. package/retrievers.d.cts +0 -1
  229. package/retrievers.d.ts +0 -1
  230. package/retrievers.js +0 -1
  231. package/runnables/graph.cjs +0 -1
  232. package/runnables/graph.d.cts +0 -1
  233. package/runnables/graph.d.ts +0 -1
  234. package/runnables/graph.js +0 -1
  235. package/runnables.cjs +0 -1
  236. package/runnables.d.cts +0 -1
  237. package/runnables.d.ts +0 -1
  238. package/runnables.js +0 -1
  239. package/singletons.cjs +0 -1
  240. package/singletons.d.cts +0 -1
  241. package/singletons.d.ts +0 -1
  242. package/singletons.js +0 -1
  243. package/stores.cjs +0 -1
  244. package/stores.d.cts +0 -1
  245. package/stores.d.ts +0 -1
  246. package/stores.js +0 -1
  247. package/structured_query.cjs +0 -1
  248. package/structured_query.d.cts +0 -1
  249. package/structured_query.d.ts +0 -1
  250. package/structured_query.js +0 -1
  251. package/tools.cjs +0 -1
  252. package/tools.d.cts +0 -1
  253. package/tools.d.ts +0 -1
  254. package/tools.js +0 -1
  255. package/tracers/base.cjs +0 -1
  256. package/tracers/base.d.cts +0 -1
  257. package/tracers/base.d.ts +0 -1
  258. package/tracers/base.js +0 -1
  259. package/tracers/console.cjs +0 -1
  260. package/tracers/console.d.cts +0 -1
  261. package/tracers/console.d.ts +0 -1
  262. package/tracers/console.js +0 -1
  263. package/tracers/log_stream.cjs +0 -1
  264. package/tracers/log_stream.d.cts +0 -1
  265. package/tracers/log_stream.d.ts +0 -1
  266. package/tracers/log_stream.js +0 -1
  267. package/tracers/run_collector.cjs +0 -1
  268. package/tracers/run_collector.d.cts +0 -1
  269. package/tracers/run_collector.d.ts +0 -1
  270. package/tracers/run_collector.js +0 -1
  271. package/tracers/tracer_langchain.cjs +0 -1
  272. package/tracers/tracer_langchain.d.cts +0 -1
  273. package/tracers/tracer_langchain.d.ts +0 -1
  274. package/tracers/tracer_langchain.js +0 -1
  275. package/types/stream.cjs +0 -1
  276. package/types/stream.d.cts +0 -1
  277. package/types/stream.d.ts +0 -1
  278. package/types/stream.js +0 -1
  279. package/utils/async_caller.cjs +0 -1
  280. package/utils/async_caller.d.cts +0 -1
  281. package/utils/async_caller.d.ts +0 -1
  282. package/utils/async_caller.js +0 -1
  283. package/utils/chunk_array.cjs +0 -1
  284. package/utils/chunk_array.d.cts +0 -1
  285. package/utils/chunk_array.d.ts +0 -1
  286. package/utils/chunk_array.js +0 -1
  287. package/utils/context.cjs +0 -1
  288. package/utils/context.d.cts +0 -1
  289. package/utils/context.d.ts +0 -1
  290. package/utils/context.js +0 -1
  291. package/utils/env.cjs +0 -1
  292. package/utils/env.d.cts +0 -1
  293. package/utils/env.d.ts +0 -1
  294. package/utils/env.js +0 -1
  295. package/utils/event_source_parse.cjs +0 -1
  296. package/utils/event_source_parse.d.cts +0 -1
  297. package/utils/event_source_parse.d.ts +0 -1
  298. package/utils/event_source_parse.js +0 -1
  299. package/utils/format.cjs +0 -1
  300. package/utils/format.d.cts +0 -1
  301. package/utils/format.d.ts +0 -1
  302. package/utils/format.js +0 -1
  303. package/utils/function_calling.cjs +0 -1
  304. package/utils/function_calling.d.cts +0 -1
  305. package/utils/function_calling.d.ts +0 -1
  306. package/utils/function_calling.js +0 -1
  307. package/utils/hash.cjs +0 -1
  308. package/utils/hash.d.cts +0 -1
  309. package/utils/hash.d.ts +0 -1
  310. package/utils/hash.js +0 -1
  311. package/utils/json_patch.cjs +0 -1
  312. package/utils/json_patch.d.cts +0 -1
  313. package/utils/json_patch.d.ts +0 -1
  314. package/utils/json_patch.js +0 -1
  315. package/utils/json_schema.cjs +0 -1
  316. package/utils/json_schema.d.cts +0 -1
  317. package/utils/json_schema.d.ts +0 -1
  318. package/utils/json_schema.js +0 -1
  319. package/utils/math.cjs +0 -1
  320. package/utils/math.d.cts +0 -1
  321. package/utils/math.d.ts +0 -1
  322. package/utils/math.js +0 -1
  323. package/utils/ssrf.cjs +0 -1
  324. package/utils/ssrf.d.cts +0 -1
  325. package/utils/ssrf.d.ts +0 -1
  326. package/utils/ssrf.js +0 -1
  327. package/utils/standard_schema.cjs +0 -1
  328. package/utils/standard_schema.d.cts +0 -1
  329. package/utils/standard_schema.d.ts +0 -1
  330. package/utils/standard_schema.js +0 -1
  331. package/utils/stream.cjs +0 -1
  332. package/utils/stream.d.cts +0 -1
  333. package/utils/stream.d.ts +0 -1
  334. package/utils/stream.js +0 -1
  335. package/utils/testing.cjs +0 -1
  336. package/utils/testing.d.cts +0 -1
  337. package/utils/testing.d.ts +0 -1
  338. package/utils/testing.js +0 -1
  339. package/utils/tiktoken.cjs +0 -1
  340. package/utils/tiktoken.d.cts +0 -1
  341. package/utils/tiktoken.d.ts +0 -1
  342. package/utils/tiktoken.js +0 -1
  343. package/utils/types.cjs +0 -1
  344. package/utils/types.d.cts +0 -1
  345. package/utils/types.d.ts +0 -1
  346. package/utils/types.js +0 -1
  347. package/utils/uuid.cjs +0 -1
  348. package/utils/uuid.d.cts +0 -1
  349. package/utils/uuid.d.ts +0 -1
  350. package/utils/uuid.js +0 -1
  351. package/vectorstores.cjs +0 -1
  352. package/vectorstores.d.cts +0 -1
  353. package/vectorstores.d.ts +0 -1
  354. package/vectorstores.js +0 -1
@@ -0,0 +1,391 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+ import { isAIMessageChunk } from "../messages/ai.js";
3
+ //#region src/language_models/compat.ts
4
+ /**
5
+ * Compatibility bridge: converts legacy `_streamResponseChunks`
6
+ * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new
7
+ * `ChatModelStreamEvent` protocol.
8
+ *
9
+ * @module
10
+ */
11
+ var compat_exports = /* @__PURE__ */ __exportAll({
12
+ convertChunksToEvents: () => convertChunksToEvents,
13
+ finalizeContentBlock: () => finalizeContentBlock
14
+ });
15
+ const MIME_TYPE_BY_AUDIO_FORMAT = {
16
+ wav: "audio/wav",
17
+ mp3: "audio/mpeg",
18
+ flac: "audio/flac",
19
+ opus: "audio/opus",
20
+ aac: "audio/aac",
21
+ pcm16: "audio/pcm"
22
+ };
23
+ const MIME_TYPE_BY_IMAGE_FORMAT = {
24
+ png: "image/png",
25
+ jpeg: "image/jpeg",
26
+ jpg: "image/jpeg",
27
+ webp: "image/webp",
28
+ gif: "image/gif"
29
+ };
30
+ function nextBlockIndex(activeBlocks) {
31
+ let next = 0;
32
+ for (const index of activeBlocks.keys()) if (index >= next) next = index + 1;
33
+ return next;
34
+ }
35
+ function getAdditionalKwargs(message) {
36
+ const additional = message.additional_kwargs;
37
+ return additional != null && typeof additional === "object" ? additional : {};
38
+ }
39
+ function extractImageBlocksFromToolOutputs(message) {
40
+ const toolOutputs = getAdditionalKwargs(message).tool_outputs;
41
+ if (!Array.isArray(toolOutputs)) return [];
42
+ const blocks = [];
43
+ for (const entry of toolOutputs) {
44
+ if (entry == null || typeof entry !== "object") continue;
45
+ const record = entry;
46
+ if (record.type !== "image_generation_call") continue;
47
+ const data = typeof record.result === "string" ? record.result : void 0;
48
+ const url = typeof record.url === "string" ? record.url : void 0;
49
+ if (data == null && url == null) continue;
50
+ const outputFormat = typeof record.output_format === "string" ? record.output_format.toLowerCase() : void 0;
51
+ const mimeType = (outputFormat != null ? MIME_TYPE_BY_IMAGE_FORMAT[outputFormat] : void 0) ?? "image/png";
52
+ blocks.push({
53
+ type: "image",
54
+ ...typeof record.id === "string" ? { id: record.id } : {},
55
+ ...url != null ? { url } : {},
56
+ ...data != null ? { data } : {},
57
+ mimeType
58
+ });
59
+ }
60
+ return blocks;
61
+ }
62
+ function getAudioPayload(message) {
63
+ const audio = getAdditionalKwargs(message).audio;
64
+ if (audio == null || typeof audio !== "object") return void 0;
65
+ const record = audio;
66
+ const data = typeof record.data === "string" ? record.data : void 0;
67
+ const url = typeof record.url === "string" ? record.url : void 0;
68
+ const transcript = typeof record.transcript === "string" ? record.transcript : void 0;
69
+ if (data == null && url == null && transcript == null) return void 0;
70
+ const explicitMimeType = typeof record.mime_type === "string" ? record.mime_type : typeof record.mimeType === "string" ? record.mimeType : void 0;
71
+ const format = typeof record.format === "string" ? record.format.toLowerCase() : void 0;
72
+ const mimeType = explicitMimeType ?? (format != null ? MIME_TYPE_BY_AUDIO_FORMAT[format] : void 0) ?? (data != null ? "audio/wav" : "audio/pcm");
73
+ return {
74
+ ...typeof record.id === "string" ? { id: record.id } : {},
75
+ ...data != null ? { data } : {},
76
+ ...url != null ? { url } : {},
77
+ ...transcript != null ? { transcript } : {},
78
+ mimeType
79
+ };
80
+ }
81
+ /**
82
+ * Convert an async iterable of legacy `ChatGenerationChunk`s into
83
+ * `ChatModelStreamEvent`s with typed deltas.
84
+ */
85
+ async function* convertChunksToEvents(chunks, options) {
86
+ const activeBlocks = /* @__PURE__ */ new Map();
87
+ let messageStarted = false;
88
+ let lastUsage;
89
+ let audioStream;
90
+ const emittedImageKeys = /* @__PURE__ */ new Set();
91
+ for await (const chunk of chunks) {
92
+ options?.signal?.throwIfAborted();
93
+ const msg = chunk.message;
94
+ let usageHandledInStart = false;
95
+ if (!messageStarted) {
96
+ messageStarted = true;
97
+ const startEvent = {
98
+ event: "message-start",
99
+ id: msg.id ?? void 0
100
+ };
101
+ if (isAIMessageChunk(msg) && msg.usage_metadata) {
102
+ startEvent.usage = msg.usage_metadata;
103
+ lastUsage = { ...msg.usage_metadata };
104
+ usageHandledInStart = true;
105
+ }
106
+ yield startEvent;
107
+ }
108
+ const content = msg.content;
109
+ if (typeof content === "string") {
110
+ if (content !== "") {
111
+ const blockIndex = 0;
112
+ if (!activeBlocks.has(blockIndex)) {
113
+ const initial = {
114
+ type: "text",
115
+ text: ""
116
+ };
117
+ activeBlocks.set(blockIndex, {
118
+ type: "text",
119
+ accumulated: initial
120
+ });
121
+ yield {
122
+ event: "content-block-start",
123
+ index: blockIndex,
124
+ content: initial
125
+ };
126
+ }
127
+ const block = activeBlocks.get(blockIndex);
128
+ block.accumulated = {
129
+ ...block.accumulated,
130
+ text: (block.accumulated.text ?? "") + content
131
+ };
132
+ yield {
133
+ event: "content-block-delta",
134
+ index: blockIndex,
135
+ delta: {
136
+ type: "text-delta",
137
+ text: content
138
+ }
139
+ };
140
+ }
141
+ } else if (Array.isArray(content)) for (const part of content) {
142
+ const blockIndex = typeof part.index === "number" ? part.index : activeBlocks.size;
143
+ if (!activeBlocks.has(blockIndex)) {
144
+ activeBlocks.set(blockIndex, {
145
+ type: part.type,
146
+ accumulated: { ...part }
147
+ });
148
+ yield {
149
+ event: "content-block-start",
150
+ index: blockIndex,
151
+ content: { ...part }
152
+ };
153
+ } else {
154
+ const block = activeBlocks.get(blockIndex);
155
+ const delta = contentBlockToDelta(part);
156
+ block.accumulated = applyDeltaToBlock(block.accumulated, delta);
157
+ yield {
158
+ event: "content-block-delta",
159
+ index: blockIndex,
160
+ delta
161
+ };
162
+ }
163
+ }
164
+ if (isAIMessageChunk(msg) && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) for (const toolChunk of msg.tool_call_chunks) {
165
+ const blockIndex = typeof toolChunk.index === "number" ? toolChunk.index : activeBlocks.size;
166
+ if (!activeBlocks.has(blockIndex)) {
167
+ const initial = {
168
+ type: "tool_call_chunk",
169
+ id: toolChunk.id,
170
+ name: toolChunk.name,
171
+ args: "",
172
+ index: blockIndex
173
+ };
174
+ activeBlocks.set(blockIndex, {
175
+ type: "tool_call_chunk",
176
+ accumulated: initial
177
+ });
178
+ yield {
179
+ event: "content-block-start",
180
+ index: blockIndex,
181
+ content: initial
182
+ };
183
+ }
184
+ const acc = activeBlocks.get(blockIndex).accumulated;
185
+ if (toolChunk.id != null) acc.id = toolChunk.id;
186
+ if (toolChunk.name != null) acc.name = toolChunk.name;
187
+ acc.args = (acc.args ?? "") + (toolChunk.args ?? "");
188
+ yield {
189
+ event: "content-block-delta",
190
+ index: blockIndex,
191
+ delta: {
192
+ type: "block-delta",
193
+ fields: {
194
+ type: "tool_call_chunk",
195
+ ..."id" in acc && acc.id != null ? { id: acc.id } : {},
196
+ ..."name" in acc && acc.name != null ? { name: acc.name } : {},
197
+ args: acc.args
198
+ }
199
+ }
200
+ };
201
+ }
202
+ const audioPayload = getAudioPayload(msg);
203
+ if (audioPayload != null) {
204
+ if (audioStream == null) {
205
+ const index = nextBlockIndex(activeBlocks);
206
+ audioStream = {
207
+ index,
208
+ id: audioPayload.id,
209
+ mimeType: audioPayload.mimeType,
210
+ transcript: ""
211
+ };
212
+ const initial = {
213
+ type: "audio",
214
+ ...audioPayload.id != null ? { id: audioPayload.id } : {},
215
+ ...audioPayload.url != null ? { url: audioPayload.url } : {},
216
+ data: "",
217
+ mimeType: audioPayload.mimeType
218
+ };
219
+ activeBlocks.set(index, {
220
+ type: "audio",
221
+ accumulated: initial
222
+ });
223
+ yield {
224
+ event: "content-block-start",
225
+ index,
226
+ content: initial
227
+ };
228
+ }
229
+ const activeAudio = activeBlocks.get(audioStream.index);
230
+ if (activeAudio != null) {
231
+ const accumulated = activeAudio.accumulated;
232
+ if (audioPayload.id != null && audioStream.id == null) {
233
+ audioStream.id = audioPayload.id;
234
+ accumulated.id = audioPayload.id;
235
+ }
236
+ if (audioPayload.transcript != null) {
237
+ audioStream.transcript += audioPayload.transcript;
238
+ accumulated.transcript = audioStream.transcript;
239
+ yield {
240
+ event: "content-block-delta",
241
+ index: audioStream.index,
242
+ delta: {
243
+ type: "block-delta",
244
+ fields: {
245
+ type: "audio",
246
+ transcript: audioStream.transcript
247
+ }
248
+ }
249
+ };
250
+ }
251
+ if (audioPayload.data != null && audioPayload.data.length > 0) {
252
+ accumulated.data = (accumulated.data ?? "") + audioPayload.data;
253
+ yield {
254
+ event: "content-block-delta",
255
+ index: audioStream.index,
256
+ delta: {
257
+ type: "data-delta",
258
+ data: audioPayload.data,
259
+ encoding: "base64"
260
+ }
261
+ };
262
+ }
263
+ }
264
+ }
265
+ for (const imageBlock of extractImageBlocksFromToolOutputs(msg)) {
266
+ const imageRecord = imageBlock;
267
+ const imageKey = imageRecord.id ?? imageRecord.url ?? (imageRecord.data != null ? `${imageRecord.data.length}:${imageRecord.data.slice(0, 32)}` : void 0);
268
+ if (imageKey != null && emittedImageKeys.has(imageKey)) continue;
269
+ if (imageKey != null) emittedImageKeys.add(imageKey);
270
+ const index = nextBlockIndex(activeBlocks);
271
+ activeBlocks.set(index, {
272
+ type: "image",
273
+ accumulated: imageBlock
274
+ });
275
+ yield {
276
+ event: "content-block-start",
277
+ index,
278
+ content: imageBlock
279
+ };
280
+ }
281
+ if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) {
282
+ const chunkUsage = msg.usage_metadata;
283
+ if (!lastUsage) lastUsage = { ...chunkUsage };
284
+ else lastUsage = {
285
+ input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,
286
+ output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,
287
+ total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens
288
+ };
289
+ yield {
290
+ event: "usage",
291
+ usage: { ...lastUsage }
292
+ };
293
+ }
294
+ }
295
+ for (const [index, block] of activeBlocks) yield {
296
+ event: "content-block-finish",
297
+ index,
298
+ content: finalizeContentBlock(block.accumulated)
299
+ };
300
+ yield {
301
+ event: "message-finish",
302
+ reason: "stop",
303
+ ...lastUsage ? { usage: lastUsage } : {}
304
+ };
305
+ }
306
+ /**
307
+ * Apply a typed delta to an accumulated content block.
308
+ * @internal
309
+ */
310
+ function applyDeltaToBlock(block, delta) {
311
+ switch (delta.type) {
312
+ case "text-delta": return {
313
+ ...block,
314
+ text: (block.text ?? "") + delta.text
315
+ };
316
+ case "reasoning-delta":
317
+ if (block.type === "thinking") return {
318
+ ...block,
319
+ thinking: (block.thinking ?? "") + delta.reasoning
320
+ };
321
+ return {
322
+ ...block,
323
+ reasoning: (block.reasoning ?? "") + delta.reasoning
324
+ };
325
+ case "data-delta": return {
326
+ ...block,
327
+ data: (block.data ?? "") + delta.data
328
+ };
329
+ case "block-delta": return {
330
+ ...block,
331
+ ...delta.fields
332
+ };
333
+ default: throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`);
334
+ }
335
+ }
336
+ function contentBlockToDelta(block) {
337
+ if (block.type === "text") return {
338
+ type: "text-delta",
339
+ text: block.text
340
+ };
341
+ if (block.type === "reasoning") return {
342
+ type: "reasoning-delta",
343
+ reasoning: block.reasoning
344
+ };
345
+ if (block.type === "thinking" && typeof block.thinking === "string") return {
346
+ type: "reasoning-delta",
347
+ reasoning: block.thinking
348
+ };
349
+ if (typeof block.data === "string") return {
350
+ type: "data-delta",
351
+ data: block.data,
352
+ encoding: "base64"
353
+ };
354
+ if (typeof block.type === "string") return {
355
+ type: "block-delta",
356
+ fields: { ...block }
357
+ };
358
+ throw new Error(`Unsupported content block delta: ${JSON.stringify(block)}`);
359
+ }
360
+ /**
361
+ * Finalize a content block for the finish event.
362
+ * For tool calls, parse the accumulated JSON args string.
363
+ */
364
+ function finalizeContentBlock(block) {
365
+ if (block.type === "tool_call_chunk") {
366
+ const chunk = block;
367
+ let parsedArgs;
368
+ try {
369
+ parsedArgs = JSON.parse(chunk.args ?? "{}");
370
+ } catch {
371
+ return {
372
+ type: "invalid_tool_call",
373
+ id: chunk.id,
374
+ name: chunk.name,
375
+ args: chunk.args,
376
+ error: "Failed to parse tool call arguments as JSON"
377
+ };
378
+ }
379
+ return {
380
+ type: "tool_call",
381
+ id: chunk.id,
382
+ name: chunk.name,
383
+ args: parsedArgs
384
+ };
385
+ }
386
+ return block;
387
+ }
388
+ //#endregion
389
+ export { compat_exports, convertChunksToEvents, finalizeContentBlock };
390
+
391
+ //# sourceMappingURL=compat.js.map
@@ -0,0 +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, ContentBlockDelta } from \"./event.js\";\n\nconst MIME_TYPE_BY_AUDIO_FORMAT: Record<string, string> = {\n wav: \"audio/wav\",\n mp3: \"audio/mpeg\",\n flac: \"audio/flac\",\n opus: \"audio/opus\",\n aac: \"audio/aac\",\n pcm16: \"audio/pcm\",\n};\n\nconst MIME_TYPE_BY_IMAGE_FORMAT: Record<string, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n webp: \"image/webp\",\n gif: \"image/gif\",\n};\n\ntype AudioStreamState = {\n index: number;\n id?: string;\n mimeType: string;\n transcript: string;\n};\n\nfunction nextBlockIndex(activeBlocks: Map<number, unknown>): number {\n let next = 0;\n for (const index of activeBlocks.keys()) {\n if (index >= next) next = index + 1;\n }\n return next;\n}\n\nfunction getAdditionalKwargs(message: unknown): Record<string, unknown> {\n const additional = (message as { additional_kwargs?: unknown })\n .additional_kwargs;\n return additional != null && typeof additional === \"object\"\n ? (additional as Record<string, unknown>)\n : {};\n}\n\nfunction extractImageBlocksFromToolOutputs(message: unknown): ContentBlock[] {\n const toolOutputs = getAdditionalKwargs(message).tool_outputs;\n if (!Array.isArray(toolOutputs)) return [];\n\n const blocks: ContentBlock[] = [];\n for (const entry of toolOutputs) {\n if (entry == null || typeof entry !== \"object\") continue;\n const record = entry as Record<string, unknown>;\n if (record.type !== \"image_generation_call\") continue;\n\n const data = typeof record.result === \"string\" ? record.result : undefined;\n const url = typeof record.url === \"string\" ? record.url : undefined;\n if (data == null && url == null) continue;\n\n const outputFormat =\n typeof record.output_format === \"string\"\n ? record.output_format.toLowerCase()\n : undefined;\n const mimeType =\n (outputFormat != null\n ? MIME_TYPE_BY_IMAGE_FORMAT[outputFormat]\n : undefined) ?? \"image/png\";\n\n blocks.push({\n type: \"image\",\n ...(typeof record.id === \"string\" ? { id: record.id } : {}),\n ...(url != null ? { url } : {}),\n ...(data != null ? { data } : {}),\n mimeType,\n } as ContentBlock);\n }\n return blocks;\n}\n\nfunction getAudioPayload(message: unknown):\n | {\n id?: string;\n data?: string;\n url?: string;\n transcript?: string;\n mimeType: string;\n }\n | undefined {\n const audio = getAdditionalKwargs(message).audio;\n if (audio == null || typeof audio !== \"object\") return undefined;\n const record = audio as Record<string, unknown>;\n\n const data = typeof record.data === \"string\" ? record.data : undefined;\n const url = typeof record.url === \"string\" ? record.url : undefined;\n const transcript =\n typeof record.transcript === \"string\" ? record.transcript : undefined;\n if (data == null && url == null && transcript == null) return undefined;\n\n const explicitMimeType =\n typeof record.mime_type === \"string\"\n ? record.mime_type\n : typeof record.mimeType === \"string\"\n ? record.mimeType\n : undefined;\n const format =\n typeof record.format === \"string\" ? record.format.toLowerCase() : undefined;\n const mimeType =\n explicitMimeType ??\n (format != null ? MIME_TYPE_BY_AUDIO_FORMAT[format] : undefined) ??\n (data != null ? \"audio/wav\" : \"audio/pcm\");\n\n return {\n ...(typeof record.id === \"string\" ? { id: record.id } : {}),\n ...(data != null ? { data } : {}),\n ...(url != null ? { url } : {}),\n ...(transcript != null ? { transcript } : {}),\n mimeType,\n };\n}\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 let audioStream: AudioStreamState | undefined;\n const emittedImageKeys = new Set<string>();\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 delta: { type: \"text-delta\" 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 const delta = contentBlockToDelta(part);\n block.accumulated = applyDeltaToBlock(block.accumulated, delta);\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n delta,\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 delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(\"id\" in acc && acc.id != null ? { id: acc.id } : {}),\n ...(\"name\" in acc && acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n }\n }\n\n const audioPayload = getAudioPayload(msg);\n if (audioPayload != null) {\n if (audioStream == null) {\n const index = nextBlockIndex(activeBlocks);\n audioStream = {\n index,\n id: audioPayload.id,\n mimeType: audioPayload.mimeType,\n transcript: \"\",\n };\n const initial = {\n type: \"audio\",\n ...(audioPayload.id != null ? { id: audioPayload.id } : {}),\n ...(audioPayload.url != null ? { url: audioPayload.url } : {}),\n data: \"\",\n mimeType: audioPayload.mimeType,\n } as ContentBlock;\n activeBlocks.set(index, {\n type: \"audio\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index,\n content: initial,\n };\n }\n\n const activeAudio = activeBlocks.get(audioStream.index);\n if (activeAudio != null) {\n const accumulated = activeAudio.accumulated as ContentBlock & {\n data?: string;\n transcript?: string;\n };\n if (audioPayload.id != null && audioStream.id == null) {\n audioStream.id = audioPayload.id;\n (accumulated as { id?: string }).id = audioPayload.id;\n }\n if (audioPayload.transcript != null) {\n audioStream.transcript += audioPayload.transcript;\n accumulated.transcript = audioStream.transcript;\n yield {\n event: \"content-block-delta\" as const,\n index: audioStream.index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"audio\",\n transcript: audioStream.transcript,\n },\n },\n };\n }\n if (audioPayload.data != null && audioPayload.data.length > 0) {\n accumulated.data = (accumulated.data ?? \"\") + audioPayload.data;\n yield {\n event: \"content-block-delta\" as const,\n index: audioStream.index,\n delta: {\n type: \"data-delta\" as const,\n data: audioPayload.data,\n encoding: \"base64\" as const,\n },\n };\n }\n }\n }\n\n for (const imageBlock of extractImageBlocksFromToolOutputs(msg)) {\n const imageRecord = imageBlock as ContentBlock & {\n id?: string;\n url?: string;\n data?: string;\n };\n const imageKey =\n imageRecord.id ??\n imageRecord.url ??\n (imageRecord.data != null\n ? `${imageRecord.data.length}:${imageRecord.data.slice(0, 32)}`\n : undefined);\n if (imageKey != null && emittedImageKeys.has(imageKey)) continue;\n if (imageKey != null) emittedImageKeys.add(imageKey);\n\n const index = nextBlockIndex(activeBlocks);\n activeBlocks.set(index, {\n type: \"image\",\n accumulated: imageBlock,\n });\n yield {\n event: \"content-block-start\" as const,\n index,\n content: imageBlock,\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: ContentBlockDelta\n): ContentBlock {\n switch (delta.type) {\n case \"text-delta\":\n return {\n ...block,\n text: ((block as { text?: string }).text ?? \"\") + delta.text,\n } as ContentBlock;\n case \"reasoning-delta\":\n if ((block as { type?: string }).type === \"thinking\") {\n return {\n ...block,\n thinking:\n ((block as { thinking?: string }).thinking ?? \"\") + delta.reasoning,\n } as unknown as ContentBlock;\n }\n return {\n ...block,\n reasoning:\n ((block as { reasoning?: string }).reasoning ?? \"\") + delta.reasoning,\n } as ContentBlock;\n case \"data-delta\":\n return {\n ...block,\n data: ((block as { data?: string }).data ?? \"\") + delta.data,\n } as ContentBlock;\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\nfunction contentBlockToDelta(block: ContentBlock): ContentBlockDelta {\n if (block.type === \"text\") {\n return { type: \"text-delta\", text: (block as ContentBlock.Text).text };\n }\n if (block.type === \"reasoning\") {\n return {\n type: \"reasoning-delta\",\n reasoning: (block as ContentBlock.Reasoning).reasoning,\n };\n }\n if (\n (block as { type?: string }).type === \"thinking\" &&\n typeof (block as { thinking?: unknown }).thinking === \"string\"\n ) {\n return {\n type: \"reasoning-delta\",\n reasoning: (block as unknown as { thinking: string }).thinking,\n };\n }\n if (typeof (block as { data?: unknown }).data === \"string\") {\n return {\n type: \"data-delta\",\n data: (block as unknown as { data: string }).data,\n encoding: \"base64\",\n };\n }\n if (typeof (block as { type?: unknown }).type === \"string\") {\n return {\n type: \"block-delta\",\n fields: {\n ...(block as unknown as { type: string } & Record<string, unknown>),\n },\n };\n }\n\n throw new Error(`Unsupported content block delta: ${JSON.stringify(block)}`);\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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"}
@@ -0,0 +1,12 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/language_models/event.ts
3
+ var event_exports = /* @__PURE__ */ require("../_virtual/_rolldown/runtime.cjs").__exportAll({});
4
+ //#endregion
5
+ Object.defineProperty(exports, "event_exports", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return event_exports;
9
+ }
10
+ });
11
+
12
+ //# sourceMappingURL=event.cjs.map
@@ -0,0 +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 explicit delta variants for incremental updates during streaming.\n *\n * ## Design Principles\n *\n * 1. **Content-block deltas have explicit merge semantics.** Text,\n * reasoning, and data deltas append to named fields. Generic block deltas\n * shallow-merge fields onto the active content block.\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, delta={ type: \"text-delta\", text: \"Hello\" })\n * -> ContentBlockDelta(index=0, delta={ type: \"text-delta\", 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?: Partial<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?: Partial<UsageMetadata>;\n /** Provider-specific response metadata (model name, response ID, headers, etc.). */\n responseMetadata?: Record<string, unknown>;\n}\n\n// ─── Content Block Lifecycle ────────────────────────────────────\n// See https://github.com/langchain-ai/agent-protocol/blob/main/streaming/protocol.cddl\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// ─── Content Block Deltas ───────────────────────────────────────\n\n/**\n * Incremental text content. Append `text` to the active block's `text` field.\n */\nexport interface TextDelta {\n type: \"text-delta\";\n /** The new text to append. */\n text: string;\n}\n\n/**\n * Incremental reasoning content. Append `reasoning` to the active block's\n * `reasoning` field.\n */\nexport interface ReasoningDelta {\n type: \"reasoning-delta\";\n /** The new reasoning text to append. */\n reasoning: string;\n}\n\n/**\n * Incremental encoded data. Append `data` to the active multimodal block's\n * data field.\n */\nexport interface DataDelta {\n type: \"data-delta\";\n /** Encoded data chunk to append. */\n data: string;\n /** Encoding for the data chunk. Defaults to `\"base64\"` when omitted. */\n encoding?: \"base64\";\n}\n\n/**\n * Generic content block field update. Shallow-merge `fields` onto the active\n * content block.\n */\nexport interface BlockDelta {\n type: \"block-delta\";\n /** Fields to shallow-merge onto the active content block. */\n fields: { type: string } & Record<string, unknown>;\n}\n\n/**\n * Union of all content block delta types.\n */\nexport type ContentBlockDelta =\n | TextDelta\n | ReasoningDelta\n | DataDelta\n | BlockDelta;\n\n/**\n * Emitted for each incremental update within a content block.\n *\n * The `delta` field carries the incremental content block update.\n * Accumulation rules:\n * - `text-delta` → append `text` to the active block's text field\n * - `reasoning-delta` → append `reasoning` to the active block's reasoning field\n * - `data-delta` → append `data` to the active block's data field\n * - `block-delta` → shallow-merge `fields` onto the active block\n *\n * @example\n * ```ts\n * // Text token\n * { event: \"content-block-delta\", index: 0,\n * delta: { type: \"text-delta\", text: \" world\" } }\n *\n * // Tool call args snapshot\n * { event: \"content-block-delta\", index: 1,\n * delta: { type: \"block-delta\",\n * fields: { type: \"tool_call_chunk\", args: '{\"q\":\"wea' } } } }\n *\n * // Provider-specific field (e.g., signature)\n * { event: \"content-block-delta\", index: 0,\n * delta: { type: \"block-delta\",\n * fields: { 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 delta. */\n delta: ContentBlockDelta;\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: Partial<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":""}
@@ -0,0 +1,185 @@
1
+ import { ContentBlock } from "../messages/content/index.cjs";
2
+ import { UsageMetadata } from "../messages/metadata.cjs";
3
+
4
+ //#region src/language_models/event.d.ts
5
+ /**
6
+ * Emitted once at the start of a model response.
7
+ */
8
+ interface MessageStartEvent {
9
+ event: "message-start";
10
+ /** Optional message ID assigned by the provider. */
11
+ id?: string;
12
+ /**
13
+ * Initial usage snapshot, if the provider reports input token counts
14
+ * before content begins streaming (e.g., Anthropic's `message_start`).
15
+ */
16
+ usage?: Partial<UsageMetadata>;
17
+ }
18
+ /**
19
+ * Finish reason for a model response.
20
+ *
21
+ * - `"stop"`: Natural end of generation.
22
+ * - `"length"`: Hit max token limit.
23
+ * - `"tool_use"`: Model is requesting tool execution.
24
+ * - `"content_filter"`: Content was filtered by safety systems.
25
+ */
26
+ type FinishReason = "stop" | "length" | "tool_use" | "content_filter";
27
+ /**
28
+ * Emitted once when the model response is complete.
29
+ */
30
+ interface MessageFinishEvent {
31
+ event: "message-finish";
32
+ /** Why the model stopped generating. */
33
+ reason?: FinishReason;
34
+ /** Final usage snapshot. */
35
+ usage?: Partial<UsageMetadata>;
36
+ /** Provider-specific response metadata (model name, response ID, headers, etc.). */
37
+ responseMetadata?: Record<string, unknown>;
38
+ }
39
+ /**
40
+ * Emitted when a new content block begins streaming.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * { event: "content-block-start", index: 0,
45
+ * content: { type: "text", text: "" } }
46
+ * ```
47
+ */
48
+ interface ContentBlockStartEvent {
49
+ event: "content-block-start";
50
+ /** Positional index of this block within the message. */
51
+ index: number;
52
+ /** Initial state of the content block. */
53
+ content: ContentBlock;
54
+ }
55
+ /**
56
+ * Incremental text content. Append `text` to the active block's `text` field.
57
+ */
58
+ interface TextDelta {
59
+ type: "text-delta";
60
+ /** The new text to append. */
61
+ text: string;
62
+ }
63
+ /**
64
+ * Incremental reasoning content. Append `reasoning` to the active block's
65
+ * `reasoning` field.
66
+ */
67
+ interface ReasoningDelta {
68
+ type: "reasoning-delta";
69
+ /** The new reasoning text to append. */
70
+ reasoning: string;
71
+ }
72
+ /**
73
+ * Incremental encoded data. Append `data` to the active multimodal block's
74
+ * data field.
75
+ */
76
+ interface DataDelta {
77
+ type: "data-delta";
78
+ /** Encoded data chunk to append. */
79
+ data: string;
80
+ /** Encoding for the data chunk. Defaults to `"base64"` when omitted. */
81
+ encoding?: "base64";
82
+ }
83
+ /**
84
+ * Generic content block field update. Shallow-merge `fields` onto the active
85
+ * content block.
86
+ */
87
+ interface BlockDelta {
88
+ type: "block-delta";
89
+ /** Fields to shallow-merge onto the active content block. */
90
+ fields: {
91
+ type: string;
92
+ } & Record<string, unknown>;
93
+ }
94
+ /**
95
+ * Union of all content block delta types.
96
+ */
97
+ type ContentBlockDelta = TextDelta | ReasoningDelta | DataDelta | BlockDelta;
98
+ /**
99
+ * Emitted for each incremental update within a content block.
100
+ *
101
+ * The `delta` field carries the incremental content block update.
102
+ * Accumulation rules:
103
+ * - `text-delta` → append `text` to the active block's text field
104
+ * - `reasoning-delta` → append `reasoning` to the active block's reasoning field
105
+ * - `data-delta` → append `data` to the active block's data field
106
+ * - `block-delta` → shallow-merge `fields` onto the active block
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * // Text token
111
+ * { event: "content-block-delta", index: 0,
112
+ * delta: { type: "text-delta", text: " world" } }
113
+ *
114
+ * // Tool call args snapshot
115
+ * { event: "content-block-delta", index: 1,
116
+ * delta: { type: "block-delta",
117
+ * fields: { type: "tool_call_chunk", args: '{"q":"wea' } } } }
118
+ *
119
+ * // Provider-specific field (e.g., signature)
120
+ * { event: "content-block-delta", index: 0,
121
+ * delta: { type: "block-delta",
122
+ * fields: { type: "reasoning", signature: "sig_abc" } } }
123
+ * ```
124
+ */
125
+ interface ContentBlockDeltaEvent {
126
+ event: "content-block-delta";
127
+ /** Positional index of the block being updated. */
128
+ index: number;
129
+ /** Incremental content block delta. */
130
+ delta: ContentBlockDelta;
131
+ }
132
+ /**
133
+ * Emitted when a content block is complete.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * { event: "content-block-finish", index: 0,
138
+ * content: { type: "text", text: "Hello world" } }
139
+ * ```
140
+ */
141
+ interface ContentBlockFinishEvent {
142
+ event: "content-block-finish";
143
+ /** Positional index of the completed block. */
144
+ index: number;
145
+ /** Finalized content block. */
146
+ content: ContentBlock;
147
+ }
148
+ /**
149
+ * Emitted whenever the provider reports updated usage information.
150
+ * Each event carries a **running snapshot** (not an additive delta).
151
+ */
152
+ interface UsageUpdateEvent {
153
+ event: "usage";
154
+ /** Current usage snapshot. */
155
+ usage: Partial<UsageMetadata>;
156
+ }
157
+ /**
158
+ * Passthrough for native provider events that don't map to standard types.
159
+ */
160
+ interface ProviderEvent {
161
+ event: "provider";
162
+ /** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */
163
+ provider: string;
164
+ /** Raw event type name from the provider SDK. */
165
+ name: string;
166
+ /** Raw event payload from the provider SDK. */
167
+ payload: unknown;
168
+ }
169
+ /**
170
+ * Emitted on unrecoverable stream errors.
171
+ */
172
+ interface StreamErrorEvent {
173
+ event: "error";
174
+ /** Human-readable error message. */
175
+ message: string;
176
+ /** Optional error code for programmatic handling. */
177
+ code?: string;
178
+ }
179
+ /**
180
+ * Union of all chat model stream event types.
181
+ */
182
+ type ChatModelStreamEvent = MessageStartEvent | MessageFinishEvent | ContentBlockStartEvent | ContentBlockDeltaEvent | ContentBlockFinishEvent | UsageUpdateEvent | ProviderEvent | StreamErrorEvent;
183
+ //#endregion
184
+ export { BlockDelta, ChatModelStreamEvent, ContentBlockDelta, ContentBlockDeltaEvent, ContentBlockFinishEvent, ContentBlockStartEvent, DataDelta, FinishReason, MessageFinishEvent, MessageStartEvent, ProviderEvent, ReasoningDelta, StreamErrorEvent, TextDelta, UsageUpdateEvent };
185
+ //# sourceMappingURL=event.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.cts","names":[],"sources":["../../src/language_models/event.ts"],"mappings":";;;;AA4FA;;;AAAA,UA9CiB,iBAAA;EACf,KAAA;EAgDA;EA9CA,EAAA;EAgDS;;;AAQX;EAnDE,KAAA,GAAQ,OAAA,CAAQ,aAAA;AAAA;;;AA6DlB;;;;;AAUA;KA5DY,YAAA;;;;UAKK,kBAAA;EACf,KAAA;EA2DQ;EAzDR,MAAA,GAAS,YAAA;EAgEM;EA9Df,KAAA,GAAQ,OAAA,CAAQ,aAAA;;EAEhB,gBAAA,GAAmB,MAAA;AAAA;;;;;;AAqErB;;;;UAtDiB,sBAAA;EACf,KAAA;EAyDE;EAvDF,KAAA;EAuDY;EArDZ,OAAA,EAAS,YAAA;AAAA;;;;UAQM,SAAA;EACf,IAAA;EAyEqC;EAvErC,IAAA;AAAA;;;;;UAOe,cAAA;EACf,IAAA;EAgFe;EA9Ef,SAAA;AAAA;;;;;UAOe,SAAA;EACf,IAAA;EA2EqB;EAzErB,IAAA;EAkF+B;EAhF/B,QAAA;AAAA;;;;;UAOe,UAAA;EACf,IAAA;EAmFe;EAjFf,MAAA;IAAU,IAAA;EAAA,IAAiB,MAAA;AAAA;;;;KAMjB,iBAAA,GACR,SAAA,GACA,cAAA,GACA,SAAA,GACA,UAAA;;AAsFJ;;;;;;;;;AAaA;;;;;;;;;;;;;;;;;UAtEiB,sBAAA;EACf,KAAA;EA4EE;EA1EF,KAAA;EA2EkB;EAzElB,KAAA,EAAO,iBAAA;AAAA;;;;;;;;;;UAYQ,uBAAA;EACf,KAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;UASM,gBAAA;EACf,KAAA;;EAEA,KAAA,EAAO,OAAA,CAAQ,aAAA;AAAA;;;;UAQA,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"}