assistant-stream 0.1.8 → 0.2.1

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 (201) hide show
  1. package/ai-sdk/package.json +2 -2
  2. package/dist/ai-sdk/index.js +7 -34
  3. package/dist/ai-sdk/index.js.map +1 -1
  4. package/dist/ai-sdk/language-model.js +5 -31
  5. package/dist/ai-sdk/language-model.js.map +1 -1
  6. package/dist/ai-sdk.js +4 -32
  7. package/dist/ai-sdk.js.map +1 -1
  8. package/dist/core/AssistantStream.js +3 -29
  9. package/dist/core/AssistantStream.js.map +1 -1
  10. package/dist/core/AssistantStreamChunk.js +0 -18
  11. package/dist/core/AssistantStreamChunk.js.map +1 -1
  12. package/dist/core/accumulators/AssistantMessageStream.js +9 -35
  13. package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
  14. package/dist/core/accumulators/assistant-message-accumulator.js +22 -48
  15. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
  16. package/dist/core/index.js +16 -46
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/modules/assistant-stream.js +29 -52
  19. package/dist/core/modules/assistant-stream.js.map +1 -1
  20. package/dist/core/modules/text.js +6 -33
  21. package/dist/core/modules/text.js.map +1 -1
  22. package/dist/core/modules/tool-call.js +8 -35
  23. package/dist/core/modules/tool-call.js.map +1 -1
  24. package/dist/core/serialization/PlainText.js +9 -36
  25. package/dist/core/serialization/PlainText.js.map +1 -1
  26. package/dist/core/serialization/data-stream/DataStream.js +57 -79
  27. package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
  28. package/dist/core/serialization/data-stream/chunk-types.js +2 -28
  29. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
  30. package/dist/core/serialization/data-stream/serialization.js +6 -33
  31. package/dist/core/serialization/data-stream/serialization.js.map +1 -1
  32. package/dist/core/tool/ToolCallReader.js +30 -55
  33. package/dist/core/tool/ToolCallReader.js.map +1 -1
  34. package/dist/core/tool/ToolExecutionStream.js +18 -52
  35. package/dist/core/tool/ToolExecutionStream.js.map +1 -1
  36. package/dist/core/tool/ToolResponse.js +5 -31
  37. package/dist/core/tool/ToolResponse.js.map +1 -1
  38. package/dist/core/tool/index.js +9 -35
  39. package/dist/core/tool/index.js.map +1 -1
  40. package/dist/core/tool/tool-types.js +0 -18
  41. package/dist/core/tool/tool-types.js.map +1 -1
  42. package/dist/core/tool/toolResultStream.js +8 -35
  43. package/dist/core/tool/toolResultStream.js.map +1 -1
  44. package/dist/core/tool/type-path-utils.js +0 -18
  45. package/dist/core/tool/type-path-utils.js.map +1 -1
  46. package/dist/core/utils/Counter.js +4 -30
  47. package/dist/core/utils/Counter.js.map +1 -1
  48. package/dist/core/utils/generateId.js +4 -30
  49. package/dist/core/utils/generateId.js.map +1 -1
  50. package/dist/core/utils/stream/AssistantMetaTransformStream.js +4 -30
  51. package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
  52. package/dist/core/utils/stream/AssistantTransformStream.js +8 -32
  53. package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
  54. package/dist/core/utils/stream/LineDecoderStream.js +4 -30
  55. package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
  56. package/dist/core/utils/stream/PipeableTransformStream.js +4 -30
  57. package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
  58. package/dist/core/utils/stream/UnderlyingReadable.js +0 -18
  59. package/dist/core/utils/stream/UnderlyingReadable.js.map +1 -1
  60. package/dist/core/utils/stream/merge.js +5 -31
  61. package/dist/core/utils/stream/merge.js.map +1 -1
  62. package/dist/core/utils/stream/path-utils.js +10 -38
  63. package/dist/core/utils/stream/path-utils.js.map +1 -1
  64. package/dist/core/utils/types.js +0 -18
  65. package/dist/core/utils/types.js.map +1 -1
  66. package/dist/core/utils/withPromiseOrValue.js +2 -28
  67. package/dist/core/utils/withPromiseOrValue.js.map +1 -1
  68. package/dist/index.js +1 -24
  69. package/dist/index.js.map +1 -1
  70. package/dist/utils/AsyncIterableStream.js +2 -28
  71. package/dist/utils/AsyncIterableStream.js.map +1 -1
  72. package/dist/utils/json/fix-json.js +2 -28
  73. package/dist/utils/json/fix-json.js.map +1 -1
  74. package/dist/utils/json/is-json.js +2 -30
  75. package/dist/utils/json/is-json.js.map +1 -1
  76. package/dist/utils/json/json-value.js +0 -18
  77. package/dist/utils/json/json-value.js.map +1 -1
  78. package/dist/utils/json/parse-partial-json-object.js +12 -50
  79. package/dist/utils/json/parse-partial-json-object.js.map +1 -1
  80. package/dist/utils/promiseWithResolvers.js +3 -29
  81. package/dist/utils/promiseWithResolvers.js.map +1 -1
  82. package/dist/utils.js +9 -32
  83. package/dist/utils.js.map +1 -1
  84. package/package.json +7 -9
  85. package/{dist/ai-sdk/index.mjs → src/ai-sdk/index.ts} +64 -33
  86. package/{dist/ai-sdk/language-model.mjs → src/ai-sdk/language-model.ts} +35 -19
  87. package/src/ai-sdk.ts +2 -0
  88. package/src/core/AssistantStream.ts +39 -0
  89. package/src/core/AssistantStreamChunk.ts +93 -0
  90. package/src/core/accumulators/AssistantMessageStream.ts +56 -0
  91. package/{dist/core/accumulators/assistant-message-accumulator.mjs → src/core/accumulators/assistant-message-accumulator.ts} +152 -67
  92. package/src/core/index.ts +17 -0
  93. package/{dist/core/modules/assistant-stream.mjs → src/core/modules/assistant-stream.ts} +122 -60
  94. package/src/core/modules/text.ts +64 -0
  95. package/{dist/core/modules/tool-call.mjs → src/core/modules/tool-call.ts} +48 -27
  96. package/src/core/serialization/PlainText.ts +68 -0
  97. package/{dist/core/serialization/data-stream/DataStream.mjs → src/core/serialization/data-stream/DataStream.ts} +111 -67
  98. package/src/core/serialization/data-stream/chunk-types.ts +93 -0
  99. package/src/core/serialization/data-stream/serialization.ts +32 -0
  100. package/src/core/tool/ToolCallReader.ts +432 -0
  101. package/{dist/core/tool/ToolExecutionStream.mjs → src/core/tool/ToolExecutionStream.ts} +83 -35
  102. package/src/core/tool/ToolResponse.ts +31 -0
  103. package/src/core/tool/index.ts +8 -0
  104. package/src/core/tool/tool-types.ts +107 -0
  105. package/src/core/tool/toolResultStream.ts +119 -0
  106. package/src/core/tool/type-path-utils.ts +36 -0
  107. package/src/core/utils/Counter.ts +7 -0
  108. package/src/core/utils/generateId.tsx +6 -0
  109. package/src/core/utils/stream/AssistantMetaTransformStream.ts +74 -0
  110. package/src/core/utils/stream/AssistantTransformStream.ts +74 -0
  111. package/{dist/core/utils/stream/LineDecoderStream.mjs → src/core/utils/stream/LineDecoderStream.ts} +12 -10
  112. package/src/core/utils/stream/PipeableTransformStream.ts +10 -0
  113. package/src/core/utils/stream/UnderlyingReadable.ts +5 -0
  114. package/src/core/utils/stream/merge.ts +212 -0
  115. package/src/core/utils/stream/path-utils.ts +71 -0
  116. package/src/core/utils/types.ts +150 -0
  117. package/src/core/utils/withPromiseOrValue.ts +20 -0
  118. package/src/index.ts +1 -0
  119. package/src/utils/AsyncIterableStream.ts +24 -0
  120. package/{dist/utils/json/fix-json.mjs → src/utils/json/fix-json.ts} +146 -20
  121. package/src/utils/json/is-json.ts +43 -0
  122. package/src/utils/json/json-value.ts +13 -0
  123. package/src/utils/json/parse-partial-json-object.test.ts +225 -0
  124. package/src/utils/json/parse-partial-json-object.ts +103 -0
  125. package/src/utils/promiseWithResolvers.ts +10 -0
  126. package/src/utils.ts +13 -0
  127. package/dist/ai-sdk/index.mjs.map +0 -1
  128. package/dist/ai-sdk/language-model.mjs.map +0 -1
  129. package/dist/ai-sdk.mjs +0 -7
  130. package/dist/ai-sdk.mjs.map +0 -1
  131. package/dist/core/AssistantStream.mjs +0 -21
  132. package/dist/core/AssistantStream.mjs.map +0 -1
  133. package/dist/core/AssistantStreamChunk.mjs +0 -1
  134. package/dist/core/AssistantStreamChunk.mjs.map +0 -1
  135. package/dist/core/accumulators/AssistantMessageStream.mjs +0 -54
  136. package/dist/core/accumulators/AssistantMessageStream.mjs.map +0 -1
  137. package/dist/core/accumulators/assistant-message-accumulator.mjs.map +0 -1
  138. package/dist/core/index.mjs +0 -26
  139. package/dist/core/index.mjs.map +0 -1
  140. package/dist/core/modules/assistant-stream.mjs.map +0 -1
  141. package/dist/core/modules/text.mjs +0 -52
  142. package/dist/core/modules/text.mjs.map +0 -1
  143. package/dist/core/modules/tool-call.mjs.map +0 -1
  144. package/dist/core/serialization/PlainText.mjs +0 -44
  145. package/dist/core/serialization/PlainText.mjs.map +0 -1
  146. package/dist/core/serialization/data-stream/DataStream.mjs.map +0 -1
  147. package/dist/core/serialization/data-stream/chunk-types.mjs +0 -24
  148. package/dist/core/serialization/data-stream/chunk-types.mjs.map +0 -1
  149. package/dist/core/serialization/data-stream/serialization.mjs +0 -30
  150. package/dist/core/serialization/data-stream/serialization.mjs.map +0 -1
  151. package/dist/core/tool/ToolCallReader.mjs +0 -315
  152. package/dist/core/tool/ToolCallReader.mjs.map +0 -1
  153. package/dist/core/tool/ToolExecutionStream.mjs.map +0 -1
  154. package/dist/core/tool/ToolResponse.mjs +0 -22
  155. package/dist/core/tool/ToolResponse.mjs.map +0 -1
  156. package/dist/core/tool/index.mjs +0 -14
  157. package/dist/core/tool/index.mjs.map +0 -1
  158. package/dist/core/tool/tool-types.mjs +0 -1
  159. package/dist/core/tool/tool-types.mjs.map +0 -1
  160. package/dist/core/tool/toolResultStream.mjs +0 -78
  161. package/dist/core/tool/toolResultStream.mjs.map +0 -1
  162. package/dist/core/tool/type-path-utils.mjs +0 -1
  163. package/dist/core/tool/type-path-utils.mjs.map +0 -1
  164. package/dist/core/utils/Counter.mjs +0 -11
  165. package/dist/core/utils/Counter.mjs.map +0 -1
  166. package/dist/core/utils/generateId.mjs +0 -10
  167. package/dist/core/utils/generateId.mjs.map +0 -1
  168. package/dist/core/utils/stream/AssistantMetaTransformStream.mjs +0 -44
  169. package/dist/core/utils/stream/AssistantMetaTransformStream.mjs.map +0 -1
  170. package/dist/core/utils/stream/AssistantTransformStream.mjs +0 -46
  171. package/dist/core/utils/stream/AssistantTransformStream.mjs.map +0 -1
  172. package/dist/core/utils/stream/LineDecoderStream.mjs.map +0 -1
  173. package/dist/core/utils/stream/PipeableTransformStream.mjs +0 -15
  174. package/dist/core/utils/stream/PipeableTransformStream.mjs.map +0 -1
  175. package/dist/core/utils/stream/UnderlyingReadable.mjs +0 -1
  176. package/dist/core/utils/stream/UnderlyingReadable.mjs.map +0 -1
  177. package/dist/core/utils/stream/merge.mjs +0 -85
  178. package/dist/core/utils/stream/merge.mjs.map +0 -1
  179. package/dist/core/utils/stream/path-utils.mjs +0 -61
  180. package/dist/core/utils/stream/path-utils.mjs.map +0 -1
  181. package/dist/core/utils/types.mjs +0 -1
  182. package/dist/core/utils/types.mjs.map +0 -1
  183. package/dist/core/utils/withPromiseOrValue.mjs +0 -17
  184. package/dist/core/utils/withPromiseOrValue.mjs.map +0 -1
  185. package/dist/index.mjs +0 -3
  186. package/dist/index.mjs.map +0 -1
  187. package/dist/utils/AsyncIterableStream.mjs +0 -21
  188. package/dist/utils/AsyncIterableStream.mjs.map +0 -1
  189. package/dist/utils/json/fix-json.mjs.map +0 -1
  190. package/dist/utils/json/is-json.mjs +0 -29
  191. package/dist/utils/json/is-json.mjs.map +0 -1
  192. package/dist/utils/json/json-value.mjs +0 -1
  193. package/dist/utils/json/json-value.mjs.map +0 -1
  194. package/dist/utils/json/parse-partial-json-object.mjs +0 -65
  195. package/dist/utils/json/parse-partial-json-object.mjs.map +0 -1
  196. package/dist/utils/promiseWithResolvers.mjs +0 -15
  197. package/dist/utils/promiseWithResolvers.mjs.map +0 -1
  198. package/dist/utils.mjs +0 -14
  199. package/dist/utils.mjs.map +0 -1
  200. package/utils/README.md +0 -1
  201. package/utils/package.json +0 -5
@@ -1,141 +1,201 @@
1
- // src/core/modules/assistant-stream.ts
2
- import { AssistantStream } from "../AssistantStream.mjs";
3
- import { createMergeStream } from "../utils/stream/merge.mjs";
4
- import { createTextStreamController } from "./text.mjs";
1
+ import { AssistantStream } from "../AssistantStream";
2
+ import { AssistantStreamChunk, PartInit } from "../AssistantStreamChunk";
3
+ import { createMergeStream } from "../utils/stream/merge";
4
+ import { createTextStreamController, TextStreamController } from "./text";
5
5
  import {
6
- createToolCallStreamController
7
- } from "./tool-call.mjs";
8
- import { Counter } from "../utils/Counter.mjs";
6
+ createToolCallStreamController,
7
+ ToolCallStreamController,
8
+ } from "./tool-call";
9
+ import { Counter } from "../utils/Counter";
9
10
  import {
10
11
  PathAppendEncoder,
11
- PathMergeEncoder
12
- } from "../utils/stream/path-utils.mjs";
13
- import { DataStreamEncoder } from "../serialization/data-stream/DataStream.mjs";
14
- import { generateId } from "../utils/generateId.mjs";
15
- import { promiseWithResolvers } from "../../utils/promiseWithResolvers.mjs";
16
- var AssistantStreamControllerImpl = class {
17
- _merger = createMergeStream();
18
- _append;
19
- _contentCounter = new Counter();
12
+ PathMergeEncoder,
13
+ } from "../utils/stream/path-utils";
14
+ import { DataStreamEncoder } from "../serialization/data-stream/DataStream";
15
+ import { FilePart, SourcePart } from "../utils/types";
16
+ import { generateId } from "../utils/generateId";
17
+ import {
18
+ ReadonlyJSONObject,
19
+ ReadonlyJSONValue,
20
+ } from "../../utils/json/json-value";
21
+ import { ToolResponseInit } from "../tool/ToolResponse";
22
+ import { promiseWithResolvers } from "../../utils/promiseWithResolvers";
23
+
24
+ type ToolCallPartInit = {
25
+ toolCallId?: string;
26
+ toolName: string;
27
+ argsText?: string;
28
+ args?: ReadonlyJSONObject;
29
+ response?: ToolResponseInit<ReadonlyJSONValue>;
30
+ };
31
+
32
+ export type AssistantStreamController = {
33
+ appendText(textDelta: string): void;
34
+ appendReasoning(reasoningDelta: string): void;
35
+ appendSource(options: SourcePart): void;
36
+ appendFile(options: FilePart): void;
37
+ addTextPart(): TextStreamController;
38
+ addToolCallPart(options: string): ToolCallStreamController;
39
+ addToolCallPart(options: ToolCallPartInit): ToolCallStreamController;
40
+ enqueue(chunk: AssistantStreamChunk): void;
41
+ merge(stream: AssistantStream): void;
42
+ close(): void;
43
+ };
44
+
45
+ class AssistantStreamControllerImpl implements AssistantStreamController {
46
+ private _merger = createMergeStream();
47
+ private _append:
48
+ | {
49
+ controller: TextStreamController;
50
+ kind: "text" | "reasoning";
51
+ }
52
+ | undefined;
53
+ private _contentCounter = new Counter();
54
+
20
55
  get __internal_isClosed() {
21
56
  return this._merger.isSealed();
22
57
  }
58
+
23
59
  __internal_getReadable() {
24
60
  return this._merger.readable;
25
61
  }
26
- _closeSubscriber;
27
- __internal_subscribeToClose(callback) {
62
+
63
+ private _closeSubscriber: undefined | (() => void);
64
+ __internal_subscribeToClose(callback: () => void) {
28
65
  this._closeSubscriber = callback;
29
66
  }
30
- _addPart(part, stream) {
67
+
68
+ private _addPart(part: PartInit, stream: AssistantStream) {
31
69
  if (this._append) {
32
70
  this._append.controller.close();
33
- this._append = void 0;
71
+ this._append = undefined;
34
72
  }
73
+
35
74
  this.enqueue({
36
75
  type: "part-start",
37
76
  part,
38
- path: []
77
+ path: [],
39
78
  });
40
79
  this._merger.addStream(
41
- stream.pipeThrough(new PathAppendEncoder(this._contentCounter.value))
80
+ stream.pipeThrough(new PathAppendEncoder(this._contentCounter.value)),
42
81
  );
43
82
  }
44
- merge(stream) {
83
+
84
+ merge(stream: AssistantStream) {
45
85
  this._merger.addStream(
46
- stream.pipeThrough(new PathMergeEncoder(this._contentCounter))
86
+ stream.pipeThrough(new PathMergeEncoder(this._contentCounter)),
47
87
  );
48
88
  }
49
- appendText(textDelta) {
89
+
90
+ appendText(textDelta: string) {
50
91
  if (this._append?.kind !== "text") {
51
92
  this._append = {
52
93
  kind: "text",
53
- controller: this.addTextPart()
94
+ controller: this.addTextPart(),
54
95
  };
55
96
  }
56
97
  this._append.controller.append(textDelta);
57
98
  }
58
- appendReasoning(textDelta) {
99
+
100
+ appendReasoning(textDelta: string) {
59
101
  if (this._append?.kind !== "reasoning") {
60
102
  this._append = {
61
103
  kind: "reasoning",
62
- controller: this.addReasoningPart()
104
+ controller: this.addReasoningPart(),
63
105
  };
64
106
  }
65
107
  this._append.controller.append(textDelta);
66
108
  }
109
+
67
110
  addTextPart() {
68
111
  const [stream, controller] = createTextStreamController();
69
112
  this._addPart({ type: "text" }, stream);
70
113
  return controller;
71
114
  }
115
+
72
116
  addReasoningPart() {
73
117
  const [stream, controller] = createTextStreamController();
74
118
  this._addPart({ type: "reasoning" }, stream);
75
119
  return controller;
76
120
  }
77
- addToolCallPart(options) {
121
+
122
+ addToolCallPart(
123
+ options: string | ToolCallPartInit,
124
+ ): ToolCallStreamController {
78
125
  const opt = typeof options === "string" ? { toolName: options } : options;
79
126
  const toolName = opt.toolName;
80
127
  const toolCallId = opt.toolCallId ?? generateId();
128
+
81
129
  const [stream, controller] = createToolCallStreamController();
82
130
  this._addPart({ type: "tool-call", toolName, toolCallId }, stream);
83
- if (opt.argsText !== void 0) {
131
+
132
+ if (opt.argsText !== undefined) {
84
133
  controller.argsText.append(opt.argsText);
85
134
  controller.argsText.close();
86
135
  }
87
- if (opt.args !== void 0) {
136
+ if (opt.args !== undefined) {
88
137
  controller.argsText.append(JSON.stringify(opt.args));
89
138
  controller.argsText.close();
90
139
  }
91
- if (opt.response !== void 0) {
140
+ if (opt.response !== undefined) {
92
141
  controller.setResponse(opt.response);
93
142
  }
143
+
94
144
  return controller;
95
145
  }
96
- appendSource(options) {
146
+
147
+ appendSource(options: SourcePart) {
97
148
  this._addPart(
98
149
  options,
99
150
  new ReadableStream({
100
151
  start(controller) {
101
152
  controller.enqueue({
102
153
  type: "part-finish",
103
- path: []
154
+ path: [],
104
155
  });
105
156
  controller.close();
106
- }
107
- })
157
+ },
158
+ }),
108
159
  );
109
160
  }
110
- appendFile(options) {
161
+
162
+ appendFile(options: FilePart) {
111
163
  this._addPart(
112
164
  options,
113
165
  new ReadableStream({
114
166
  start(controller) {
115
167
  controller.enqueue({
116
168
  type: "part-finish",
117
- path: []
169
+ path: [],
118
170
  });
119
171
  controller.close();
120
- }
121
- })
172
+ },
173
+ }),
122
174
  );
123
175
  }
124
- enqueue(chunk) {
176
+
177
+ enqueue(chunk: AssistantStreamChunk) {
125
178
  this._merger.enqueue(chunk);
179
+
126
180
  if (chunk.type === "part-start" && chunk.path.length === 0) {
127
181
  this._contentCounter.up();
128
182
  }
129
183
  }
184
+
130
185
  close() {
131
186
  this._merger.seal();
132
187
  this._append?.controller?.close();
188
+
133
189
  this._closeSubscriber?.();
134
190
  }
135
- };
136
- function createAssistantStream(callback) {
191
+ }
192
+
193
+ export function createAssistantStream(
194
+ callback: (controller: AssistantStreamController) => PromiseLike<void> | void,
195
+ ): AssistantStream {
137
196
  const controller = new AssistantStreamControllerImpl();
138
- let promiseOrVoid;
197
+
198
+ let promiseOrVoid: PromiseLike<void> | void;
139
199
  try {
140
200
  promiseOrVoid = callback(controller);
141
201
  } catch (e) {
@@ -143,12 +203,13 @@ function createAssistantStream(callback) {
143
203
  controller.enqueue({
144
204
  type: "error",
145
205
  path: [],
146
- error: String(e)
206
+ error: String(e),
147
207
  });
148
208
  controller.close();
149
209
  }
150
210
  throw e;
151
211
  }
212
+
152
213
  if (promiseOrVoid instanceof Promise) {
153
214
  const runTask = async () => {
154
215
  try {
@@ -158,7 +219,7 @@ function createAssistantStream(callback) {
158
219
  controller.enqueue({
159
220
  type: "error",
160
221
  path: [],
161
- error: String(e)
222
+ error: String(e),
162
223
  });
163
224
  }
164
225
  throw e;
@@ -174,29 +235,30 @@ function createAssistantStream(callback) {
174
235
  controller.close();
175
236
  }
176
237
  }
238
+
177
239
  return controller.__internal_getReadable();
178
240
  }
179
- function createAssistantStreamController() {
180
- const { resolve, promise } = promiseWithResolvers();
181
- let controller;
241
+
242
+ export function createAssistantStreamController() {
243
+ const { resolve, promise } = promiseWithResolvers<void>();
244
+ let controller!: AssistantStreamController;
182
245
  const stream = createAssistantStream((c) => {
183
246
  controller = c;
184
- controller.__internal_subscribeToClose(
185
- resolve
247
+
248
+ (controller as AssistantStreamControllerImpl).__internal_subscribeToClose(
249
+ resolve,
186
250
  );
251
+
187
252
  return promise;
188
253
  });
189
- return [stream, controller];
254
+ return [stream, controller] as const;
190
255
  }
191
- function createAssistantStreamResponse(callback) {
256
+
257
+ export function createAssistantStreamResponse(
258
+ callback: (controller: AssistantStreamController) => PromiseLike<void> | void,
259
+ ) {
192
260
  return AssistantStream.toResponse(
193
261
  createAssistantStream(callback),
194
- new DataStreamEncoder()
262
+ new DataStreamEncoder(),
195
263
  );
196
264
  }
197
- export {
198
- createAssistantStream,
199
- createAssistantStreamController,
200
- createAssistantStreamResponse
201
- };
202
- //# sourceMappingURL=assistant-stream.mjs.map
@@ -0,0 +1,64 @@
1
+ import { AssistantStream } from "../AssistantStream";
2
+ import { AssistantStreamChunk } from "../AssistantStreamChunk";
3
+ import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable";
4
+
5
+ export type TextStreamController = {
6
+ append(textDelta: string): void;
7
+ close(): void; // TODO reason? error?
8
+ };
9
+
10
+ class TextStreamControllerImpl implements TextStreamController {
11
+ private _controller: ReadableStreamDefaultController<AssistantStreamChunk>;
12
+ private _isClosed = false;
13
+
14
+ constructor(
15
+ controller: ReadableStreamDefaultController<AssistantStreamChunk>,
16
+ ) {
17
+ this._controller = controller;
18
+ }
19
+
20
+ append(textDelta: string) {
21
+ this._controller.enqueue({
22
+ type: "text-delta",
23
+ path: [],
24
+ textDelta,
25
+ });
26
+ return this;
27
+ }
28
+
29
+ close() {
30
+ if (this._isClosed) return;
31
+ this._isClosed = true;
32
+ this._controller.enqueue({
33
+ type: "part-finish",
34
+ path: [],
35
+ });
36
+ this._controller.close();
37
+ }
38
+ }
39
+
40
+ export const createTextStream = (
41
+ readable: UnderlyingReadable<TextStreamController>,
42
+ ): AssistantStream => {
43
+ return new ReadableStream({
44
+ start(c) {
45
+ return readable.start?.(new TextStreamControllerImpl(c));
46
+ },
47
+ pull(c) {
48
+ return readable.pull?.(new TextStreamControllerImpl(c));
49
+ },
50
+ cancel(c) {
51
+ return readable.cancel?.(c);
52
+ },
53
+ });
54
+ };
55
+
56
+ export const createTextStreamController = () => {
57
+ let controller!: TextStreamController;
58
+ const stream = createTextStream({
59
+ start(c) {
60
+ controller = c;
61
+ },
62
+ });
63
+ return [stream, controller] as const;
64
+ };
@@ -1,12 +1,28 @@
1
- // src/core/modules/tool-call.ts
2
- import { createTextStream } from "./text.mjs";
3
- var ToolCallStreamControllerImpl = class {
4
- constructor(_controller) {
5
- this._controller = _controller;
1
+ import { AssistantStream } from "../AssistantStream";
2
+ import { AssistantStreamChunk } from "../AssistantStreamChunk";
3
+ import { ToolResponseInit } from "../tool/ToolResponse";
4
+ import { ReadonlyJSONValue } from "../../utils/json/json-value";
5
+ import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable";
6
+ import { createTextStream, TextStreamController } from "./text";
7
+
8
+ export type ToolCallStreamController = {
9
+ argsText: TextStreamController;
10
+
11
+ setResponse(response: ToolResponseInit<ReadonlyJSONValue>): void;
12
+ close(): void;
13
+ };
14
+
15
+ class ToolCallStreamControllerImpl implements ToolCallStreamController {
16
+ private _isClosed = false;
17
+
18
+ private _mergeTask: Promise<void>;
19
+ constructor(
20
+ private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,
21
+ ) {
6
22
  const stream = createTextStream({
7
23
  start: (c) => {
8
24
  this._argsTextController = c;
9
- }
25
+ },
10
26
  });
11
27
  this._mergeTask = stream.pipeTo(
12
28
  new WritableStream({
@@ -15,47 +31,56 @@ var ToolCallStreamControllerImpl = class {
15
31
  case "text-delta":
16
32
  this._controller.enqueue(chunk);
17
33
  break;
34
+
18
35
  case "part-finish":
19
36
  this._controller.enqueue({
20
37
  type: "tool-call-args-text-finish",
21
- path: []
38
+ path: [],
22
39
  });
23
40
  break;
41
+
24
42
  default:
25
43
  throw new Error(`Unexpected chunk type: ${chunk.type}`);
26
44
  }
27
- }
28
- })
45
+ },
46
+ }),
29
47
  );
30
48
  }
31
- _isClosed = false;
32
- _mergeTask;
49
+
33
50
  get argsText() {
34
51
  return this._argsTextController;
35
52
  }
36
- _argsTextController;
37
- setResponse(response) {
53
+
54
+ private _argsTextController!: TextStreamController;
55
+
56
+ setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {
38
57
  this._controller.enqueue({
39
58
  type: "result",
40
59
  path: [],
41
60
  artifact: response.artifact,
42
61
  result: response.result,
43
- isError: response.isError ?? false
62
+ isError: response.isError ?? false,
44
63
  });
45
64
  }
65
+
46
66
  async close() {
47
67
  if (this._isClosed) return;
68
+
48
69
  this._isClosed = true;
49
70
  this._argsTextController.close();
50
71
  await this._mergeTask;
72
+
51
73
  this._controller.enqueue({
52
74
  type: "part-finish",
53
- path: []
75
+ path: [],
54
76
  });
55
77
  this._controller.close();
56
78
  }
57
- };
58
- var createToolCallStream = (readable) => {
79
+ }
80
+
81
+ export const createToolCallStream = (
82
+ readable: UnderlyingReadable<ToolCallStreamController>,
83
+ ): AssistantStream => {
59
84
  return new ReadableStream({
60
85
  start(c) {
61
86
  return readable.start?.(new ToolCallStreamControllerImpl(c));
@@ -65,20 +90,16 @@ var createToolCallStream = (readable) => {
65
90
  },
66
91
  cancel(c) {
67
92
  return readable.cancel?.(c);
68
- }
93
+ },
69
94
  });
70
95
  };
71
- var createToolCallStreamController = () => {
72
- let controller;
96
+
97
+ export const createToolCallStreamController = () => {
98
+ let controller!: ToolCallStreamController;
73
99
  const stream = createToolCallStream({
74
100
  start(c) {
75
101
  controller = c;
76
- }
102
+ },
77
103
  });
78
- return [stream, controller];
79
- };
80
- export {
81
- createToolCallStream,
82
- createToolCallStreamController
104
+ return [stream, controller] as const;
83
105
  };
84
- //# sourceMappingURL=tool-call.mjs.map
@@ -0,0 +1,68 @@
1
+ import { AssistantStreamEncoder } from "../AssistantStream";
2
+ import { AssistantStreamChunk } from "../AssistantStreamChunk";
3
+ import { AssistantTransformStream } from "../utils/stream/AssistantTransformStream";
4
+ import { PipeableTransformStream } from "../utils/stream/PipeableTransformStream";
5
+
6
+ export class PlainTextEncoder
7
+ extends PipeableTransformStream<AssistantStreamChunk, Uint8Array>
8
+ implements AssistantStreamEncoder
9
+ {
10
+ headers = new Headers({
11
+ "Content-Type": "text/plain; charset=utf-8",
12
+ "x-vercel-ai-data-stream": "v1",
13
+ });
14
+
15
+ constructor() {
16
+ super((readable) => {
17
+ const transform = new TransformStream<AssistantStreamChunk, string>({
18
+ transform(chunk, controller) {
19
+ const type = chunk.type;
20
+ switch (type) {
21
+ case "text-delta":
22
+ controller.enqueue(chunk.textDelta);
23
+ break;
24
+
25
+ default:
26
+ const unsupportedType:
27
+ | "part-start"
28
+ | "part-finish"
29
+ | "tool-call-args-text-finish"
30
+ | "data"
31
+ | "step-start"
32
+ | "step-finish"
33
+ | "message-finish"
34
+ | "annotations"
35
+ | "tool-call-begin"
36
+ | "tool-call-delta"
37
+ | "result"
38
+ | "error" = type;
39
+ throw new Error(`unsupported chunk type: ${unsupportedType}`);
40
+ }
41
+ },
42
+ });
43
+
44
+ return readable
45
+ .pipeThrough(transform)
46
+ .pipeThrough(new TextEncoderStream());
47
+ });
48
+ }
49
+ }
50
+
51
+ export class PlainTextDecoder extends PipeableTransformStream<
52
+ Uint8Array,
53
+ AssistantStreamChunk
54
+ > {
55
+ constructor() {
56
+ super((readable) => {
57
+ const transform = new AssistantTransformStream<string>({
58
+ transform(chunk, controller) {
59
+ controller.appendText(chunk);
60
+ },
61
+ });
62
+
63
+ return readable
64
+ .pipeThrough(new TextDecoderStream())
65
+ .pipeThrough(transform);
66
+ });
67
+ }
68
+ }