assistant-stream 0.3.14 → 0.3.16

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 (238) hide show
  1. package/README.md +6 -4
  2. package/dist/core/AssistantStream.d.ts +50 -9
  3. package/dist/core/AssistantStream.d.ts.map +1 -1
  4. package/dist/core/AssistantStream.js +39 -15
  5. package/dist/core/AssistantStream.js.map +1 -1
  6. package/dist/core/AssistantStreamChunk.d.ts +84 -61
  7. package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
  8. package/dist/core/AssistantStreamChunk.js +0 -2
  9. package/dist/core/accumulators/AssistantMessageStream.d.ts +15 -11
  10. package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
  11. package/dist/core/accumulators/AssistantMessageStream.js +52 -48
  12. package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
  13. package/dist/core/accumulators/TimingTracker.d.ts +15 -11
  14. package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
  15. package/dist/core/accumulators/TimingTracker.js +36 -43
  16. package/dist/core/accumulators/TimingTracker.js.map +1 -1
  17. package/dist/core/accumulators/assistant-message-accumulator.d.ts +21 -11
  18. package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
  19. package/dist/core/accumulators/assistant-message-accumulator.js +349 -390
  20. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
  21. package/dist/core/converters/toGenericMessages.d.ts +49 -47
  22. package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
  23. package/dist/core/converters/toGenericMessages.js +122 -136
  24. package/dist/core/converters/toGenericMessages.js.map +1 -1
  25. package/dist/core/modules/assistant-stream.d.ts +92 -28
  26. package/dist/core/modules/assistant-stream.d.ts.map +1 -1
  27. package/dist/core/modules/assistant-stream.js +177 -162
  28. package/dist/core/modules/assistant-stream.js.map +1 -1
  29. package/dist/core/modules/text.d.ts +11 -7
  30. package/dist/core/modules/text.d.ts.map +1 -1
  31. package/dist/core/modules/text.js +45 -45
  32. package/dist/core/modules/text.js.map +1 -1
  33. package/dist/core/modules/tool-call.d.ts +15 -11
  34. package/dist/core/modules/tool-call.d.ts.map +1 -1
  35. package/dist/core/modules/tool-call.js +81 -96
  36. package/dist/core/modules/tool-call.js.map +1 -1
  37. package/dist/core/object/ObjectStreamAccumulator.d.ts +13 -9
  38. package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
  39. package/dist/core/object/ObjectStreamAccumulator.js +44 -52
  40. package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
  41. package/dist/core/object/ObjectStreamResponse.d.ts +12 -8
  42. package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
  43. package/dist/core/object/ObjectStreamResponse.js +52 -71
  44. package/dist/core/object/ObjectStreamResponse.js.map +1 -1
  45. package/dist/core/object/createObjectStream.d.ts +14 -8
  46. package/dist/core/object/createObjectStream.d.ts.map +1 -1
  47. package/dist/core/object/createObjectStream.js +50 -47
  48. package/dist/core/object/createObjectStream.js.map +1 -1
  49. package/dist/core/object/types.d.ts +14 -11
  50. package/dist/core/object/types.d.ts.map +1 -1
  51. package/dist/core/object/types.js +0 -2
  52. package/dist/core/serialization/PlainText.d.ts +11 -7
  53. package/dist/core/serialization/PlainText.d.ts.map +1 -1
  54. package/dist/core/serialization/PlainText.js +40 -48
  55. package/dist/core/serialization/PlainText.js.map +1 -1
  56. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +11 -7
  57. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
  58. package/dist/core/serialization/assistant-transport/AssistantTransport.js +102 -117
  59. package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
  60. package/dist/core/serialization/data-stream/DataStream.d.ts +11 -7
  61. package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
  62. package/dist/core/serialization/data-stream/DataStream.js +320 -371
  63. package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
  64. package/dist/core/serialization/data-stream/chunk-types.d.ts +101 -100
  65. package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
  66. package/dist/core/serialization/data-stream/chunk-types.js +27 -23
  67. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
  68. package/dist/core/serialization/data-stream/serialization.d.ts +9 -5
  69. package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
  70. package/dist/core/serialization/data-stream/serialization.js +23 -24
  71. package/dist/core/serialization/data-stream/serialization.js.map +1 -1
  72. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +15 -12
  73. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
  74. package/dist/core/serialization/ui-message-stream/UIMessageStream.js +205 -228
  75. package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
  76. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +68 -65
  77. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
  78. package/dist/core/serialization/ui-message-stream/chunk-types.js +0 -2
  79. package/dist/core/tool/ToolCallReader.d.ts +34 -30
  80. package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
  81. package/dist/core/tool/ToolCallReader.js +264 -317
  82. package/dist/core/tool/ToolCallReader.js.map +1 -1
  83. package/dist/core/tool/ToolExecutionStream.d.ts +20 -17
  84. package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
  85. package/dist/core/tool/ToolExecutionStream.js +123 -146
  86. package/dist/core/tool/ToolExecutionStream.js.map +1 -1
  87. package/dist/core/tool/ToolResponse.d.ts +60 -19
  88. package/dist/core/tool/ToolResponse.d.ts.map +1 -1
  89. package/dist/core/tool/ToolResponse.js +51 -34
  90. package/dist/core/tool/ToolResponse.js.map +1 -1
  91. package/dist/core/tool/schema-utils.d.ts +19 -15
  92. package/dist/core/tool/schema-utils.d.ts.map +1 -1
  93. package/dist/core/tool/schema-utils.js +50 -84
  94. package/dist/core/tool/schema-utils.js.map +1 -1
  95. package/dist/core/tool/tool-types.d.ts +173 -92
  96. package/dist/core/tool/tool-types.d.ts.map +1 -1
  97. package/dist/core/tool/tool-types.js +0 -2
  98. package/dist/core/tool/toolResultStream.d.ts +24 -7
  99. package/dist/core/tool/toolResultStream.d.ts.map +1 -1
  100. package/dist/core/tool/toolResultStream.js +128 -145
  101. package/dist/core/tool/toolResultStream.js.map +1 -1
  102. package/dist/core/tool/type-path-utils.d.ts +8 -19
  103. package/dist/core/tool/type-path-utils.d.ts.map +1 -1
  104. package/dist/core/tool/type-path-utils.js +0 -2
  105. package/dist/core/utils/Counter.d.ts +6 -3
  106. package/dist/core/utils/Counter.d.ts.map +1 -1
  107. package/dist/core/utils/Counter.js +10 -6
  108. package/dist/core/utils/Counter.js.map +1 -1
  109. package/dist/core/utils/generateId.d.ts +4 -1
  110. package/dist/core/utils/generateId.d.ts.map +1 -1
  111. package/dist/core/utils/generateId.js +5 -1
  112. package/dist/core/utils/generateId.js.map +1 -1
  113. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +15 -11
  114. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
  115. package/dist/core/utils/stream/AssistantMetaTransformStream.js +38 -42
  116. package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
  117. package/dist/core/utils/stream/AssistantTransformStream.d.ts +11 -8
  118. package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
  119. package/dist/core/utils/stream/AssistantTransformStream.js +37 -35
  120. package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
  121. package/dist/core/utils/stream/LineDecoderStream.d.ts +6 -3
  122. package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
  123. package/dist/core/utils/stream/LineDecoderStream.js +23 -26
  124. package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
  125. package/dist/core/utils/stream/PipeableTransformStream.d.ts +5 -2
  126. package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
  127. package/dist/core/utils/stream/PipeableTransformStream.js +14 -10
  128. package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
  129. package/dist/core/utils/stream/SSE.d.ts +10 -6
  130. package/dist/core/utils/stream/SSE.d.ts.map +1 -1
  131. package/dist/core/utils/stream/SSE.js +79 -91
  132. package/dist/core/utils/stream/SSE.js.map +1 -1
  133. package/dist/core/utils/stream/UnderlyingReadable.d.ts +7 -4
  134. package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
  135. package/dist/core/utils/stream/UnderlyingReadable.js +0 -2
  136. package/dist/core/utils/stream/merge.d.ts +11 -7
  137. package/dist/core/utils/stream/merge.d.ts.map +1 -1
  138. package/dist/core/utils/stream/merge.js +68 -170
  139. package/dist/core/utils/stream/merge.js.map +1 -1
  140. package/dist/core/utils/stream/path-utils.d.ts +11 -7
  141. package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
  142. package/dist/core/utils/stream/path-utils.js +46 -52
  143. package/dist/core/utils/stream/path-utils.js.map +1 -1
  144. package/dist/core/utils/types.d.ts +109 -113
  145. package/dist/core/utils/types.d.ts.map +1 -1
  146. package/dist/core/utils/types.js +0 -2
  147. package/dist/core/utils/withPromiseOrValue.d.ts +4 -1
  148. package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
  149. package/dist/core/utils/withPromiseOrValue.js +12 -15
  150. package/dist/core/utils/withPromiseOrValue.js.map +1 -1
  151. package/dist/index.d.ts +23 -24
  152. package/dist/index.js +16 -16
  153. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  154. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  155. package/dist/resumable/ResumableStreamContext.d.ts +28 -24
  156. package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
  157. package/dist/resumable/ResumableStreamContext.js +99 -114
  158. package/dist/resumable/ResumableStreamContext.js.map +1 -1
  159. package/dist/resumable/constants.d.ts +4 -1
  160. package/dist/resumable/constants.d.ts.map +1 -1
  161. package/dist/resumable/constants.js +5 -1
  162. package/dist/resumable/constants.js.map +1 -1
  163. package/dist/resumable/createResumableAssistantStreamResponse.d.ts +22 -21
  164. package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
  165. package/dist/resumable/createResumableAssistantStreamResponse.js +25 -32
  166. package/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -1
  167. package/dist/resumable/errors.d.ts +8 -5
  168. package/dist/resumable/errors.d.ts.map +1 -1
  169. package/dist/resumable/errors.js +14 -12
  170. package/dist/resumable/errors.js.map +1 -1
  171. package/dist/resumable/index.d.ts +7 -7
  172. package/dist/resumable/index.js +5 -5
  173. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +14 -10
  174. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
  175. package/dist/resumable/stores/InMemoryResumableStreamStore.js +159 -193
  176. package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
  177. package/dist/resumable/stores/ioredis.d.ts +9 -5
  178. package/dist/resumable/stores/ioredis.d.ts.map +1 -1
  179. package/dist/resumable/stores/ioredis.js +70 -82
  180. package/dist/resumable/stores/ioredis.js.map +1 -1
  181. package/dist/resumable/stores/redis-impl.d.ts +51 -48
  182. package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
  183. package/dist/resumable/stores/redis-impl.js +176 -176
  184. package/dist/resumable/stores/redis-impl.js.map +1 -1
  185. package/dist/resumable/stores/redis.d.ts +31 -28
  186. package/dist/resumable/stores/redis.d.ts.map +1 -1
  187. package/dist/resumable/stores/redis.js +87 -95
  188. package/dist/resumable/stores/redis.js.map +1 -1
  189. package/dist/resumable/types.d.ts +29 -26
  190. package/dist/resumable/types.d.ts.map +1 -1
  191. package/dist/resumable/types.js +0 -2
  192. package/dist/utils/AsyncIterableStream.d.ts +5 -2
  193. package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
  194. package/dist/utils/AsyncIterableStream.js +17 -16
  195. package/dist/utils/AsyncIterableStream.js.map +1 -1
  196. package/dist/utils/json/fix-json.d.ts +4 -1
  197. package/dist/utils/json/fix-json.d.ts.map +1 -1
  198. package/dist/utils/json/fix-json.js +286 -380
  199. package/dist/utils/json/fix-json.js.map +1 -1
  200. package/dist/utils/json/is-json.d.ts +8 -4
  201. package/dist/utils/json/is-json.d.ts.map +1 -1
  202. package/dist/utils/json/is-json.js +13 -21
  203. package/dist/utils/json/is-json.js.map +1 -1
  204. package/dist/utils/json/json-value.d.ts +7 -4
  205. package/dist/utils/json/json-value.d.ts.map +1 -1
  206. package/dist/utils/json/json-value.js +0 -2
  207. package/dist/utils/json/parse-partial-json-object.d.ts +11 -8
  208. package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
  209. package/dist/utils/json/parse-partial-json-object.js +50 -62
  210. package/dist/utils/json/parse-partial-json-object.js.map +1 -1
  211. package/dist/utils/promiseWithResolvers.d.ts +7 -4
  212. package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
  213. package/dist/utils/promiseWithResolvers.js +17 -10
  214. package/dist/utils/promiseWithResolvers.js.map +1 -1
  215. package/dist/utils.d.ts +6 -6
  216. package/dist/utils.js +5 -5
  217. package/package.json +5 -4
  218. package/src/core/AssistantStream.ts +37 -0
  219. package/src/core/AssistantStreamChunk.ts +30 -0
  220. package/src/core/modules/assistant-stream.ts +68 -0
  221. package/src/core/tool/ToolResponse.ts +45 -1
  222. package/src/core/tool/tool-types.ts +102 -2
  223. package/src/core/tool/toolResultStream.ts +15 -0
  224. package/dist/core/AssistantStreamChunk.js.map +0 -1
  225. package/dist/core/object/types.js.map +0 -1
  226. package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
  227. package/dist/core/tool/tool-types.js.map +0 -1
  228. package/dist/core/tool/type-path-utils.js.map +0 -1
  229. package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
  230. package/dist/core/utils/types.js.map +0 -1
  231. package/dist/index.d.ts.map +0 -1
  232. package/dist/index.js.map +0 -1
  233. package/dist/resumable/index.d.ts.map +0 -1
  234. package/dist/resumable/index.js.map +0 -1
  235. package/dist/resumable/types.js.map +0 -1
  236. package/dist/utils/json/json-value.js.map +0 -1
  237. package/dist/utils.d.ts.map +0 -1
  238. package/dist/utils.js.map +0 -1
@@ -2,234 +2,211 @@ import { AssistantTransformStream } from "../../utils/stream/AssistantTransformS
2
2
  import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream.js";
3
3
  import { LineDecoderStream } from "../../utils/stream/LineDecoderStream.js";
4
4
  import { generateId } from "../../utils/generateId.js";
5
- class SSEEventStream extends TransformStream {
6
- constructor() {
7
- let eventBuffer = {};
8
- let dataLines = [];
9
- super({
10
- start() {
11
- eventBuffer = {};
12
- dataLines = [];
13
- },
14
- transform(line, controller) {
15
- if (line.startsWith(":"))
16
- return;
17
- if (line === "") {
18
- if (dataLines.length > 0) {
19
- controller.enqueue({
20
- event: eventBuffer.event || "message",
21
- data: dataLines.join("\n"),
22
- id: eventBuffer.id,
23
- retry: eventBuffer.retry,
24
- });
25
- }
26
- eventBuffer = {};
27
- dataLines = [];
28
- return;
29
- }
30
- const [field, ...rest] = line.split(":");
31
- const value = rest.join(":").trimStart();
32
- switch (field) {
33
- case "event":
34
- eventBuffer.event = value;
35
- break;
36
- case "data":
37
- dataLines.push(value);
38
- break;
39
- case "id":
40
- eventBuffer.id = value;
41
- break;
42
- case "retry":
43
- eventBuffer.retry = Number(value);
44
- break;
45
- }
46
- },
47
- flush(controller) {
48
- if (dataLines.length > 0) {
49
- controller.enqueue({
50
- event: eventBuffer.event || "message",
51
- data: dataLines.join("\n"),
52
- id: eventBuffer.id,
53
- retry: eventBuffer.retry,
54
- });
55
- }
56
- },
57
- });
58
- }
59
- }
5
+ //#region src/core/serialization/ui-message-stream/UIMessageStream.ts
6
+ var SSEEventStream = class extends TransformStream {
7
+ constructor() {
8
+ let eventBuffer = {};
9
+ let dataLines = [];
10
+ super({
11
+ start() {
12
+ eventBuffer = {};
13
+ dataLines = [];
14
+ },
15
+ transform(line, controller) {
16
+ if (line.startsWith(":")) return;
17
+ if (line === "") {
18
+ if (dataLines.length > 0) controller.enqueue({
19
+ event: eventBuffer.event || "message",
20
+ data: dataLines.join("\n"),
21
+ id: eventBuffer.id,
22
+ retry: eventBuffer.retry
23
+ });
24
+ eventBuffer = {};
25
+ dataLines = [];
26
+ return;
27
+ }
28
+ const [field, ...rest] = line.split(":");
29
+ const value = rest.join(":").trimStart();
30
+ switch (field) {
31
+ case "event":
32
+ eventBuffer.event = value;
33
+ break;
34
+ case "data":
35
+ dataLines.push(value);
36
+ break;
37
+ case "id":
38
+ eventBuffer.id = value;
39
+ break;
40
+ case "retry":
41
+ eventBuffer.retry = Number(value);
42
+ break;
43
+ }
44
+ },
45
+ flush(controller) {
46
+ if (dataLines.length > 0) controller.enqueue({
47
+ event: eventBuffer.event || "message",
48
+ data: dataLines.join("\n"),
49
+ id: eventBuffer.id,
50
+ retry: eventBuffer.retry
51
+ });
52
+ }
53
+ });
54
+ }
55
+ };
60
56
  const isDataChunk = (chunk) => chunk.type.startsWith("data-");
61
57
  /**
62
- * Decodes AI SDK v6 UI Message Stream format into AssistantStreamChunks.
63
- */
64
- export class UIMessageStreamDecoder extends PipeableTransformStream {
65
- constructor(options = {}) {
66
- super((readable) => {
67
- const toolCallControllers = new Map();
68
- let activeToolCallArgsText;
69
- let currentMessageId;
70
- let receivedDone = false;
71
- const transform = new AssistantTransformStream({
72
- transform(chunk, controller) {
73
- const type = chunk.type;
74
- if (isDataChunk(chunk)) {
75
- const name = chunk.type.slice(5);
76
- if (options.onData) {
77
- options.onData({
78
- type: chunk.type,
79
- name,
80
- data: chunk.data,
81
- ...(chunk.transient !== undefined && {
82
- transient: chunk.transient,
83
- }),
84
- });
85
- }
86
- if (!chunk.transient) {
87
- controller.enqueue({
88
- type: "data",
89
- path: [],
90
- data: [{ name, data: chunk.data }],
91
- });
92
- }
93
- return;
94
- }
95
- switch (type) {
96
- case "start":
97
- currentMessageId = chunk.messageId;
98
- controller.enqueue({
99
- type: "step-start",
100
- path: [],
101
- messageId: chunk.messageId,
102
- });
103
- break;
104
- case "text-start":
105
- case "text-end":
106
- case "reasoning-start":
107
- case "reasoning-end":
108
- break;
109
- case "text-delta":
110
- controller.appendText(chunk.textDelta);
111
- break;
112
- case "reasoning-delta":
113
- controller.appendReasoning(chunk.delta);
114
- break;
115
- case "source":
116
- controller.appendSource({
117
- type: "source",
118
- sourceType: chunk.source.sourceType,
119
- id: chunk.source.id,
120
- url: chunk.source.url,
121
- ...(chunk.source.title && { title: chunk.source.title }),
122
- });
123
- break;
124
- case "file":
125
- controller.appendFile({
126
- type: "file",
127
- mimeType: chunk.file.mimeType,
128
- data: chunk.file.data,
129
- });
130
- break;
131
- case "tool-call-start": {
132
- activeToolCallArgsText?.close();
133
- activeToolCallArgsText = undefined;
134
- if (toolCallControllers.has(chunk.toolCallId)) {
135
- throw new Error(`Encountered duplicate tool call id: ${chunk.toolCallId}`);
136
- }
137
- const toolCallController = controller.addToolCallPart({
138
- toolCallId: chunk.toolCallId,
139
- toolName: chunk.toolName,
140
- });
141
- toolCallControllers.set(chunk.toolCallId, toolCallController);
142
- activeToolCallArgsText = toolCallController.argsText;
143
- break;
144
- }
145
- case "tool-call-delta":
146
- activeToolCallArgsText?.append(chunk.argsText);
147
- break;
148
- case "tool-call-end":
149
- activeToolCallArgsText?.close();
150
- activeToolCallArgsText = undefined;
151
- break;
152
- case "tool-result": {
153
- const toolCallController = toolCallControllers.get(chunk.toolCallId);
154
- if (!toolCallController) {
155
- throw new Error(`Encountered tool result with unknown id: ${chunk.toolCallId}`);
156
- }
157
- toolCallController.setResponse({
158
- result: chunk.result,
159
- isError: chunk.isError ?? false,
160
- ...(chunk.messages !== undefined
161
- ? { messages: chunk.messages }
162
- : {}),
163
- });
164
- break;
165
- }
166
- case "start-step":
167
- controller.enqueue({
168
- type: "step-start",
169
- path: [],
170
- messageId: chunk.messageId ?? currentMessageId ?? generateId(),
171
- });
172
- break;
173
- case "finish-step":
174
- controller.enqueue({
175
- type: "step-finish",
176
- path: [],
177
- finishReason: chunk.finishReason,
178
- usage: chunk.usage,
179
- isContinued: chunk.isContinued,
180
- });
181
- break;
182
- case "finish":
183
- controller.enqueue({
184
- type: "message-finish",
185
- path: [],
186
- finishReason: chunk.finishReason,
187
- usage: chunk.usage,
188
- });
189
- break;
190
- case "error":
191
- controller.enqueue({
192
- type: "error",
193
- path: [],
194
- error: chunk.errorText,
195
- });
196
- break;
197
- default:
198
- // ignore unknown types for forward compatibility
199
- break;
200
- }
201
- },
202
- flush() {
203
- activeToolCallArgsText?.close();
204
- // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return
205
- toolCallControllers.forEach((ctrl) => ctrl.close());
206
- toolCallControllers.clear();
207
- },
208
- });
209
- return readable
210
- .pipeThrough(new TextDecoderStream())
211
- .pipeThrough(new LineDecoderStream())
212
- .pipeThrough(new SSEEventStream())
213
- .pipeThrough(new TransformStream({
214
- transform(event, controller) {
215
- if (event.event !== "message") {
216
- throw new Error(`Unknown SSE event type: ${event.event}`);
217
- }
218
- if (event.data === "[DONE]") {
219
- receivedDone = true;
220
- controller.terminate();
221
- return;
222
- }
223
- controller.enqueue(JSON.parse(event.data));
224
- },
225
- flush() {
226
- if (!receivedDone) {
227
- throw new Error("Stream ended abruptly without receiving [DONE] marker");
228
- }
229
- },
230
- }))
231
- .pipeThrough(transform);
232
- });
233
- }
234
- }
58
+ * Decodes AI SDK v6 UI Message Stream format into AssistantStreamChunks.
59
+ */
60
+ var UIMessageStreamDecoder = class extends PipeableTransformStream {
61
+ constructor(options = {}) {
62
+ super((readable) => {
63
+ const toolCallControllers = /* @__PURE__ */ new Map();
64
+ let activeToolCallArgsText;
65
+ let currentMessageId;
66
+ let receivedDone = false;
67
+ const transform = new AssistantTransformStream({
68
+ transform(chunk, controller) {
69
+ const type = chunk.type;
70
+ if (isDataChunk(chunk)) {
71
+ const name = chunk.type.slice(5);
72
+ if (options.onData) options.onData({
73
+ type: chunk.type,
74
+ name,
75
+ data: chunk.data,
76
+ ...chunk.transient !== void 0 && { transient: chunk.transient }
77
+ });
78
+ if (!chunk.transient) controller.enqueue({
79
+ type: "data",
80
+ path: [],
81
+ data: [{
82
+ name,
83
+ data: chunk.data
84
+ }]
85
+ });
86
+ return;
87
+ }
88
+ switch (type) {
89
+ case "start":
90
+ currentMessageId = chunk.messageId;
91
+ controller.enqueue({
92
+ type: "step-start",
93
+ path: [],
94
+ messageId: chunk.messageId
95
+ });
96
+ break;
97
+ case "text-start":
98
+ case "text-end":
99
+ case "reasoning-start":
100
+ case "reasoning-end": break;
101
+ case "text-delta":
102
+ controller.appendText(chunk.textDelta);
103
+ break;
104
+ case "reasoning-delta":
105
+ controller.appendReasoning(chunk.delta);
106
+ break;
107
+ case "source":
108
+ controller.appendSource({
109
+ type: "source",
110
+ sourceType: chunk.source.sourceType,
111
+ id: chunk.source.id,
112
+ url: chunk.source.url,
113
+ ...chunk.source.title && { title: chunk.source.title }
114
+ });
115
+ break;
116
+ case "file":
117
+ controller.appendFile({
118
+ type: "file",
119
+ mimeType: chunk.file.mimeType,
120
+ data: chunk.file.data
121
+ });
122
+ break;
123
+ case "tool-call-start": {
124
+ activeToolCallArgsText?.close();
125
+ activeToolCallArgsText = void 0;
126
+ if (toolCallControllers.has(chunk.toolCallId)) throw new Error(`Encountered duplicate tool call id: ${chunk.toolCallId}`);
127
+ const toolCallController = controller.addToolCallPart({
128
+ toolCallId: chunk.toolCallId,
129
+ toolName: chunk.toolName
130
+ });
131
+ toolCallControllers.set(chunk.toolCallId, toolCallController);
132
+ activeToolCallArgsText = toolCallController.argsText;
133
+ break;
134
+ }
135
+ case "tool-call-delta":
136
+ activeToolCallArgsText?.append(chunk.argsText);
137
+ break;
138
+ case "tool-call-end":
139
+ activeToolCallArgsText?.close();
140
+ activeToolCallArgsText = void 0;
141
+ break;
142
+ case "tool-result": {
143
+ const toolCallController = toolCallControllers.get(chunk.toolCallId);
144
+ if (!toolCallController) throw new Error(`Encountered tool result with unknown id: ${chunk.toolCallId}`);
145
+ toolCallController.setResponse({
146
+ result: chunk.result,
147
+ isError: chunk.isError ?? false,
148
+ ...chunk.messages !== void 0 ? { messages: chunk.messages } : {}
149
+ });
150
+ break;
151
+ }
152
+ case "start-step":
153
+ controller.enqueue({
154
+ type: "step-start",
155
+ path: [],
156
+ messageId: chunk.messageId ?? currentMessageId ?? generateId()
157
+ });
158
+ break;
159
+ case "finish-step":
160
+ controller.enqueue({
161
+ type: "step-finish",
162
+ path: [],
163
+ finishReason: chunk.finishReason,
164
+ usage: chunk.usage,
165
+ isContinued: chunk.isContinued
166
+ });
167
+ break;
168
+ case "finish":
169
+ controller.enqueue({
170
+ type: "message-finish",
171
+ path: [],
172
+ finishReason: chunk.finishReason,
173
+ usage: chunk.usage
174
+ });
175
+ break;
176
+ case "error":
177
+ controller.enqueue({
178
+ type: "error",
179
+ path: [],
180
+ error: chunk.errorText
181
+ });
182
+ break;
183
+ default: break;
184
+ }
185
+ },
186
+ flush() {
187
+ activeToolCallArgsText?.close();
188
+ toolCallControllers.forEach((ctrl) => ctrl.close());
189
+ toolCallControllers.clear();
190
+ }
191
+ });
192
+ return readable.pipeThrough(new TextDecoderStream()).pipeThrough(new LineDecoderStream()).pipeThrough(new SSEEventStream()).pipeThrough(new TransformStream({
193
+ transform(event, controller) {
194
+ if (event.event !== "message") throw new Error(`Unknown SSE event type: ${event.event}`);
195
+ if (event.data === "[DONE]") {
196
+ receivedDone = true;
197
+ controller.terminate();
198
+ return;
199
+ }
200
+ controller.enqueue(JSON.parse(event.data));
201
+ },
202
+ flush() {
203
+ if (!receivedDone) throw new Error("Stream ended abruptly without receiving [DONE] marker");
204
+ }
205
+ })).pipeThrough(transform);
206
+ });
207
+ }
208
+ };
209
+ //#endregion
210
+ export { UIMessageStreamDecoder };
211
+
235
212
  //# sourceMappingURL=UIMessageStream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UIMessageStream.js","sourceRoot":"","sources":["../../../../src/core/serialization/ui-message-stream/UIMessageStream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UIMessageStream.js","names":[],"sources":["../../../../src/core/serialization/ui-message-stream/UIMessageStream.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport type { ToolCallStreamController } from \"../../modules/tool-call\";\nimport type { TextStreamController } from \"../../modules/text\";\nimport { AssistantTransformStream } from \"../../utils/stream/AssistantTransformStream\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport { LineDecoderStream } from \"../../utils/stream/LineDecoderStream\";\nimport type {\n UIMessageStreamChunk,\n UIMessageStreamDataChunk,\n} from \"./chunk-types\";\nimport { generateId } from \"../../utils/generateId\";\n\nexport type { UIMessageStreamChunk, UIMessageStreamDataChunk };\n\nexport type UIMessageStreamDecoderOptions = {\n onData?: (data: {\n type: string;\n name: string;\n data: unknown;\n transient?: boolean;\n }) => void;\n};\n\ntype SSEEvent = {\n event: string;\n data: string;\n id?: string | undefined;\n retry?: number | undefined;\n};\n\nclass SSEEventStream extends TransformStream<string, SSEEvent> {\n constructor() {\n let eventBuffer: Partial<SSEEvent> = {};\n let dataLines: string[] = [];\n\n super({\n start() {\n eventBuffer = {};\n dataLines = [];\n },\n transform(line, controller) {\n if (line.startsWith(\":\")) return;\n\n if (line === \"\") {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n eventBuffer = {};\n dataLines = [];\n return;\n }\n\n const [field, ...rest] = line.split(\":\");\n const value = rest.join(\":\").trimStart();\n\n switch (field) {\n case \"event\":\n eventBuffer.event = value;\n break;\n case \"data\":\n dataLines.push(value);\n break;\n case \"id\":\n eventBuffer.id = value;\n break;\n case \"retry\":\n eventBuffer.retry = Number(value);\n break;\n }\n },\n flush(controller) {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n },\n });\n }\n}\n\nconst isDataChunk = (\n chunk: UIMessageStreamChunk,\n): chunk is UIMessageStreamDataChunk => chunk.type.startsWith(\"data-\");\n\n/**\n * Decodes AI SDK v6 UI Message Stream format into AssistantStreamChunks.\n */\nexport class UIMessageStreamDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor(options: UIMessageStreamDecoderOptions = {}) {\n super((readable) => {\n const toolCallControllers = new Map<string, ToolCallStreamController>();\n let activeToolCallArgsText: TextStreamController | undefined;\n let currentMessageId: string | undefined;\n let receivedDone = false;\n\n const transform = new AssistantTransformStream<UIMessageStreamChunk>({\n transform(chunk, controller) {\n const type = chunk.type;\n\n if (isDataChunk(chunk)) {\n const name = chunk.type.slice(5);\n\n if (options.onData) {\n options.onData({\n type: chunk.type,\n name,\n data: chunk.data,\n ...(chunk.transient !== undefined && {\n transient: chunk.transient,\n }),\n });\n }\n\n if (!chunk.transient) {\n controller.enqueue({\n type: \"data\",\n path: [],\n data: [{ name, data: chunk.data }],\n });\n }\n return;\n }\n\n switch (type) {\n case \"start\":\n currentMessageId = chunk.messageId;\n controller.enqueue({\n type: \"step-start\",\n path: [],\n messageId: chunk.messageId,\n });\n break;\n\n case \"text-start\":\n case \"text-end\":\n case \"reasoning-start\":\n case \"reasoning-end\":\n break;\n\n case \"text-delta\":\n controller.appendText(chunk.textDelta);\n break;\n\n case \"reasoning-delta\":\n controller.appendReasoning(chunk.delta);\n break;\n\n case \"source\":\n controller.appendSource({\n type: \"source\",\n sourceType: chunk.source.sourceType,\n id: chunk.source.id,\n url: chunk.source.url,\n ...(chunk.source.title && { title: chunk.source.title }),\n });\n break;\n\n case \"file\":\n controller.appendFile({\n type: \"file\",\n mimeType: chunk.file.mimeType,\n data: chunk.file.data,\n });\n break;\n\n case \"tool-call-start\": {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n\n if (toolCallControllers.has(chunk.toolCallId)) {\n throw new Error(\n `Encountered duplicate tool call id: ${chunk.toolCallId}`,\n );\n }\n\n const toolCallController = controller.addToolCallPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n });\n toolCallControllers.set(chunk.toolCallId, toolCallController);\n activeToolCallArgsText = toolCallController.argsText;\n break;\n }\n\n case \"tool-call-delta\":\n activeToolCallArgsText?.append(chunk.argsText);\n break;\n\n case \"tool-call-end\":\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n break;\n\n case \"tool-result\": {\n const toolCallController = toolCallControllers.get(\n chunk.toolCallId,\n );\n if (!toolCallController) {\n throw new Error(\n `Encountered tool result with unknown id: ${chunk.toolCallId}`,\n );\n }\n toolCallController.setResponse({\n result: chunk.result,\n isError: chunk.isError ?? false,\n ...(chunk.messages !== undefined\n ? { messages: chunk.messages }\n : {}),\n });\n break;\n }\n\n case \"start-step\":\n controller.enqueue({\n type: \"step-start\",\n path: [],\n messageId: chunk.messageId ?? currentMessageId ?? generateId(),\n });\n break;\n\n case \"finish-step\":\n controller.enqueue({\n type: \"step-finish\",\n path: [],\n finishReason: chunk.finishReason,\n usage: chunk.usage,\n isContinued: chunk.isContinued,\n });\n break;\n\n case \"finish\":\n controller.enqueue({\n type: \"message-finish\",\n path: [],\n finishReason: chunk.finishReason,\n usage: chunk.usage,\n });\n break;\n\n case \"error\":\n controller.enqueue({\n type: \"error\",\n path: [],\n error: chunk.errorText,\n });\n break;\n\n default:\n // ignore unknown types for forward compatibility\n break;\n }\n },\n flush() {\n activeToolCallArgsText?.close();\n // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return\n toolCallControllers.forEach((ctrl) => ctrl.close());\n toolCallControllers.clear();\n },\n });\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new SSEEventStream())\n .pipeThrough(\n new TransformStream<SSEEvent, UIMessageStreamChunk>({\n transform(event, controller) {\n if (event.event !== \"message\") {\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n\n if (event.data === \"[DONE]\") {\n receivedDone = true;\n controller.terminate();\n return;\n }\n\n controller.enqueue(JSON.parse(event.data));\n },\n flush() {\n if (!receivedDone) {\n throw new Error(\n \"Stream ended abruptly without receiving [DONE] marker\",\n );\n }\n },\n }),\n )\n .pipeThrough(transform);\n });\n }\n}\n"],"mappings":"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"}
@@ -1,79 +1,82 @@
1
- import type { ReadonlyJSONValue } from "../../../utils/json/json-value.js";
1
+ import { ReadonlyJSONValue } from "../../../utils/json/json-value.js";
2
+
3
+ //#region src/core/serialization/ui-message-stream/chunk-types.d.ts
2
4
  type FinishReason = "stop" | "length" | "content-filter" | "tool-calls" | "error" | "other" | "unknown";
3
5
  type Usage = {
4
- inputTokens: number;
5
- outputTokens: number;
6
+ inputTokens: number;
7
+ outputTokens: number;
6
8
  };
7
- export type UIMessageStreamChunk = {
8
- type: "start";
9
- messageId: string;
9
+ type UIMessageStreamChunk = {
10
+ type: "start";
11
+ messageId: string;
10
12
  } | {
11
- type: "text-start";
12
- id: string;
13
- } | {
14
- type: "text-delta";
15
- textDelta: string;
16
- } | {
17
- type: "text-end";
13
+ type: "text-start";
14
+ id: string;
18
15
  } | {
19
- type: "reasoning-start";
20
- id: string;
16
+ type: "text-delta";
17
+ textDelta: string;
21
18
  } | {
22
- type: "reasoning-delta";
23
- delta: string;
19
+ type: "text-end";
24
20
  } | {
25
- type: "reasoning-end";
21
+ type: "reasoning-start";
22
+ id: string;
26
23
  } | {
27
- type: "source";
28
- source: {
29
- sourceType: "url";
30
- id: string;
31
- url: string;
32
- title?: string;
33
- };
24
+ type: "reasoning-delta";
25
+ delta: string;
34
26
  } | {
35
- type: "file";
36
- file: {
37
- mimeType: string;
38
- data: string;
39
- };
27
+ type: "reasoning-end";
40
28
  } | {
41
- type: "tool-call-start";
29
+ type: "source";
30
+ source: {
31
+ sourceType: "url";
42
32
  id: string;
43
- toolCallId: string;
44
- toolName: string;
45
- } | {
46
- type: "tool-call-delta";
47
- argsText: string;
48
- } | {
49
- type: "tool-call-end";
50
- } | {
51
- type: "tool-result";
52
- toolCallId: string;
53
- result: ReadonlyJSONValue;
54
- isError?: boolean;
55
- messages?: ReadonlyJSONValue;
56
- } | {
57
- type: "start-step";
58
- messageId?: string;
59
- } | {
60
- type: "finish-step";
61
- finishReason: FinishReason;
62
- usage: Usage;
63
- isContinued: boolean;
64
- } | {
65
- type: "finish";
66
- finishReason: FinishReason;
67
- usage: Usage;
68
- } | {
69
- type: "error";
70
- errorText: string;
33
+ url: string;
34
+ title?: string;
35
+ };
36
+ } | {
37
+ type: "file";
38
+ file: {
39
+ mimeType: string;
40
+ data: string;
41
+ };
42
+ } | {
43
+ type: "tool-call-start";
44
+ id: string;
45
+ toolCallId: string;
46
+ toolName: string;
47
+ } | {
48
+ type: "tool-call-delta";
49
+ argsText: string;
50
+ } | {
51
+ type: "tool-call-end";
52
+ } | {
53
+ type: "tool-result";
54
+ toolCallId: string;
55
+ result: ReadonlyJSONValue;
56
+ isError?: boolean;
57
+ messages?: ReadonlyJSONValue;
58
+ } | {
59
+ type: "start-step";
60
+ messageId?: string;
61
+ } | {
62
+ type: "finish-step";
63
+ finishReason: FinishReason;
64
+ usage: Usage;
65
+ isContinued: boolean;
66
+ } | {
67
+ type: "finish";
68
+ finishReason: FinishReason;
69
+ usage: Usage;
70
+ } | {
71
+ type: "error";
72
+ errorText: string;
71
73
  } | UIMessageStreamDataChunk;
72
- export type UIMessageStreamDataChunk = {
73
- type: `data-${string}`;
74
- id?: string;
75
- data: ReadonlyJSONValue;
76
- transient?: boolean;
74
+ type UIMessageStreamDataChunk = {
75
+ type: `data-${string}`;
76
+ id?: string;
77
+ data: ReadonlyJSONValue;
78
+ transient?: boolean;
77
79
  };
78
- export {};
80
+ //#endregion
81
+ export { UIMessageStreamChunk, UIMessageStreamDataChunk };
79
82
  //# sourceMappingURL=chunk-types.d.ts.map